Author: robertj
Date: 2007-08-23 02:13:25 -0400 (Thu, 23 Aug 2007)
New Revision: 84678

Modified:
   trunk/mono/ChangeLog
   trunk/mono/configure.in
   trunk/mono/mono/io-layer/ChangeLog
   trunk/mono/mono/io-layer/processes.c
   trunk/mono/mono/io-layer/processes.h
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/icall-def.h
   trunk/mono/mono/metadata/process.c
   trunk/mono/mono/metadata/process.h
Log:
In .:
2007-08-23  Robert Jordan  <[EMAIL PROTECTED]>

        * configure.in: add get|setpriority detection.

In mono/io-layer:
2007-08-23  Robert Jordan  <[EMAIL PROTECTED]>
        * processes.[c|h]: Implement Get|SetPriorityClass ().
        Code is contributed under MIT/X11 license.

In mono/metadata:
2007-08-23  Robert Jordan  <[EMAIL PROTECTED]>
        * icall-def.h, process.*: implemented Get|SetPriorityClass icalls.
        Code is contributed under MIT/X11 license.



Modified: trunk/mono/ChangeLog
===================================================================
--- trunk/mono/ChangeLog        2007-08-23 05:47:48 UTC (rev 84677)
+++ trunk/mono/ChangeLog        2007-08-23 06:13:25 UTC (rev 84678)
@@ -1,4 +1,8 @@
 
+2007-08-23  Robert Jordan  <[EMAIL PROTECTED]>
+
+       * configure.in: add get|setpriority detection.
+
 Mon Aug 20 15:23:01 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * configure.in: use more symbol renaming fo OSX (bug #82463).

Modified: trunk/mono/configure.in
===================================================================
--- trunk/mono/configure.in     2007-08-23 05:47:48 UTC (rev 84677)
+++ trunk/mono/configure.in     2007-08-23 06:13:25 UTC (rev 84678)
@@ -774,6 +774,8 @@
        AC_CHECK_FUNCS(mmap)
        AC_CHECK_FUNCS(madvise)
        AC_CHECK_FUNCS(getrusage)
+       AC_CHECK_FUNCS(getpriority)
+       AC_CHECK_FUNCS(setpriority)
 
        AC_CHECK_FUNCS(sched_setaffinity)
 

Modified: trunk/mono/mono/io-layer/ChangeLog
===================================================================
--- trunk/mono/mono/io-layer/ChangeLog  2007-08-23 05:47:48 UTC (rev 84677)
+++ trunk/mono/mono/io-layer/ChangeLog  2007-08-23 06:13:25 UTC (rev 84678)
@@ -1,4 +1,8 @@
+2007-08-23  Robert Jordan  <[EMAIL PROTECTED]>
 
+       * processes.[c|h]: Implement Get|SetPriorityClass ().
+       Code is contributed under MIT/X11 license.
+
 Tue Aug 21 20:08:09 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * io.c: made convert_arg_to_utf8() and write_file() static.

Modified: trunk/mono/mono/io-layer/processes.c
===================================================================
--- trunk/mono/mono/io-layer/processes.c        2007-08-23 05:47:48 UTC (rev 
84677)
+++ trunk/mono/mono/io-layer/processes.c        2007-08-23 06:13:25 UTC (rev 
84678)
@@ -18,6 +18,8 @@
 #include <unistd.h>
 #include <signal.h>
 #include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 #include <fcntl.h>
 
 /* sys/resource.h (for rusage) is required when using osx 10.3 (but not 10.4) 
*/
@@ -1716,3 +1718,118 @@
        return (ret == 0);
 }
 
+guint32
+GetPriorityClass (gpointer process)
+{
+#ifdef HAVE_GETPRIORITY
+       struct _WapiHandle_process *process_handle;
+       gboolean ok;
+       int ret;
+
+       ok = _wapi_lookup_handle (process, WAPI_HANDLE_PROCESS,
+                                 (gpointer *) &process_handle);
+
+       if (!ok) {
+               SetLastError (ERROR_INVALID_HANDLE);
+               return FALSE;
+       }
+
+       errno = 0;
+       ret = getpriority (PRIO_PROCESS, process_handle->id);
+       if (ret == -1 && errno != 0) {
+               switch (errno) {
+               case EPERM:
+               case EACCES:
+                       SetLastError (ERROR_ACCESS_DENIED);
+                       break;
+               case ESRCH:
+                       SetLastError (ERROR_PROC_NOT_FOUND);
+                       break;
+               default:
+                       SetLastError (ERROR_GEN_FAILURE);
+               }
+               return FALSE;
+       }
+
+       if (ret == 0)
+               return NORMAL_PRIORITY_CLASS;
+       else if (ret < -15)
+               return REALTIME_PRIORITY_CLASS;
+       else if (ret < -10)
+               return HIGH_PRIORITY_CLASS;
+       else if (ret < 0)
+               return ABOVE_NORMAL_PRIORITY_CLASS;
+       else if (ret > 10)
+               return IDLE_PRIORITY_CLASS;
+       else if (ret > 0)
+               return BELOW_NORMAL_PRIORITY_CLASS;
+
+       return NORMAL_PRIORITY_CLASS;
+#else
+       SetLastError (ERROR_NOT_SUPPORTED);
+       return 0;
+#endif
+}
+
+gboolean
+SetPriorityClass (gpointer process, guint32  priority_class)
+{
+#ifdef HAVE_SETPRIORITY
+       struct _WapiHandle_process *process_handle;
+       gboolean ok;
+       int ret;
+       int prio;
+
+       ok = _wapi_lookup_handle (process, WAPI_HANDLE_PROCESS,
+                                 (gpointer *) &process_handle);
+
+       if (!ok) {
+               SetLastError (ERROR_INVALID_HANDLE);
+               return FALSE;
+       }
+
+       switch (priority_class) {
+       case IDLE_PRIORITY_CLASS:
+               prio = 19;
+               break;
+       case BELOW_NORMAL_PRIORITY_CLASS:
+               prio = 10;
+               break;
+       case NORMAL_PRIORITY_CLASS:
+               prio = 0;
+               break;
+       case ABOVE_NORMAL_PRIORITY_CLASS:
+               prio = -5;
+               break;
+       case HIGH_PRIORITY_CLASS:
+               prio = -11;
+               break;
+       case REALTIME_PRIORITY_CLASS:
+               prio = -20;
+               break;
+       default:
+               SetLastError (ERROR_INVALID_PARAMETER);
+               return FALSE;
+       }
+
+       ret = setpriority (PRIO_PROCESS, process_handle->id, prio);
+       if (ret == -1) {
+               switch (errno) {
+               case EPERM:
+               case EACCES:
+                       SetLastError (ERROR_ACCESS_DENIED);
+                       break;
+               case ESRCH:
+                       SetLastError (ERROR_PROC_NOT_FOUND);
+                       break;
+               default:
+                       SetLastError (ERROR_GEN_FAILURE);
+               }
+       }
+
+       return ret == 0;
+#else
+       SetLastError (ERROR_NOT_SUPPORTED);
+       return FALSE;
+#endif
+}

Modified: trunk/mono/mono/io-layer/processes.h
===================================================================
--- trunk/mono/mono/io-layer/processes.h        2007-08-23 05:47:48 UTC (rev 
84677)
+++ trunk/mono/mono/io-layer/processes.h        2007-08-23 06:13:25 UTC (rev 
84678)
@@ -192,6 +192,10 @@
 
 extern gboolean TerminateProcess (gpointer process, gint32 exitCode);
 
+extern guint32 GetPriorityClass (gpointer process);
+extern gboolean SetPriorityClass (gpointer process, guint32  priority_class);
+
+
 G_END_DECLS
 
 #endif /* _WAPI_PROCESSES_H_ */

Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-08-23 05:47:48 UTC (rev 84677)
+++ trunk/mono/mono/metadata/ChangeLog  2007-08-23 06:13:25 UTC (rev 84678)
@@ -1,4 +1,8 @@
+2007-08-23  Robert Jordan  <[EMAIL PROTECTED]>
 
+       * icall-def.h, process.*: implemented Get|SetPriorityClass icalls.
+       Code is contributed under MIT/X11 license.
+
 Wed Aug 22 18:35:12 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * sgen-gc.h, sgen-gc.c: abstracted most of the OS-specific code.

Modified: trunk/mono/mono/metadata/icall-def.h
===================================================================
--- trunk/mono/mono/metadata/icall-def.h        2007-08-23 05:47:48 UTC (rev 
84677)
+++ trunk/mono/mono/metadata/icall-def.h        2007-08-23 06:13:25 UTC (rev 
84678)
@@ -166,12 +166,14 @@
 ICALL(PROCESS_3, "ExitTime_internal(intptr)", 
ves_icall_System_Diagnostics_Process_ExitTime_internal)
 ICALL(PROCESS_4, "GetModules_internal()", 
ves_icall_System_Diagnostics_Process_GetModules_internal)
 ICALL(PROCESS_5, "GetPid_internal()", 
ves_icall_System_Diagnostics_Process_GetPid_internal)
+ICALL(PROCESS_5B, "GetPriorityClass(intptr,int&)", 
ves_icall_System_Diagnostics_Process_GetPriorityClass)
 ICALL(PROCESS_6, "GetProcess_internal(int)", 
ves_icall_System_Diagnostics_Process_GetProcess_internal)
 ICALL(PROCESS_7, "GetProcesses_internal()", 
ves_icall_System_Diagnostics_Process_GetProcesses_internal)
 ICALL(PROCESS_8, "GetWorkingSet_internal(intptr,int&,int&)", 
ves_icall_System_Diagnostics_Process_GetWorkingSet_internal)
 ICALL(PROCESS_9, "Kill_internal", 
ves_icall_System_Diagnostics_Process_Kill_internal)
 ICALL(PROCESS_10, "ProcessName_internal(intptr)", 
ves_icall_System_Diagnostics_Process_ProcessName_internal)
 ICALL(PROCESS_11, "Process_free_internal(intptr)", 
ves_icall_System_Diagnostics_Process_Process_free_internal)
+ICALL(PROCESS_11B, "SetPriorityClass(intptr,int,int&)", 
ves_icall_System_Diagnostics_Process_SetPriorityClass)
 ICALL(PROCESS_12, "SetWorkingSet_internal(intptr,int,int,bool)", 
ves_icall_System_Diagnostics_Process_SetWorkingSet_internal)
 ICALL(PROCESS_13, 
"ShellExecuteEx_internal(System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process/ProcInfo&)",
 ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal)
 ICALL(PROCESS_14, "StartTime_internal(intptr)", 
ves_icall_System_Diagnostics_Process_StartTime_internal)

Modified: trunk/mono/mono/metadata/process.c
===================================================================
--- trunk/mono/mono/metadata/process.c  2007-08-23 05:47:48 UTC (rev 84677)
+++ trunk/mono/mono/metadata/process.c  2007-08-23 06:13:25 UTC (rev 84678)
@@ -1107,3 +1107,18 @@
        return 0;
 }
 
+gint32
+ves_icall_System_Diagnostics_Process_GetPriorityClass (HANDLE process, gint32 
*error)
+{
+       gint32 ret = GetPriorityClass (process);
+       *error = ret == 0 ? GetLastError () : 0;
+       return ret;
+}
+
+MonoBoolean
+ves_icall_System_Diagnostics_Process_SetPriorityClass (HANDLE process, gint32 
priority_class, gint32 *error)
+{
+       gboolean ret = SetPriorityClass (process, priority_class);
+       *error = ret == 0 ? GetLastError () : 0;
+       return ret;
+}

Modified: trunk/mono/mono/metadata/process.h
===================================================================
--- trunk/mono/mono/metadata/process.h  2007-08-23 05:47:48 UTC (rev 84677)
+++ trunk/mono/mono/metadata/process.h  2007-08-23 06:13:25 UTC (rev 84678)
@@ -64,6 +64,8 @@
 MonoBoolean ves_icall_System_Diagnostics_Process_SetWorkingSet_internal 
(HANDLE process, guint32 min, guint32 max, MonoBoolean use_min) MONO_INTERNAL;
 MonoBoolean ves_icall_System_Diagnostics_Process_Kill_internal (HANDLE 
process, gint32 sig) MONO_INTERNAL;
 gint64 ves_icall_System_Diagnostics_Process_Times (HANDLE process, gint32 
type) MONO_INTERNAL;
+gint32 ves_icall_System_Diagnostics_Process_GetPriorityClass (HANDLE process, 
gint32 *error) MONO_INTERNAL;
+MonoBoolean ves_icall_System_Diagnostics_Process_SetPriorityClass (HANDLE 
process, gint32 priority_class, gint32 *error) MONO_INTERNAL;
 
 G_END_DECLS
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to