[aot] Remove some obsolete TODOs.
[mono.git] / mono / mini / wapihandles.c
1 #include <config.h>
2 #include <glib.h>
3
4 #include "mini.h"
5
6 #if defined(HOST_WIN32) || !defined(HAVE_SYS_IPC_H) || !defined(HAVE_SYS_SEM_H) || (defined(__native_client__) && defined(__GLIBC__)) || defined(DISABLE_SHARED_HANDLES)
7
8 int mini_wapi_hps (int argc, char **argv)
9 {
10         return 0;
11 }
12
13 int mini_wapi_semdel (int argc, char **argv)
14 {
15         return 0;
16 }
17
18 int mini_wapi_seminfo (int argc, char **argv)
19 {
20         return 0;
21 }
22
23 #else
24
25 #include <errno.h>
26 #include <sys/types.h>
27 #include <sys/ipc.h>
28 #include <sys/sem.h>
29 #include <mono/io-layer/io-layer.h>
30
31 /* We're digging into handle internals here... */
32 #include <mono/io-layer/handles-private.h>
33 #include <mono/io-layer/wapi-private.h>
34 #include <mono/io-layer/shared.h>
35 #include <mono/io-layer/collection.h>
36
37 static const gchar *unused_details (struct _WapiHandleShared *handle);
38 static const gchar *unshared_details (struct _WapiHandleShared *handle);
39 #if 0
40 static const gchar *thread_details (struct _WapiHandleShared *handle);
41 #endif
42 static const gchar *namedmutex_details (struct _WapiHandleShared *handle);
43 static const gchar *namedsem_details (struct _WapiHandleShared *handle);
44 static const gchar *namedevent_details (struct _WapiHandleShared *handle);
45
46 /* This depends on the ordering of the enum WapiHandleType in
47  * io-layer/wapi-private.h
48  */
49 static const gchar * (*details[])(struct _WapiHandleShared *)=
50 {
51         unused_details,
52         unshared_details,               /* file */
53         unshared_details,               /* console */
54         unshared_details,               /* thread */
55         unshared_details,               /* sem */
56         unshared_details,               /* mutex */
57         unshared_details,               /* event */
58         unshared_details,               /* socket */
59         unshared_details,               /* find */
60         unshared_details,       /* process */
61         unshared_details,               /* pipe */
62         namedmutex_details,
63         namedsem_details,
64         namedevent_details,
65         unused_details,
66 };
67
68 int mini_wapi_hps (int argc, char **argv)
69 {
70         guint32 i;
71         guint32 now;
72
73         _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
74         if (_wapi_shared_layout == NULL) {
75                 g_error ("Failed to attach shared memory!");
76                 exit (-1);
77         }
78
79         _wapi_fileshare_layout = _wapi_shm_attach(WAPI_SHM_FILESHARE);
80         if (_wapi_fileshare_layout == NULL) {
81                 g_error ("Failed to attach fileshare shared memory!");
82                 exit (-1);
83         }
84         
85         if (argc > 1) {
86                 _wapi_shm_semaphores_init ();
87                 _wapi_collection_init ();
88                 _wapi_handle_collect ();
89         }
90         
91         g_print ("collection: %d sem: 0x%x\n",
92                  _wapi_shared_layout->collection_count,
93                  _wapi_shared_layout->sem_key);
94         
95         now = (guint32)(time(NULL) & 0xFFFFFFFF);
96         for (i = 0; i < _WAPI_HANDLE_INITIAL_COUNT; i++) {
97                 struct _WapiHandleShared *shared;
98                 
99                 shared = &_wapi_shared_layout->handles[i];
100                 if (shared->type != WAPI_HANDLE_UNUSED) {
101                         g_print ("%3x (%3d) [%7s] %4u %s (%s)\n",
102                                  i, shared->handle_refs,
103                                  _wapi_handle_typename[shared->type],
104                                  now - shared->timestamp,
105                                  shared->signalled?"Sg":"Un",
106                                  details[shared->type](shared));
107                 }
108         }
109
110         g_print ("Fileshare hwm: %d\n", _wapi_fileshare_layout->hwm);
111         
112         for (i = 0; i <= _wapi_fileshare_layout->hwm; i++) {
113                 struct _WapiFileShare *file_share;
114                 
115                 file_share = &_wapi_fileshare_layout->share_info[i];
116                 if (file_share->handle_refs > 0) {
117                         g_print ("dev: 0x%llx ino: %lld open pid: %d share: 0x%x access: 0x%x refs: %d\n", (long long int)file_share->device, (long long int)file_share->inode, file_share->opened_by_pid, file_share->sharemode, file_share->access, file_share->handle_refs);
118                 }
119         }
120         
121         exit (0);
122 }
123
124 static const gchar *unused_details (struct _WapiHandleShared *handle)
125 {
126         return("unused details");
127 }
128
129 static const gchar *unshared_details (struct _WapiHandleShared *handle)
130 {
131         return("unshared details");
132 }
133
134 #if 0
135 static const gchar *thread_details (struct _WapiHandleShared *handle)
136 {
137         static gchar buf[80];
138         struct _WapiHandle_thread *thr=&handle->u.thread;
139
140         g_snprintf (buf, sizeof(buf),
141                     "proc: %d, tid: %ld, state: %d, exit: %u, join: %d",
142                     thr->owner_pid, thr->id, thr->state, thr->exitstatus,
143                     thr->joined);
144         
145         return(buf);
146 }
147 #endif
148
149 static const gchar *namedmutex_details (struct _WapiHandleShared *handle)
150 {
151         static gchar buf[80];
152         gchar *name;
153         struct _WapiHandle_namedmutex *mut=&handle->u.namedmutex;
154         
155         name = mut->sharedns.name;
156         
157         g_snprintf (buf, sizeof(buf), "[%15s] own: %5d:%5ld, count: %5u",
158                     name==NULL?(gchar *)"":name, mut->pid, mut->tid,
159                     mut->recursion);
160
161         return(buf);
162 }
163
164 static const gchar *namedsem_details (struct _WapiHandleShared *handle)
165 {
166         static gchar buf[80];
167         gchar *name;
168         struct _WapiHandle_namedsem *sem = &handle->u.namedsem;
169         
170         name = sem->sharedns.name;
171         
172         g_snprintf (buf, sizeof(buf), "[%15s] val: %5u, max: %5d",
173                     name == NULL?(gchar *)"":name, sem->val, sem->max);
174
175         return(buf);
176 }
177
178 static const gchar *namedevent_details (struct _WapiHandleShared *handle)
179 {
180         static gchar buf[80];
181         gchar *name;
182         struct _WapiHandle_namedevent *event = &handle->u.namedevent;
183         
184         name = event->sharedns.name;
185         
186         g_snprintf (buf, sizeof(buf), "[%15s] %s count: %5u",
187                     name == NULL?(gchar *)"":name,
188                     event->manual?"Manual":"Auto", event->set_count);
189
190         return(buf);
191 }
192
193 /* The old handles/semdel.c */
194 int mini_wapi_semdel (int argc, char **argv)
195 {
196         int sem_id, ret;
197         
198         _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
199         if (_wapi_shared_layout == FALSE ||
200             _wapi_shared_layout->sem_key == 0) {
201                 exit (0);
202         }
203
204         sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
205         if (sem_id != -1) {
206                 ret = semctl (sem_id, 0, IPC_RMID);
207                 if (ret == -1) {
208                         g_message ("Error deleting semaphore: %s",
209                                    g_strerror (errno));
210                 }
211         }
212         
213         exit (0);
214 }
215
216 static void sem_explain (int sem_id, ushort *vals, int which)
217 {
218         pid_t pid;
219         
220         g_print ("%d ", vals[which]);
221         if (vals[which] >= 1) {
222                 g_print ("(Unlocked)");
223         } else {
224                 pid = semctl (sem_id, which, GETPID);
225                 
226                 g_print ("(Locked by %d)", pid);
227         }
228         g_print ("\n");
229 }
230
231 int mini_wapi_seminfo (int argc, char **argv)
232 {
233         int sem_id, ret;
234         union semun
235         {
236                 int val;
237                 struct semid_ds *buf;
238                 ushort *array;
239         } arg;
240         ushort vals[_WAPI_SHARED_SEM_COUNT];
241         
242         _wapi_shared_layout = _wapi_shm_attach (WAPI_SHM_DATA);
243         if (_wapi_shared_layout == FALSE ||
244             _wapi_shared_layout->sem_key == 0) {
245                 exit (0);
246         }
247         
248         sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
249         if (sem_id != -1) {
250                 g_print ("Getting values for sem: 0x%x\n",
251                          _wapi_shared_layout->sem_key);
252                 arg.array = vals;
253                 ret = semctl (sem_id, 0, GETALL, arg);
254                 if (ret != -1) {
255                         g_print ("Namespace: ");
256                         sem_explain (sem_id, vals, _WAPI_SHARED_SEM_NAMESPACE);
257                         g_print ("Fileshare: ");
258                         sem_explain (sem_id, vals, _WAPI_SHARED_SEM_FILESHARE);
259                         g_print ("Handles: ");
260                         sem_explain (sem_id, vals,
261                                      _WAPI_SHARED_SEM_SHARED_HANDLES);
262                         g_print ("Count lock: ");
263                         sem_explain (sem_id, vals,
264                                      _WAPI_SHARED_SEM_PROCESS_COUNT_LOCK);
265                         g_print ("Count: %d\n",
266                                  vals[_WAPI_SHARED_SEM_PROCESS_COUNT]);
267                 }
268         }
269         
270         exit (0);
271 }
272
273 #endif
274