Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / w32handle.h
1 /**
2  * \file
3  */
4
5 #ifndef _MONO_METADATA_W32HANDLE_H_
6 #define _MONO_METADATA_W32HANDLE_H_
7
8 #include <config.h>
9 #include <glib.h>
10
11 #ifdef HOST_WIN32
12 #include <windows.h>
13 #endif
14
15 #ifndef INVALID_HANDLE_VALUE
16 #define INVALID_HANDLE_VALUE (gpointer)-1
17 #endif
18
19 #define MONO_W32HANDLE_MAXIMUM_WAIT_OBJECTS 64
20
21 #ifndef MONO_INFINITE_WAIT
22 #define MONO_INFINITE_WAIT ((guint32) 0xFFFFFFFF)
23 #endif
24
25 typedef enum {
26         MONO_W32HANDLE_UNUSED = 0,
27         MONO_W32HANDLE_SEM,
28         MONO_W32HANDLE_MUTEX,
29         MONO_W32HANDLE_EVENT,
30         MONO_W32HANDLE_FIND,
31         MONO_W32HANDLE_PROCESS,
32         MONO_W32HANDLE_NAMEDMUTEX,
33         MONO_W32HANDLE_NAMEDSEM,
34         MONO_W32HANDLE_NAMEDEVENT,
35         MONO_W32HANDLE_COUNT
36 } MonoW32HandleType;
37
38 typedef enum {
39         MONO_W32HANDLE_WAIT_RET_SUCCESS_0   =  0,
40         MONO_W32HANDLE_WAIT_RET_ABANDONED_0 =  MONO_W32HANDLE_WAIT_RET_SUCCESS_0 + MONO_W32HANDLE_MAXIMUM_WAIT_OBJECTS,
41         MONO_W32HANDLE_WAIT_RET_ALERTED     = -1,
42         MONO_W32HANDLE_WAIT_RET_TIMEOUT     = -2,
43         MONO_W32HANDLE_WAIT_RET_FAILED      = -3,
44 } MonoW32HandleWaitRet;
45
46 typedef struct 
47 {
48         void (*close)(gpointer handle, gpointer data);
49
50         /* mono_w32handle_signal_and_wait */
51         void (*signal)(gpointer signal, gpointer data);
52
53         /* Called by mono_w32handle_wait_one and mono_w32handle_wait_multiple,
54          * with the handle locked (shared handles aren't locked.)
55          * Returns TRUE if ownership was established, false otherwise.
56          * If TRUE, *abandoned contains a status code such as
57          * WAIT_OBJECT_0 or WAIT_ABANDONED_0.
58          */
59         gboolean (*own_handle)(gpointer handle, gboolean *abandoned);
60
61         /* Called by mono_w32handle_wait_one and mono_w32handle_wait_multiple, if the
62          * handle in question is "ownable" (ie mutexes), to see if the current
63          * thread already owns this handle
64          */
65         gboolean (*is_owned)(gpointer handle);
66
67         /* Called by mono_w32handle_wait_one and mono_w32handle_wait_multiple,
68          * if the handle in question needs a special wait function
69          * instead of using the normal handle signal mechanism.
70          * Returns the mono_w32handle_wait_one return code.
71          */
72         MonoW32HandleWaitRet (*special_wait)(gpointer handle, guint32 timeout, gboolean *alerted);
73
74         /* Called by mono_w32handle_wait_one and mono_w32handle_wait_multiple,
75          * if the handle in question needs some preprocessing before the
76          * signal wait.
77          */
78         void (*prewait)(gpointer handle);
79
80         /* Called when dumping the handles */
81         void (*details)(gpointer data);
82
83         /* Called to get the name of the handle type */
84         const gchar* (*typename) (void);
85
86         /* Called to get the size of the handle type */
87         gsize (*typesize) (void);
88 } MonoW32HandleOps;
89
90 typedef enum {
91         MONO_W32HANDLE_CAP_WAIT         = 0x01,
92         MONO_W32HANDLE_CAP_SIGNAL       = 0x02,
93         MONO_W32HANDLE_CAP_OWN          = 0x04,
94         MONO_W32HANDLE_CAP_SPECIAL_WAIT = 0x08,
95 } MonoW32HandleCapability;
96
97 void
98 mono_w32handle_init (void);
99
100 void
101 mono_w32handle_cleanup (void);
102
103 void
104 mono_w32handle_register_ops (MonoW32HandleType type, MonoW32HandleOps *ops);
105
106 gpointer
107 mono_w32handle_new (MonoW32HandleType type, gpointer handle_specific);
108
109 gpointer
110 mono_w32handle_duplicate (gpointer handle);
111
112 gboolean
113 mono_w32handle_close (gpointer handle);
114
115 MonoW32HandleType
116 mono_w32handle_get_type (gpointer handle);
117
118 const gchar*
119 mono_w32handle_get_typename (MonoW32HandleType type);
120
121 gboolean
122 mono_w32handle_lookup (gpointer handle, MonoW32HandleType type, gpointer *handle_specific);
123
124 void
125 mono_w32handle_foreach (gboolean (*on_each)(gpointer handle, gpointer data, gpointer user_data), gpointer user_data);
126
127 void
128 mono_w32handle_dump (void);
129
130 void
131 mono_w32handle_register_capabilities (MonoW32HandleType type, MonoW32HandleCapability caps);
132
133 gboolean
134 mono_w32handle_test_capabilities (gpointer handle, MonoW32HandleCapability caps);
135
136 void
137 mono_w32handle_set_signal_state (gpointer handle, gboolean state, gboolean broadcast);
138
139 gboolean
140 mono_w32handle_issignalled (gpointer handle);
141
142 void
143 mono_w32handle_lock_handle (gpointer handle);
144
145 gboolean
146 mono_w32handle_trylock_handle (gpointer handle);
147
148 void
149 mono_w32handle_unlock_handle (gpointer handle);
150
151 MonoW32HandleWaitRet
152 mono_w32handle_wait_one (gpointer handle, guint32 timeout, gboolean alertable);
153
154 MonoW32HandleWaitRet
155 mono_w32handle_wait_multiple (gpointer *handles, gsize nhandles, gboolean waitall, guint32 timeout, gboolean alertable);
156
157 MonoW32HandleWaitRet
158 mono_w32handle_signal_and_wait (gpointer signal_handle, gpointer wait_handle, guint32 timeout, gboolean alertable);
159
160 #ifdef HOST_WIN32
161 static inline MonoW32HandleWaitRet
162 mono_w32handle_convert_wait_ret (guint32 res, guint32 numobjects)
163 {
164         if (res >= WAIT_OBJECT_0 && res <= WAIT_OBJECT_0 + numobjects - 1)
165                 return MONO_W32HANDLE_WAIT_RET_SUCCESS_0 + (res - WAIT_OBJECT_0);
166         else if (res >= WAIT_ABANDONED_0 && res <= WAIT_ABANDONED_0 + numobjects - 1)
167                 return MONO_W32HANDLE_WAIT_RET_ABANDONED_0 + (res - WAIT_ABANDONED_0);
168         else if (res == WAIT_IO_COMPLETION)
169                 return MONO_W32HANDLE_WAIT_RET_ALERTED;
170         else if (res == WAIT_TIMEOUT)
171                 return MONO_W32HANDLE_WAIT_RET_TIMEOUT;
172         else if (res == WAIT_FAILED)
173                 return MONO_W32HANDLE_WAIT_RET_FAILED;
174         else
175                 g_error ("%s: unknown res value %d", __func__, res);
176 }
177 #endif
178
179
180 #endif /* _MONO_METADATA_W32HANDLE_H_ */