4 #include <mono/io-layer/io-layer.h>
6 /* We're digging into handle internals here... */
7 #include <mono/io-layer/handles-private.h>
8 #include <mono/io-layer/wapi-private.h>
9 #include <mono/io-layer/shared.h>
10 #include <mono/io-layer/collection.h>
12 static const guchar *unused_details (struct _WapiHandleShared *handle);
13 static const guchar *unshared_details (struct _WapiHandleShared *handle);
14 static const guchar *thread_details (struct _WapiHandleShared *handle);
15 static const guchar *namedmutex_details (struct _WapiHandleShared *handle);
16 static const guchar *namedsem_details (struct _WapiHandleShared *handle);
17 static const guchar *namedevent_details (struct _WapiHandleShared *handle);
18 static const guchar *process_details (struct _WapiHandleShared *handle);
20 /* This depends on the ordering of the enum WapiHandleType in
21 * io-layer/wapi-private.h
23 static const guchar * (*details[])(struct _WapiHandleShared *)=
26 unshared_details, /* file */
27 unshared_details, /* console */
29 unshared_details, /* sem */
30 unshared_details, /* mutex */
31 unshared_details, /* event */
32 unshared_details, /* socket */
33 unshared_details, /* find */
35 unshared_details, /* pipe */
42 int main (int argc, char **argv)
47 _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
48 if (_wapi_shared_layout == NULL) {
49 g_error ("Failed to attach shared memory!");
53 _wapi_fileshare_layout = _wapi_shm_attach(WAPI_SHM_FILESHARE);
54 if (_wapi_fileshare_layout == NULL) {
55 g_error ("Failed to attach fileshare shared memory!");
60 _wapi_shm_semaphores_init ();
61 _wapi_collection_init ();
62 _wapi_handle_collect ();
65 g_print ("collection: %d sem: 0x%x\n",
66 _wapi_shared_layout->collection_count,
67 _wapi_shared_layout->sem_key);
69 now = (guint32)(time(NULL) & 0xFFFFFFFF);
70 for (i = 0; i < _WAPI_HANDLE_INITIAL_COUNT; i++) {
71 struct _WapiHandleShared *shared;
73 shared = &_wapi_shared_layout->handles[i];
74 if (shared->type != WAPI_HANDLE_UNUSED) {
75 g_print ("%3x (%3d) [%7s] %4u %s (%s)\n",
76 i, shared->handle_refs,
77 _wapi_handle_typename[shared->type],
78 now - shared->timestamp,
79 shared->signalled?"Sg":"Un",
80 details[shared->type](shared));
84 g_print ("Fileshare hwm: %d\n", _wapi_fileshare_layout->hwm);
86 for (i = 0; i <= _wapi_fileshare_layout->hwm; i++) {
87 struct _WapiFileShare *file_share;
89 file_share = &_wapi_fileshare_layout->share_info[i];
90 if (file_share->handle_refs > 0) {
91 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);
98 static const guchar *unused_details (struct _WapiHandleShared *handle)
100 return("unused details");
103 static const guchar *unshared_details (struct _WapiHandleShared *handle)
105 return("unshared details");
108 static const guchar *thread_details (struct _WapiHandleShared *handle)
110 static guchar buf[80];
111 struct _WapiHandle_thread *thr=&handle->u.thread;
113 g_snprintf (buf, sizeof(buf),
114 "proc: %d, state: %d, exit: %u, join: %d",
115 thr->owner_pid, thr->state, thr->exitstatus,
121 static const guchar *namedmutex_details (struct _WapiHandleShared *handle)
123 static guchar buf[80];
125 struct _WapiHandle_namedmutex *mut=&handle->u.namedmutex;
127 name = mut->sharedns.name;
129 g_snprintf (buf, sizeof(buf), "[%15s] own: %5d:%5ld, count: %5u",
130 name==NULL?(gchar *)"":name, mut->pid, mut->tid,
136 static const guchar *namedsem_details (struct _WapiHandleShared *handle)
138 static guchar buf[80];
140 struct _WapiHandle_namedsem *sem = &handle->u.namedsem;
142 name = sem->sharedns.name;
144 g_snprintf (buf, sizeof(buf), "[%15s] val: %5u, max: %5d",
145 name == NULL?(gchar *)"":name, sem->val, sem->max);
150 static const guchar *namedevent_details (struct _WapiHandleShared *handle)
152 static guchar buf[80];
154 struct _WapiHandle_namedevent *event = &handle->u.namedevent;
156 name = event->sharedns.name;
158 g_snprintf (buf, sizeof(buf), "[%15s] %s count: %5u",
159 name == NULL?(gchar *)"":name,
160 event->manual?"Manual":"Auto", event->set_count);
165 static const guchar *process_details (struct _WapiHandleShared *handle)
167 static guchar buf[80];
169 struct _WapiHandle_process *proc=&handle->u.process;
171 name = proc->proc_name;
173 g_snprintf (buf, sizeof(buf), "[%25.25s] pid: %5u exit: %u",
174 name==NULL?(gchar *)"":name, proc->id, proc->exitstatus);