[runtime] Added helper methods to iterate MonoInst with filters.
[mono.git] / mono / mini / wapihandles.c
index ceeb070befbdebeae553eaf258c15847d0e2991e..7bda38843ef4d8df290858f41da479d940727c6c 100644 (file)
@@ -1,7 +1,9 @@
 #include <config.h>
 #include <glib.h>
 
-#ifdef PLATFORM_WIN32
+#include "mini.h"
+
+#if defined(HOST_WIN32) || !defined(HAVE_SYS_IPC_H) || !defined(HAVE_SYS_SEM_H) || (defined(__native_client__) && defined(__GLIBC__)) || defined(DISABLE_SHARED_HANDLES)
 
 int mini_wapi_hps (int argc, char **argv)
 {
@@ -13,6 +15,11 @@ int mini_wapi_semdel (int argc, char **argv)
        return 0;
 }
 
+int mini_wapi_seminfo (int argc, char **argv)
+{
+       return 0;
+}
+
 #else
 
 #include <errno.h>
@@ -27,29 +34,30 @@ int mini_wapi_semdel (int argc, char **argv)
 #include <mono/io-layer/shared.h>
 #include <mono/io-layer/collection.h>
 
-static const guchar *unused_details (struct _WapiHandleShared *handle);
-static const guchar *unshared_details (struct _WapiHandleShared *handle);
-static const guchar *thread_details (struct _WapiHandleShared *handle);
-static const guchar *namedmutex_details (struct _WapiHandleShared *handle);
-static const guchar *namedsem_details (struct _WapiHandleShared *handle);
-static const guchar *namedevent_details (struct _WapiHandleShared *handle);
-static const guchar *process_details (struct _WapiHandleShared *handle);
+static const gchar *unused_details (struct _WapiHandleShared *handle);
+static const gchar *unshared_details (struct _WapiHandleShared *handle);
+#if 0
+static const gchar *thread_details (struct _WapiHandleShared *handle);
+#endif
+static const gchar *namedmutex_details (struct _WapiHandleShared *handle);
+static const gchar *namedsem_details (struct _WapiHandleShared *handle);
+static const gchar *namedevent_details (struct _WapiHandleShared *handle);
 
 /* This depends on the ordering of the enum WapiHandleType in
  * io-layer/wapi-private.h
  */
-static const guchar * (*details[])(struct _WapiHandleShared *)=
+static const gchar * (*details[])(struct _WapiHandleShared *)=
 {
        unused_details,
        unshared_details,               /* file */
        unshared_details,               /* console */
-       thread_details,
+       unshared_details,               /* thread */
        unshared_details,               /* sem */
        unshared_details,               /* mutex */
        unshared_details,               /* event */
        unshared_details,               /* socket */
        unshared_details,               /* find */
-       process_details,
+       unshared_details,       /* process */
        unshared_details,               /* pipe */
        namedmutex_details,
        namedsem_details,
@@ -106,39 +114,41 @@ int mini_wapi_hps (int argc, char **argv)
                
                file_share = &_wapi_fileshare_layout->share_info[i];
                if (file_share->handle_refs > 0) {
-                       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);
+                       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);
                }
        }
        
        exit (0);
 }
 
-static const guchar *unused_details (struct _WapiHandleShared *handle)
+static const gchar *unused_details (struct _WapiHandleShared *handle)
 {
        return("unused details");
 }
 
-static const guchar *unshared_details (struct _WapiHandleShared *handle)
+static const gchar *unshared_details (struct _WapiHandleShared *handle)
 {
        return("unshared details");
 }
 
-static const guchar *thread_details (struct _WapiHandleShared *handle)
+#if 0
+static const gchar *thread_details (struct _WapiHandleShared *handle)
 {
-       static guchar buf[80];
+       static gchar buf[80];
        struct _WapiHandle_thread *thr=&handle->u.thread;
 
        g_snprintf (buf, sizeof(buf),
-                   "proc: %d, state: %d, exit: %u, join: %d",
-                   thr->owner_pid, thr->state, thr->exitstatus,
+                   "proc: %d, tid: %ld, state: %d, exit: %u, join: %d",
+                   thr->owner_pid, thr->id, thr->state, thr->exitstatus,
                    thr->joined);
        
        return(buf);
 }
+#endif
 
-static const guchar *namedmutex_details (struct _WapiHandleShared *handle)
+static const gchar *namedmutex_details (struct _WapiHandleShared *handle)
 {
-       static guchar buf[80];
+       static gchar buf[80];
        gchar *name;
        struct _WapiHandle_namedmutex *mut=&handle->u.namedmutex;
        
@@ -151,9 +161,9 @@ static const guchar *namedmutex_details (struct _WapiHandleShared *handle)
        return(buf);
 }
 
-static const guchar *namedsem_details (struct _WapiHandleShared *handle)
+static const gchar *namedsem_details (struct _WapiHandleShared *handle)
 {
-       static guchar buf[80];
+       static gchar buf[80];
        gchar *name;
        struct _WapiHandle_namedsem *sem = &handle->u.namedsem;
        
@@ -165,9 +175,9 @@ static const guchar *namedsem_details (struct _WapiHandleShared *handle)
        return(buf);
 }
 
-static const guchar *namedevent_details (struct _WapiHandleShared *handle)
+static const gchar *namedevent_details (struct _WapiHandleShared *handle)
 {
-       static guchar buf[80];
+       static gchar buf[80];
        gchar *name;
        struct _WapiHandle_namedevent *event = &handle->u.namedevent;
        
@@ -180,33 +190,20 @@ static const guchar *namedevent_details (struct _WapiHandleShared *handle)
        return(buf);
 }
 
-static const guchar *process_details (struct _WapiHandleShared *handle)
-{
-       static guchar buf[80];
-       gchar *name;
-       struct _WapiHandle_process *proc=&handle->u.process;
-       
-       name = proc->proc_name;
-       
-       g_snprintf (buf, sizeof(buf), "[%25.25s] pid: %5u exit: %u",
-                   name==NULL?(gchar *)"":name, proc->id, proc->exitstatus);
-       
-       return(buf);
-}
-
 /* The old handles/semdel.c */
 int mini_wapi_semdel (int argc, char **argv)
 {
        int sem_id, ret;
        
        _wapi_shared_layout = _wapi_shm_attach(WAPI_SHM_DATA);
-       if (_wapi_shared_layout == FALSE) {
+       if (_wapi_shared_layout == FALSE ||
+           _wapi_shared_layout->sem_key == 0) {
                exit (0);
        }
 
        sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
        if (sem_id != -1) {
-               ret = semctl (sem_id, IPC_RMID, 0);
+               ret = semctl (sem_id, 0, IPC_RMID);
                if (ret == -1) {
                        g_message ("Error deleting semaphore: %s",
                                   g_strerror (errno));
@@ -216,5 +213,62 @@ int mini_wapi_semdel (int argc, char **argv)
        exit (0);
 }
 
+static void sem_explain (int sem_id, ushort *vals, int which)
+{
+       pid_t pid;
+       
+       g_print ("%d ", vals[which]);
+       if (vals[which] >= 1) {
+               g_print ("(Unlocked)");
+       } else {
+               pid = semctl (sem_id, which, GETPID);
+               
+               g_print ("(Locked by %d)", pid);
+       }
+       g_print ("\n");
+}
+
+int mini_wapi_seminfo (int argc, char **argv)
+{
+       int sem_id, ret;
+       union semun
+       {
+               int val;
+               struct semid_ds *buf;
+               ushort *array;
+       } arg;
+       ushort vals[_WAPI_SHARED_SEM_COUNT];
+       
+       _wapi_shared_layout = _wapi_shm_attach (WAPI_SHM_DATA);
+       if (_wapi_shared_layout == FALSE ||
+           _wapi_shared_layout->sem_key == 0) {
+               exit (0);
+       }
+       
+       sem_id = semget (_wapi_shared_layout->sem_key, _WAPI_SHARED_SEM_COUNT, 0600);
+       if (sem_id != -1) {
+               g_print ("Getting values for sem: 0x%x\n",
+                        _wapi_shared_layout->sem_key);
+               arg.array = vals;
+               ret = semctl (sem_id, 0, GETALL, arg);
+               if (ret != -1) {
+                       g_print ("Namespace: ");
+                       sem_explain (sem_id, vals, _WAPI_SHARED_SEM_NAMESPACE);
+                       g_print ("Fileshare: ");
+                       sem_explain (sem_id, vals, _WAPI_SHARED_SEM_FILESHARE);
+                       g_print ("Handles: ");
+                       sem_explain (sem_id, vals,
+                                    _WAPI_SHARED_SEM_SHARED_HANDLES);
+                       g_print ("Count lock: ");
+                       sem_explain (sem_id, vals,
+                                    _WAPI_SHARED_SEM_PROCESS_COUNT_LOCK);
+                       g_print ("Count: %d\n",
+                                vals[_WAPI_SHARED_SEM_PROCESS_COUNT]);
+               }
+       }
+       
+       exit (0);
+}
+
 #endif