6 #if defined(HOST_WIN32) || !defined(HAVE_SYS_IPC_H) || !defined(HAVE_SYS_SEM_H) || (defined(__native_client__) && defined(__GLIBC__)) || defined(DISABLE_SHARED_HANDLES)
8 int mini_wapi_hps (int argc, char **argv)
13 int mini_wapi_semdel (int argc, char **argv)
18 int mini_wapi_seminfo (int argc, char **argv)
26 #include <sys/types.h>
29 #include <mono/io-layer/io-layer.h>
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>
37 static const gchar *unused_details (struct _WapiHandleShared *handle);
38 static const gchar *unshared_details (struct _WapiHandleShared *handle);
40 static const gchar *thread_details (struct _WapiHandleShared *handle);
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);
46 /* This depends on the ordering of the enum WapiHandleType in
47 * io-layer/wapi-private.h
49 static const gchar * (*details[])(struct _WapiHandleShared *)=
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 */
68 int mini_wapi_hps (int argc, char **argv)
73 _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
74 if (_wapi_shared_layout == NULL) {
75 g_error ("Failed to attach shared memory!");
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!");
86 _wapi_shm_semaphores_init ();
87 _wapi_collection_init ();
88 _wapi_handle_collect ();
91 g_print ("collection: %d sem: 0x%x\n",
92 _wapi_shared_layout->collection_count,
93 _wapi_shared_layout->sem_key);
95 now = (guint32)(time(NULL) & 0xFFFFFFFF);
96 for (i = 0; i < _WAPI_HANDLE_INITIAL_COUNT; i++) {
97 struct _WapiHandleShared *shared;
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));
110 g_print ("Fileshare hwm: %d\n", _wapi_fileshare_layout->hwm);
112 for (i = 0; i <= _wapi_fileshare_layout->hwm; i++) {
113 struct _WapiFileShare *file_share;
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);
124 static const gchar *unused_details (struct _WapiHandleShared *handle)
126 return("unused details");
129 static const gchar *unshared_details (struct _WapiHandleShared *handle)
131 return("unshared details");
135 static const gchar *thread_details (struct _WapiHandleShared *handle)
137 static gchar buf[80];
138 struct _WapiHandle_thread *thr=&handle->u.thread;
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,
149 static const gchar *namedmutex_details (struct _WapiHandleShared *handle)
151 static gchar buf[80];
153 struct _WapiHandle_namedmutex *mut=&handle->u.namedmutex;
155 name = mut->sharedns.name;
157 g_snprintf (buf, sizeof(buf), "[%15s] own: %5d:%5ld, count: %5u",
158 name==NULL?(gchar *)"":name, mut->pid, mut->tid,
164 static const gchar *namedsem_details (struct _WapiHandleShared *handle)
166 static gchar buf[80];
168 struct _WapiHandle_namedsem *sem = &handle->u.namedsem;
170 name = sem->sharedns.name;
172 g_snprintf (buf, sizeof(buf), "[%15s] val: %5u, max: %5d",
173 name == NULL?(gchar *)"":name, sem->val, sem->max);
178 static const gchar *namedevent_details (struct _WapiHandleShared *handle)
180 static gchar buf[80];
182 struct _WapiHandle_namedevent *event = &handle->u.namedevent;
184 name = event->sharedns.name;
186 g_snprintf (buf, sizeof(buf), "[%15s] %s count: %5u",
187 name == NULL?(gchar *)"":name,
188 event->manual?"Manual":"Auto", event->set_count);
193 /* The old handles/semdel.c */
194 int mini_wapi_semdel (int argc, char **argv)
198 _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
199 if (_wapi_shared_layout == FALSE ||
200 _wapi_shared_layout->sem_key == 0) {
204 sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
206 ret = semctl (sem_id, 0, IPC_RMID);
208 g_message ("Error deleting semaphore: %s",
216 static void sem_explain (int sem_id, ushort *vals, int which)
220 g_print ("%d ", vals[which]);
221 if (vals[which] >= 1) {
222 g_print ("(Unlocked)");
224 pid = semctl (sem_id, which, GETPID);
226 g_print ("(Locked by %d)", pid);
231 int mini_wapi_seminfo (int argc, char **argv)
237 struct semid_ds *buf;
240 ushort vals[_WAPI_SHARED_SEM_COUNT];
242 _wapi_shared_layout = _wapi_shm_attach (WAPI_SHM_DATA);
243 if (_wapi_shared_layout == FALSE ||
244 _wapi_shared_layout->sem_key == 0) {
248 sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
250 g_print ("Getting values for sem: 0x%x\n",
251 _wapi_shared_layout->sem_key);
253 ret = semctl (sem_id, 0, GETALL, arg);
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]);