Merge pull request #1624 from esdrubal/getprocesstimes
[mono.git] / mono / io-layer / processes.c
index 5b25291a444b578b7cd44ab1e0ff1f66f711d7be..ce7aee14c884732d669200fc8bcbc3a2599d718b 100644 (file)
@@ -90,6 +90,7 @@
 #include <mono/utils/mono-membar.h>
 #include <mono/utils/mono-mutex.h>
 #include <mono/utils/mono-signal-handler.h>
+#include <mono/utils/mono-proclib.h>
 
 /* The process' environment strings */
 #if defined(__APPLE__) && !defined (__arm__) && !defined (__aarch64__)
@@ -1309,11 +1310,19 @@ GetProcessTimes (gpointer process, WapiFileTime *create_time,
                /* Not sure if w32 allows NULLs here or not */
                return FALSE;
        
-       if (WAPI_IS_PSEUDO_PROCESS_HANDLE (process))
-               /* This is a pseudo handle, so just fail for now
-                */
-               return FALSE;
-       
+       if (WAPI_IS_PSEUDO_PROCESS_HANDLE (process)) {
+               gpointer pid = GINT_TO_POINTER (WAPI_HANDLE_TO_PID(process));
+               gint64 start_ticks, user_ticks, kernel_ticks;
+
+               mono_process_get_times (pid, &start_ticks, &user_ticks, &kernel_ticks);
+
+               _wapi_guint64_to_filetime (start_ticks, create_time);
+               _wapi_guint64_to_filetime (user_ticks, kernel_time);
+               _wapi_guint64_to_filetime (kernel_ticks, user_time);
+
+               return TRUE;
+       }
+
        process_handle = lookup_process_handle (process);
        if (!process_handle) {
                DEBUG ("%s: Can't find process %p", __func__, process);
@@ -2473,19 +2482,17 @@ mono_processes_cleanup (void)
                         * This code can run parallel with the sigchld handler, but the
                         * modifications it makes are safe.
                         */
-                       if (mp == mono_processes) {
+                       if (mp == mono_processes)
                                mono_processes = mp->next;
-                       } else {
-                               if (mp == mono_processes) {
-                                       mono_processes = mp->next;
-                               } else {
-                                       prev->next = mp->next;
-                               }
-                       }
+                       else
+                               prev->next = mp->next;
                        finished = g_slist_prepend (finished, mp);
+
+                       mp = mp->next;
+               } else {
+                       prev = mp;
+                       mp = mp->next;
                }
-               prev = mp;
-               mp = mp->next;
        }
 
        mono_memory_barrier ();
@@ -2502,7 +2509,7 @@ mono_processes_cleanup (void)
        }
        g_slist_free (finished);
 
-       mono_mutex_lock (&mono_processes_mutex);
+       mono_mutex_unlock (&mono_processes_mutex);
 
        DEBUG ("%s done", __func__);