Mon Oct 1 14:39:11 CEST 2007 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / handles / hps.c
1 #include <config.h>
2 #include <glib.h>
3
4 #include <mono/io-layer/io-layer.h>
5
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>
11
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);
19
20 /* This depends on the ordering of the enum WapiHandleType in
21  * io-layer/wapi-private.h
22  */
23 static const guchar * (*details[])(struct _WapiHandleShared *)=
24 {
25         unused_details,
26         unshared_details,               /* file */
27         unshared_details,               /* console */
28         thread_details,
29         unshared_details,               /* sem */
30         unshared_details,               /* mutex */
31         unshared_details,               /* event */
32         unshared_details,               /* socket */
33         unshared_details,               /* find */
34         process_details,
35         unshared_details,               /* pipe */
36         namedmutex_details,
37         namedsem_details,
38         namedevent_details,
39         unused_details,
40 };
41
42 int main (int argc, char **argv)
43 {
44         guint32 i;
45         guint32 now;
46
47         _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
48         if (_wapi_shared_layout == NULL) {
49                 g_error ("Failed to attach shared memory!");
50                 exit (-1);
51         }
52
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!");
56                 exit (-1);
57         }
58         
59         if (argc > 1) {
60                 _wapi_shm_semaphores_init ();
61                 _wapi_collection_init ();
62                 _wapi_handle_collect ();
63         }
64         
65         g_print ("collection: %d sem: 0x%x\n",
66                  _wapi_shared_layout->collection_count,
67                  _wapi_shared_layout->sem_key);
68         
69         now = (guint32)(time(NULL) & 0xFFFFFFFF);
70         for (i = 0; i < _WAPI_HANDLE_INITIAL_COUNT; i++) {
71                 struct _WapiHandleShared *shared;
72                 
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));
81                 }
82         }
83
84         g_print ("Fileshare hwm: %d\n", _wapi_fileshare_layout->hwm);
85         
86         for (i = 0; i <= _wapi_fileshare_layout->hwm; i++) {
87                 struct _WapiFileShare *file_share;
88                 
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);
92                 }
93         }
94         
95         exit (0);
96 }
97
98 static const guchar *unused_details (struct _WapiHandleShared *handle)
99 {
100         return("unused details");
101 }
102
103 static const guchar *unshared_details (struct _WapiHandleShared *handle)
104 {
105         return("unshared details");
106 }
107
108 static const guchar *thread_details (struct _WapiHandleShared *handle)
109 {
110         static guchar buf[80];
111         struct _WapiHandle_thread *thr=&handle->u.thread;
112
113         g_snprintf (buf, sizeof(buf),
114                     "proc: %d, state: %d, exit: %u, join: %d",
115                     thr->owner_pid, thr->state, thr->exitstatus,
116                     thr->joined);
117         
118         return(buf);
119 }
120
121 static const guchar *namedmutex_details (struct _WapiHandleShared *handle)
122 {
123         static guchar buf[80];
124         gchar *name;
125         struct _WapiHandle_namedmutex *mut=&handle->u.namedmutex;
126         
127         name = mut->sharedns.name;
128         
129         g_snprintf (buf, sizeof(buf), "[%15s] own: %5d:%5ld, count: %5u",
130                     name==NULL?(gchar *)"":name, mut->pid, mut->tid,
131                     mut->recursion);
132
133         return(buf);
134 }
135
136 static const guchar *namedsem_details (struct _WapiHandleShared *handle)
137 {
138         static guchar buf[80];
139         gchar *name;
140         struct _WapiHandle_namedsem *sem = &handle->u.namedsem;
141         
142         name = sem->sharedns.name;
143         
144         g_snprintf (buf, sizeof(buf), "[%15s] val: %5u, max: %5d",
145                     name == NULL?(gchar *)"":name, sem->val, sem->max);
146
147         return(buf);
148 }
149
150 static const guchar *namedevent_details (struct _WapiHandleShared *handle)
151 {
152         static guchar buf[80];
153         gchar *name;
154         struct _WapiHandle_namedevent *event = &handle->u.namedevent;
155         
156         name = event->sharedns.name;
157         
158         g_snprintf (buf, sizeof(buf), "[%15s] %s count: %5u",
159                     name == NULL?(gchar *)"":name,
160                     event->manual?"Manual":"Auto", event->set_count);
161
162         return(buf);
163 }
164
165 static const guchar *process_details (struct _WapiHandleShared *handle)
166 {
167         static guchar buf[80];
168         gchar *name;
169         struct _WapiHandle_process *proc=&handle->u.process;
170         
171         name = proc->proc_name;
172         
173         g_snprintf (buf, sizeof(buf), "[%25.25s] pid: %5u exit: %u",
174                     name==NULL?(gchar *)"":name, proc->id, proc->exitstatus);
175         
176         return(buf);
177 }