1 /* thread.h: Locking and threading module definitions
3 Copyright 1998, 1999 Cygnus Solutions.
5 Written by Marco Fuykschot <marco@ddi.nl>
7 This file is part of Cygwin.
9 This software is a copyrighted work licensed under the terms of the
10 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
13 #ifndef _CYGNUS_THREADS_
14 #define _CYGNUS_THREADS_
16 #define LOCK_FD_LIST 1
17 #define LOCK_MEMORY_LIST 2
18 #define LOCK_MMAP_LIST 3
19 #define LOCK_DLL_LIST 4
20 #define LOCK_THREAD_LIST 5
21 #define LOCK_MUTEX_LIST 6
22 #define LOCK_SEM_LIST 7
29 #if defined (_CYG_THREAD_FAILSAFE) && defined (_MT_SAFE)
30 void AssertResourceOwner (int, int);
32 #define AssertResourceOwner(i,ii)
38 #define SetResourceLock(i,n,c)
39 #define ReleaseResourceLock(i,n,c)
55 Needed for the group functions
64 char _my_title_buf[TITLESIZE + 1];
73 char _pass[_PASSWORD_LEN];
78 char *_current_directory_name;
79 char *_current_directory_posix_name;
80 unsigned long _current_directory_hash;
84 char _strerror_buf[20];
95 int _process_facility;
100 struct tm _localtime_buf;
105 char _username[MAX_USER_NAME];
111 struct _reent *_clib;
112 struct _winsup_t *_winsup;
115 _reent *_reent_clib ();
116 _winsup_t *_reent_winsup ();
117 void SetResourceLock (int, int, const char *);
118 void ReleaseResourceLock (int, int, const char *);
120 #ifdef _CYG_THREAD_FAILSAFE
121 void AssertResourceOwner (int, int);
123 #define AssertResourceOwner(i,ii)
133 ResourceLocks ():inited (false) {};
134 LPCRITICAL_SECTION Lock (int);
137 #ifdef _CYG_THREAD_FAILSAFE
142 CRITICAL_SECTION lock;
147 #define MT_MAX_ITEMS 128
149 // thread classes\lists
157 char joinable; // for thread only
158 bool HandleOke () {return win32_obj_id;};
159 virtual void Destroy ();
160 virtual int Id () {return (int) win32_obj_id;};
163 class ThreadItem:public MTitem
172 DWORD GetThreadId () {return thread_id;};
174 /* signal handling */
175 struct sigaction *sigs;
180 class MutexItem:public MTitem
188 class SemaphoreItem:public MTitem
200 MTitem *items[MT_MAX_ITEMS];
212 // Used for main thread data, and sigproc thread
213 struct __reent_t reents;
214 struct _winsup_t winsup_reent;
215 ThreadItem mainthread;
221 void ReleaseItem (MTitem *);
224 ThreadItem *CreateThread (pthread_t *, TFD (func), void *, pthread_attr_t);
225 ThreadItem *GetCallingThread ();
226 ThreadItem *GetThread (pthread_t *);
229 MutexItem *CreateMutex (pthread_mutex_t *);
230 MutexItem *GetMutex (pthread_mutex_t *);
232 // Semaphore functions
233 SemaphoreItem *CreateSemaphore (sem_t *, int, int);
234 SemaphoreItem *GetSemaphore (sem_t * t);
237 // General Administration
238 MTitem * Find (void *, int (*compare) (void *, void *), int &, MTList *);
239 MTitem *GetItem (int, MTList *);
240 MTitem *SetItem (int, MTitem *, MTList *);
241 int Find (MTitem &, MTList *);
242 int FindNextUnused (MTList *);
253 void *thread_init_wrapper (void *);
256 int __pthread_create (pthread_t * thread, const pthread_attr_t * attr, TFD (start_routine), void *arg);
257 int __pthread_attr_init (pthread_attr_t * attr);
258 int __pthread_attr_destroy (pthread_attr_t * attr);
259 int __pthread_attr_setstacksize (pthread_attr_t * attr, size_t size);
260 int __pthread_attr_getstacksize (pthread_attr_t * attr, size_t * size);
262 __pthread_attr_setstackaddr(...);
263 __pthread_attr_getstackaddr(...);
267 int __pthread_exit (void *value_ptr);
268 int __pthread_join(pthread_t *thread, void **return_val);
269 int __pthread_detach(pthread_t *thread);
273 int __pthread_suspend(pthread_t *thread);
274 int __pthread_continue(pthread_t *thread);
276 unsigned long __pthread_getsequence_np (pthread_t * thread);
278 /* Thread SpecificData */
279 int __pthread_key_create (pthread_key_t * key);
280 int __pthread_key_delete (pthread_key_t * key);
281 int __pthread_setspecific (pthread_key_t * key, const void *value);
282 void *__pthread_getspecific (pthread_key_t * key);
286 int __pthread_kill (pthread_t * thread, int sig);
287 int __pthread_sigmask (int operation, const sigset_t * set, sigset_t * old_set);
290 pthread_t __pthread_self ();
291 int __pthread_equal (pthread_t * t1, pthread_t * t2);
295 int __pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
296 int __pthread_mutex_lock (pthread_mutex_t *);
297 int __pthread_mutex_trylock (pthread_mutex_t *);
298 int __pthread_mutex_unlock (pthread_mutex_t *);
299 int __pthread_mutex_destroy (pthread_mutex_t *);
302 int __sem_init (sem_t * sem, int pshared, unsigned int value);
303 int __sem_destroy (sem_t * sem);
304 int __sem_wait (sem_t * sem);
305 int __sem_trywait (sem_t * sem);
306 int __sem_post (sem_t * sem);
312 #endif // _CYGNUS_THREADS_