Merge pull request #474 from knocte/master
[mono.git] / mono / io-layer / thread-private.h
index be041492f4bf6da2d4be88fdadeed21f3573d17f..1c62618c8128c69712d301a40e178fcc5af648d0 100644 (file)
 #include <config.h>
 #include <glib.h>
 #include <pthread.h>
-#ifdef HAVE_SEMAPHORE_H
-#include <semaphore.h>
-#endif
-#ifdef USE_MACH_SEMA
-#include <mach/mach_init.h>
-#include <mach/task.h>
-#include <mach/semaphore.h>
-typedef semaphore_t MonoSemType;
-#define MONO_SEM_INIT(addr,value) semaphore_create (current_task (), (addr), SYNC_POLICY_FIFO, (value))
-#define MONO_SEM_WAIT(sem) semaphore_wait (*(sem))
-#define MONO_SEM_POST(sem) semaphore_signal (*(sem))
-#define MONO_SEM_DESTROY(sem) semaphore_destroy (current_task (), *(sem))
-#else
-typedef sem_t MonoSemType;
-#define MONO_SEM_INIT(addr,value) sem_init ((addr), 0, (value))
-#define MONO_SEM_WAIT(sem) sem_wait ((sem))
-#define MONO_SEM_POST(sem) sem_post ((sem))
-#define MONO_SEM_DESTROY(sem) sem_destroy ((sem))
-#endif
+#include <mono/utils/mono-semaphore.h>
 
 /* There doesn't seem to be a defined symbol for this */
 #define _WAPI_THREAD_CURRENT (gpointer)0xFFFFFFFE
@@ -44,21 +26,29 @@ typedef enum {
        THREAD_STATE_EXITED
 } WapiThreadState;
 
+#define INTERRUPTION_REQUESTED_HANDLE (gpointer)0xFFFFFFFE
+
 struct _WapiHandle_thread
 {
-       WapiThreadState state;
        guint32 exitstatus;
-       pid_t owner_pid;
-       gboolean joined;
+       WapiThreadState state : 2;
+       guint joined : 1;
+       guint has_apc : 1;
        guint32 create_flags;
        /* Fields below this point are only valid for the owning process */
        pthread_t id;
        GPtrArray *owned_mutexes;
        gpointer handle;
+       /* 
+     * Handle this thread waits on. If this is INTERRUPTION_REQUESTED_HANDLE,
+        * it means the thread is interrupted by another thread, and shouldn't enter
+        * a wait.
+        * This also acts as a reference for the handle.
+        */
+       gpointer wait_handle;
        MonoSemType suspend_sem;
        guint32 (*start_routine)(gpointer arg);
        gpointer start_arg;
-       GSList *apc_queue;
 };
 
 typedef struct