6 int mini_wapi_hps (int argc, char **argv)
11 int mini_wapi_semdel (int argc, char **argv)
16 int mini_wapi_seminfo (int argc, char **argv)
24 #include <sys/types.h>
27 #include <mono/io-layer/io-layer.h>
29 /* We're digging into handle internals here... */
30 #include <mono/io-layer/handles-private.h>
31 #include <mono/io-layer/wapi-private.h>
32 #include <mono/io-layer/shared.h>
33 #include <mono/io-layer/collection.h>
35 static const guchar *unused_details (struct _WapiHandleShared *handle);
36 static const guchar *unshared_details (struct _WapiHandleShared *handle);
37 static const guchar *thread_details (struct _WapiHandleShared *handle);
38 static const guchar *namedmutex_details (struct _WapiHandleShared *handle);
39 static const guchar *namedsem_details (struct _WapiHandleShared *handle);
40 static const guchar *namedevent_details (struct _WapiHandleShared *handle);
41 static const guchar *process_details (struct _WapiHandleShared *handle);
43 /* This depends on the ordering of the enum WapiHandleType in
44 * io-layer/wapi-private.h
46 static const guchar * (*details[])(struct _WapiHandleShared *)=
49 unshared_details, /* file */
50 unshared_details, /* console */
52 unshared_details, /* sem */
53 unshared_details, /* mutex */
54 unshared_details, /* event */
55 unshared_details, /* socket */
56 unshared_details, /* find */
58 unshared_details, /* pipe */
65 int mini_wapi_hps (int argc, char **argv)
70 _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
71 if (_wapi_shared_layout == NULL) {
72 g_error ("Failed to attach shared memory!");
76 _wapi_fileshare_layout = _wapi_shm_attach(WAPI_SHM_FILESHARE);
77 if (_wapi_fileshare_layout == NULL) {
78 g_error ("Failed to attach fileshare shared memory!");
83 _wapi_shm_semaphores_init ();
84 _wapi_collection_init ();
85 _wapi_handle_collect ();
88 g_print ("collection: %d sem: 0x%x\n",
89 _wapi_shared_layout->collection_count,
90 _wapi_shared_layout->sem_key);
92 now = (guint32)(time(NULL) & 0xFFFFFFFF);
93 for (i = 0; i < _WAPI_HANDLE_INITIAL_COUNT; i++) {
94 struct _WapiHandleShared *shared;
96 shared = &_wapi_shared_layout->handles[i];
97 if (shared->type != WAPI_HANDLE_UNUSED) {
98 g_print ("%3x (%3d) [%7s] %4u %s (%s)\n",
99 i, shared->handle_refs,
100 _wapi_handle_typename[shared->type],
101 now - shared->timestamp,
102 shared->signalled?"Sg":"Un",
103 details[shared->type](shared));
107 g_print ("Fileshare hwm: %d\n", _wapi_fileshare_layout->hwm);
109 for (i = 0; i <= _wapi_fileshare_layout->hwm; i++) {
110 struct _WapiFileShare *file_share;
112 file_share = &_wapi_fileshare_layout->share_info[i];
113 if (file_share->handle_refs > 0) {
114 g_print ("dev: 0x%llx ino: %lld open pid: %d share: 0x%x access: 0x%x refs: %d\n", file_share->device, file_share->inode, file_share->opened_by_pid, file_share->sharemode, file_share->access, file_share->handle_refs);
121 static const guchar *unused_details (struct _WapiHandleShared *handle)
123 return("unused details");
126 static const guchar *unshared_details (struct _WapiHandleShared *handle)
128 return("unshared details");
131 static const guchar *thread_details (struct _WapiHandleShared *handle)
133 static guchar buf[80];
134 struct _WapiHandle_thread *thr=&handle->u.thread;
136 g_snprintf (buf, sizeof(buf),
137 "proc: %d, state: %d, exit: %u, join: %d",
138 thr->owner_pid, thr->state, thr->exitstatus,
144 static const guchar *namedmutex_details (struct _WapiHandleShared *handle)
146 static guchar buf[80];
148 struct _WapiHandle_namedmutex *mut=&handle->u.namedmutex;
150 name = mut->sharedns.name;
152 g_snprintf (buf, sizeof(buf), "[%15s] own: %5d:%5ld, count: %5u",
153 name==NULL?(gchar *)"":name, mut->pid, mut->tid,
159 static const guchar *namedsem_details (struct _WapiHandleShared *handle)
161 static guchar buf[80];
163 struct _WapiHandle_namedsem *sem = &handle->u.namedsem;
165 name = sem->sharedns.name;
167 g_snprintf (buf, sizeof(buf), "[%15s] val: %5u, max: %5d",
168 name == NULL?(gchar *)"":name, sem->val, sem->max);
173 static const guchar *namedevent_details (struct _WapiHandleShared *handle)
175 static guchar buf[80];
177 struct _WapiHandle_namedevent *event = &handle->u.namedevent;
179 name = event->sharedns.name;
181 g_snprintf (buf, sizeof(buf), "[%15s] %s count: %5u",
182 name == NULL?(gchar *)"":name,
183 event->manual?"Manual":"Auto", event->set_count);
188 static const guchar *process_details (struct _WapiHandleShared *handle)
190 static guchar buf[80];
192 struct _WapiHandle_process *proc=&handle->u.process;
194 name = proc->proc_name;
196 g_snprintf (buf, sizeof(buf), "[%25.25s] pid: %5u exit: %u",
197 name==NULL?(gchar *)"":name, proc->id, proc->exitstatus);
202 /* The old handles/semdel.c */
203 int mini_wapi_semdel (int argc, char **argv)
207 _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
208 if (_wapi_shared_layout == FALSE ||
209 _wapi_shared_layout->sem_key == 0) {
213 sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
215 ret = semctl (sem_id, 0, IPC_RMID);
217 g_message ("Error deleting semaphore: %s",
225 static void sem_explain (int val)
227 g_print ("%d ", val);
229 g_print ("(Unlocked)");
231 g_print ("(Locked)");
236 int mini_wapi_seminfo (int argc, char **argv)
242 struct semid_ds *buf;
245 ushort vals[_WAPI_SHARED_SEM_COUNT];
247 _wapi_shared_layout = _wapi_shm_attach (WAPI_SHM_DATA);
248 if (_wapi_shared_layout == FALSE ||
249 _wapi_shared_layout->sem_key == 0) {
253 sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
255 g_print ("Getting values for sem: 0x%x\n",
256 _wapi_shared_layout->sem_key);
258 ret = semctl (sem_id, 0, GETALL, arg);
260 g_print ("Namespace: ");
261 sem_explain (vals[_WAPI_SHARED_SEM_NAMESPACE]);
262 g_print ("Fileshare: ");
263 sem_explain (vals[_WAPI_SHARED_SEM_FILESHARE]);
264 g_print ("Handles: ");
265 sem_explain (vals[_WAPI_SHARED_SEM_SHARED_HANDLES]);
266 g_print ("Count lock: ");
267 sem_explain (vals[_WAPI_SHARED_SEM_PROCESS_COUNT_LOCK]);
268 g_print ("Count: %d\n", vals[_WAPI_SHARED_SEM_PROCESS_COUNT] - 1);