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