2008-12-08 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mono / io-layer / wapi-private.h
index ed0fb9902111db2eaebed0398a1447261906c310..54306baedda48628288bd27b65433c652becc147 100644 (file)
@@ -4,7 +4,7 @@
  * Author:
  *     Dick Porter (dick@ximian.com)
  *
- * (C) 2002 Ximian, Inc.
+ * (C) 2002-2006 Novell, Inc.
  */
 
 #ifndef _WAPI_PRIVATE_H_
@@ -24,7 +24,7 @@
 /* Increment this whenever an incompatible change is made to the
  * shared handle structure.
  */
-#define _WAPI_HANDLE_VERSION 8
+#define _WAPI_HANDLE_VERSION 12
 
 typedef enum {
        WAPI_HANDLE_UNUSED=0,
@@ -39,21 +39,26 @@ typedef enum {
        WAPI_HANDLE_PROCESS,
        WAPI_HANDLE_PIPE,
        WAPI_HANDLE_NAMEDMUTEX,
+       WAPI_HANDLE_NAMEDSEM,
+       WAPI_HANDLE_NAMEDEVENT,
        WAPI_HANDLE_COUNT
 } WapiHandleType;
 
 extern const char *_wapi_handle_typename[];
 
 #define _WAPI_SHARED_HANDLE(type) (type == WAPI_HANDLE_PROCESS || \
-                                  type == WAPI_HANDLE_THREAD || \
-                                  type == WAPI_HANDLE_NAMEDMUTEX)
+                                  type == WAPI_HANDLE_NAMEDMUTEX || \
+                                  type == WAPI_HANDLE_NAMEDSEM || \
+                                  type == WAPI_HANDLE_NAMEDEVENT)
 
 #define _WAPI_FD_HANDLE(type) (type == WAPI_HANDLE_FILE || \
                               type == WAPI_HANDLE_CONSOLE || \
                               type == WAPI_HANDLE_SOCKET || \
                               type == WAPI_HANDLE_PIPE)
 
-#define _WAPI_SHARED_NAMESPACE(type) (type == WAPI_HANDLE_NAMEDMUTEX)
+#define _WAPI_SHARED_NAMESPACE(type) (type == WAPI_HANDLE_NAMEDMUTEX || \
+                                     type == WAPI_HANDLE_NAMEDSEM || \
+                                     type == WAPI_HANDLE_NAMEDEVENT)
 
 typedef struct 
 {
@@ -92,6 +97,12 @@ struct _WapiHandleOps
         * Returns the WaitForSingleObject return code.
         */
        guint32 (*special_wait)(gpointer handle, guint32 timeout);
+
+       /* Called by WaitForSingleObject and WaitForMultipleObjects,
+        * if the handle in question needs some preprocessing before the
+        * signal wait.
+        */
+       void (*prewait)(gpointer handle);
 };
 
 #include <mono/io-layer/event-private.h>
@@ -110,7 +121,7 @@ struct _WapiHandle_shared_ref
        guint32 offset;
 };
 
-#define _WAPI_HANDLE_INITIAL_COUNT 4096
+#define _WAPI_HANDLE_INITIAL_COUNT 256
 
 struct _WapiHandleUnshared
 {
@@ -128,6 +139,7 @@ struct _WapiHandleUnshared
                struct _WapiHandle_mutex mutex;
                struct _WapiHandle_sem sem;
                struct _WapiHandle_socket sock;
+               struct _WapiHandle_thread thread;
                struct _WapiHandle_shared_ref shared;
        } u;
 };
@@ -141,9 +153,10 @@ struct _WapiHandleShared
        
        union
        {
-               struct _WapiHandle_thread thread;
                struct _WapiHandle_process process;
                struct _WapiHandle_namedmutex namedmutex;
+               struct _WapiHandle_namedsem namedsem;
+               struct _WapiHandle_namedevent namedevent;
        } u;
 };
 
@@ -151,6 +164,8 @@ struct _WapiHandleShared
 /*#define _WAPI_SHARED_SEM_COLLECTION 1*/
 #define _WAPI_SHARED_SEM_FILESHARE 2
 #define _WAPI_SHARED_SEM_SHARED_HANDLES 3
+#define _WAPI_SHARED_SEM_PROCESS_COUNT_LOCK 6
+#define _WAPI_SHARED_SEM_PROCESS_COUNT 7
 #define _WAPI_SHARED_SEM_COUNT 8       /* Leave some future expansion space */
 
 struct _WapiHandleSharedLayout