2 * wapi-private.h: internal definitions of handles and shared memory layout
5 * Dick Porter (dick@ximian.com)
7 * (C) 2002 Ximian, Inc.
10 #ifndef _WAPI_PRIVATE_H_
11 #define _WAPI_PRIVATE_H_
16 #include <mono/io-layer/handles.h>
17 #include <mono/io-layer/io.h>
18 #include <mono/io-layer/daemon-private.h>
20 /* Shared threads don't seem to work yet */
21 #undef _POSIX_THREAD_PROCESS_SHARED
23 /* Catch this here rather than corrupt the shared data at runtime */
24 #if MONO_SIZEOF_SUNPATH==0
25 #error configure failed to discover size of unix socket path
28 /* Increment this whenever an incompatible change is made to the
29 * shared handle structure.
31 #define _WAPI_HANDLE_VERSION 0
49 WAPI_HANDLE_CAP_WAIT=0x01,
50 WAPI_HANDLE_CAP_SIGNAL=0x02,
51 WAPI_HANDLE_CAP_OWN=0x04,
52 } WapiHandleCapability;
56 void (*close_shared)(gpointer handle);
57 void (*close_private)(gpointer handle);
59 /* SignalObjectAndWait */
60 void (*signal)(gpointer signal);
62 /* Called by WaitForSingleObject and WaitForMultipleObjects,
63 * with the handle locked
65 void (*own_handle)(gpointer handle);
67 /* Called by WaitForSingleObject and WaitForMultipleObjects, if the
68 * handle in question is "ownable" (ie mutexes), to see if the current
69 * thread already owns this handle
71 gboolean (*is_owned)(gpointer handle);
74 #include <mono/io-layer/event-private.h>
75 #include <mono/io-layer/io-private.h>
76 #include <mono/io-layer/mutex-private.h>
77 #include <mono/io-layer/semaphore-private.h>
78 #include <mono/io-layer/socket-private.h>
79 #include <mono/io-layer/thread-private.h>
80 #include <mono/io-layer/process-private.h>
82 struct _WapiHandleShared
87 mono_mutex_t signal_mutex;
88 pthread_cond_t signal_cond;
92 struct _WapiHandle_event event;
93 struct _WapiHandle_file file;
94 struct _WapiHandle_find find;
95 struct _WapiHandle_mutex mutex;
96 struct _WapiHandle_sem sem;
97 struct _WapiHandle_socket sock;
98 struct _WapiHandle_thread thread;
99 struct _WapiHandle_process process;
103 #define _WAPI_MAX_HANDLES 4096
104 #define _WAPI_HANDLE_INVALID (gpointer)-1
107 * This is the layout of the shared memory segment
109 struct _WapiHandleShared_list
111 guchar daemon[MONO_SIZEOF_SUNPATH];
112 _wapi_daemon_status daemon_running;
114 #if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED != -1
115 mono_mutex_t signal_mutex;
116 pthread_cond_t signal_cond;
118 struct _WapiHandleShared handles[_WAPI_MAX_HANDLES];
119 guchar scratch_base[0];
122 struct _WapiHandlePrivate
126 struct _WapiHandlePrivate_event event;
127 struct _WapiHandlePrivate_file file;
128 struct _WapiHandlePrivate_find find;
129 struct _WapiHandlePrivate_mutex mutex;
130 struct _WapiHandlePrivate_sem sem;
131 struct _WapiHandlePrivate_socket sock;
132 struct _WapiHandlePrivate_thread thread;
133 struct _WapiHandlePrivate_process process;
137 /* Per-process handle info. For lookup convenience, each index matches
138 * the corresponding shared data.
140 struct _WapiHandlePrivate_list
142 #if !defined(_POSIX_THREAD_PROCESS_SHARED) || _POSIX_THREAD_PROCESS_SHARED == -1
143 mono_mutex_t signal_mutex;
144 pthread_cond_t signal_cond;
146 struct _WapiHandlePrivate handles[_WAPI_MAX_HANDLES];
150 #endif /* _WAPI_PRIVATE_H_ */