2001-12-08 19:23:51 +03:00
|
|
|
//
|
|
|
|
// Simple threading API for the Fast Light Tool Kit (FLTK).
|
|
|
|
//
|
2016-01-31 07:33:54 +03:00
|
|
|
// Copyright 1998-2016 by Bill Spitzak and others.
|
2001-12-08 19:23:51 +03:00
|
|
|
//
|
2011-07-19 08:49:30 +04:00
|
|
|
// This library is free software. Distribution and use rights are outlined in
|
|
|
|
// the file "COPYING" which should have been included with this file. If this
|
|
|
|
// file is missing or damaged, see the license at:
|
|
|
|
//
|
2020-07-01 19:03:10 +03:00
|
|
|
// https://www.fltk.org/COPYING.php
|
2001-12-08 19:23:51 +03:00
|
|
|
//
|
2020-07-01 19:03:10 +03:00
|
|
|
// Please see the following page on how to report bugs and issues:
|
2005-04-16 04:13:17 +04:00
|
|
|
//
|
2020-07-01 19:03:10 +03:00
|
|
|
// https://www.fltk.org/bugs.php
|
2001-12-08 19:23:51 +03:00
|
|
|
//
|
|
|
|
|
|
|
|
// Inline classes to provide portable support for threads and mutexes.
|
|
|
|
//
|
|
|
|
// FLTK does not use this (it has an internal mutex implementation
|
|
|
|
// that is used if Fl::lock() is called). This header file's only
|
|
|
|
// purpose is so we can write portable demo programs. It may be useful
|
|
|
|
// or an inspiration to people who want to try writing multithreaded
|
|
|
|
// programs themselves.
|
|
|
|
//
|
|
|
|
// FLTK has no multithreaded support unless the main thread calls Fl::lock().
|
|
|
|
// This main thread is the only thread allowed to call Fl::run() or Fl::wait().
|
|
|
|
// From then on FLTK will be locked except when the main thread is actually
|
|
|
|
// waiting for events from the user. Other threads must call Fl::lock() and
|
|
|
|
// Fl::unlock() to surround calls to FLTK (such as to change widgets or
|
|
|
|
// redraw them).
|
|
|
|
|
|
|
|
#ifndef Threads_H
|
|
|
|
# define Threads_H
|
|
|
|
|
2016-01-31 07:33:54 +03:00
|
|
|
# ifdef HAVE_PTHREAD_H
|
2001-12-08 19:23:51 +03:00
|
|
|
// Use POSIX threading...
|
|
|
|
|
|
|
|
# include <pthread.h>
|
|
|
|
|
|
|
|
typedef pthread_t Fl_Thread;
|
2013-09-21 20:41:23 +04:00
|
|
|
extern "C" {
|
|
|
|
typedef void *(Fl_Thread_Func)(void *);
|
|
|
|
}
|
2001-12-08 19:23:51 +03:00
|
|
|
|
2013-09-21 20:41:23 +04:00
|
|
|
static int fl_create_thread(Fl_Thread& t, Fl_Thread_Func* f, void* p) {
|
2006-01-08 04:31:26 +03:00
|
|
|
return pthread_create((pthread_t*)&t, 0, f, p);
|
2001-12-08 19:23:51 +03:00
|
|
|
}
|
|
|
|
|
2018-02-09 17:39:42 +03:00
|
|
|
# elif defined(_WIN32) && !defined(__WATCOMC__) // Use Windows threading...
|
2001-12-08 19:23:51 +03:00
|
|
|
|
|
|
|
# include <windows.h>
|
|
|
|
# include <process.h>
|
|
|
|
|
|
|
|
typedef unsigned long Fl_Thread;
|
2013-09-21 20:41:23 +04:00
|
|
|
extern "C" {
|
|
|
|
typedef void *(__cdecl Fl_Thread_Func)(void *);
|
|
|
|
}
|
2001-12-08 19:23:51 +03:00
|
|
|
|
2013-09-21 20:41:23 +04:00
|
|
|
static int fl_create_thread(Fl_Thread& t, Fl_Thread_Func* f, void* p) {
|
2001-12-08 19:23:51 +03:00
|
|
|
return t = (Fl_Thread)_beginthread((void( __cdecl * )( void * ))f, 0, p);
|
|
|
|
}
|
|
|
|
|
2004-11-20 06:44:18 +03:00
|
|
|
# elif defined(__WATCOMC__)
|
|
|
|
# include <process.h>
|
|
|
|
|
|
|
|
typedef unsigned long Fl_Thread;
|
2013-09-21 20:41:23 +04:00
|
|
|
extern "C" {
|
|
|
|
typedef void *(__cdecl Fl_Thread_Func)(void *);
|
|
|
|
}
|
2004-11-20 06:44:18 +03:00
|
|
|
|
2013-09-21 20:41:23 +04:00
|
|
|
static int fl_create_thread(Fl_Thread& t, Fl_Thread_Func* f, void* p) {
|
2004-11-20 06:44:18 +03:00
|
|
|
return t = (Fl_Thread)_beginthread((void(* )( void * ))f, 32000, p);
|
|
|
|
}
|
2001-12-15 00:02:24 +03:00
|
|
|
# endif // !HAVE_PTHREAD_H
|
2001-12-08 19:23:51 +03:00
|
|
|
#endif // !Threads_h
|