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>
10 static const guchar *unused_details (struct _WapiHandleShared *handle);
11 static const guchar *file_details (struct _WapiHandleShared *handle);
12 static const guchar *console_details (struct _WapiHandleShared *handle);
13 static const guchar *thread_details (struct _WapiHandleShared *handle);
14 static const guchar *sem_details (struct _WapiHandleShared *handle);
15 static const guchar *mutex_details (struct _WapiHandleShared *handle);
16 static const guchar *event_details (struct _WapiHandleShared *handle);
17 static const guchar *socket_details (struct _WapiHandleShared *handle);
18 static const guchar *find_details (struct _WapiHandleShared *handle);
19 static const guchar *process_details (struct _WapiHandleShared *handle);
20 static const guchar *pipe_details (struct _WapiHandleShared *handle);
22 /* This depends on the ordering of the enum WapiHandleType in
23 * io-layer/wapi-private.h
25 static const char *typename[]={
41 static const guchar * (*details[])(struct _WapiHandleShared *)=
57 int main (int argc, char **argv)
62 _wapi_shared_data=g_new0 (struct _WapiHandleShared_list *, 1);
63 _wapi_shared_scratch=g_new0 (struct _WapiHandleScratch, 1);
65 success=_wapi_shm_attach (&_wapi_shared_data[0],
66 &_wapi_shared_scratch);
68 g_error ("Failed to attach shared memory!");
72 /* Make sure index 0 is actually unused */
73 for(handle_idx=0; handle_idx<_wapi_shared_data[0]->num_segments * _WAPI_HANDLES_PER_SEGMENT; handle_idx++) {
75 struct _WapiHandleShared *shared;
77 _wapi_handle_segment (GUINT_TO_POINTER (handle_idx), &segment,
79 _wapi_handle_ensure_mapped (segment);
81 shared=&_wapi_shared_data[segment]->handles[idx];
83 if(shared->type!=WAPI_HANDLE_UNUSED) {
84 g_print ("%6x [%7s] %4u %s (%s)\n", handle_idx,
85 typename[shared->type], shared->ref,
86 shared->signalled?"Sg":"Un",
87 details[shared->type](shared));
94 static const guchar *unused_details (struct _WapiHandleShared *handle)
96 return("unused details");
99 static const guchar *file_details (struct _WapiHandleShared *handle)
101 static guchar buf[80];
103 struct _WapiHandle_file *file=&handle->u.file;
105 name=_wapi_handle_scratch_lookup (file->filename);
107 g_snprintf (buf, sizeof(buf),
108 "[%20s] acc: %c%c%c, shr: %c%c%c, attrs: %5u",
109 name==NULL?(guchar *)"":name,
110 file->fileaccess&GENERIC_READ?'R':'.',
111 file->fileaccess&GENERIC_WRITE?'W':'.',
112 file->fileaccess&GENERIC_EXECUTE?'X':'.',
113 file->sharemode&FILE_SHARE_READ?'R':'.',
114 file->sharemode&FILE_SHARE_WRITE?'W':'.',
115 file->sharemode&FILE_SHARE_DELETE?'D':'.',
125 static const guchar *console_details (struct _WapiHandleShared *handle)
127 return(file_details (handle));
130 static const guchar *thread_details (struct _WapiHandleShared *handle)
132 static guchar buf[80];
133 struct _WapiHandle_thread *thr=&handle->u.thread;
135 g_snprintf (buf, sizeof(buf),
136 "proc: %p, state: %d, exit: %u",
137 thr->process_handle, thr->state, thr->exitstatus);
142 static const guchar *sem_details (struct _WapiHandleShared *handle)
144 static guchar buf[80];
145 struct _WapiHandle_sem *sem=&handle->u.sem;
147 g_snprintf (buf, sizeof(buf), "val: %5u, max: %5d",
153 static const guchar *mutex_details (struct _WapiHandleShared *handle)
155 static guchar buf[80];
157 struct _WapiHandle_mutex *mut=&handle->u.mutex;
159 name=_wapi_handle_scratch_lookup (mut->sharedns.name);
161 g_snprintf (buf, sizeof(buf), "[%20s] own: %5d:%5ld, count: %5u",
162 name==NULL?(guchar *)"":name, mut->pid, mut->tid,
172 static const guchar *event_details (struct _WapiHandleShared *handle)
174 static guchar buf[80];
175 struct _WapiHandle_event *event=&handle->u.event;
177 g_snprintf (buf, sizeof(buf), "manual: %s",
178 event->manual?"TRUE":"FALSE");
183 static const guchar *socket_details (struct _WapiHandleShared *handle)
185 /* Nothing to see here */
189 static const guchar *find_details (struct _WapiHandleShared *handle)
191 static guchar buf[80];
192 struct _WapiHandle_find *find=&handle->u.find;
194 g_snprintf (buf, sizeof(buf), "count: %5d",
200 static const guchar *process_details (struct _WapiHandleShared *handle)
202 static guchar buf[80];
204 struct _WapiHandle_process *proc=&handle->u.process;
206 name=_wapi_handle_scratch_lookup (proc->proc_name);
208 g_snprintf (buf, sizeof(buf), "[%20s] pid: %5u",
209 name==NULL?(guchar *)"":name, proc->id);
218 static const guchar *pipe_details (struct _WapiHandleShared *handle)
220 return(file_details (handle));