]> granicus.if.org Git - php/commitdiff
Added pcntl_setpriority & pcntl_getpriority(). These functions can be used
authorIlia Alshanetsky <iliaa@php.net>
Tue, 18 Feb 2003 01:41:06 +0000 (01:41 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Tue, 18 Feb 2003 01:41:06 +0000 (01:41 +0000)
to fetch and alter the priority of a process.

ext/pcntl/config.m4
ext/pcntl/pcntl.c
ext/pcntl/php_pcntl.h

index f24f038cb9b68d3c4824b790188bdbd47efd9840..1675173474aedbd16c2d73e231d64691f8adeab4 100644 (file)
@@ -13,6 +13,9 @@ if test "$PHP_PCNTL" != "no"; then
   AC_CHECK_FUNCS(fork, [ AC_DEFINE(HAVE_FORK,1,[ ]) ], [ AC_MSG_ERROR(pcntl: fork() not supported by this platform) ])
   AC_CHECK_FUNCS(waitpid, [ AC_DEFINE(HAVE_WAITPID,1,[ ]) ], [ AC_MSG_ERROR(pcntl: fork() not supported by this platform) ])
   AC_CHECK_FUNCS(sigaction, [ AC_DEFINE(HAVE_SIGACTION,1,[ ]) ], [ AC_MSG_ERROR(pcntl: sigaction() not supported by this platform) ])
-  
+
+  PHP_CHECK_FUNC(getpriority)
+  PHP_CHECK_FUNC(setpriority)
+   
   PHP_NEW_EXTENSION(pcntl, pcntl.c php_signal.c, $ext_shared, cli)
 fi
index 6c986d8c66b96db0ce047675397139f4a937bc3c..bc639c15b7dc2e65c8e8a613d91c8fbc75d786a7 100755 (executable)
 #include "ext/standard/info.h"
 #include "php_pcntl.h"
 
+#if HAVE_GETPRIORITY || HAVE_SETPRIORITY
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+
 ZEND_DECLARE_MODULE_GLOBALS(pcntl)
 
 function_entry pcntl_functions[] = {
@@ -50,6 +55,8 @@ function_entry pcntl_functions[] = {
        PHP_FE(pcntl_wstopsig,          NULL)
        PHP_FE(pcntl_exec,                      NULL)
        PHP_FE(pcntl_alarm,                     NULL)
+       PHP_FE(pcntl_getpriority,       NULL)
+       PHP_FE(pcntl_setpriority,       NULL)
        {NULL, NULL, NULL}      
 };
 
@@ -132,6 +139,12 @@ void php_register_signal_constants(INIT_FUNC_ARGS)
 #endif
        REGISTER_LONG_CONSTANT("SIGSYS",   (long) SIGSYS, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("SIGBABY",  (long) SIGSYS, CONST_CS | CONST_PERSISTENT);
+
+#if HAVE_GETPRIORITY || HAVE_SETPRIORITY
+       REGISTER_LONG_CONSTANT("PRIO_PGRP", PRIO_PGRP, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PRIO_USER", PRIO_USER, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PRIO_PROCESS", PRIO_PROCESS, CONST_CS | CONST_PERSISTENT);
+#endif
 }
 
 static void php_pcntl_init_globals(zend_pcntl_globals *pcntl_globals)
@@ -494,6 +507,83 @@ PHP_FUNCTION(pcntl_signal)
 }
 /* }}} */
 
+#ifdef HAVE_GETPRIORITY
+/* {{{ proto int pcntl_getpriority(int pid, [int process_identifier]])
+   Get the priority of any process */
+PHP_FUNCTION(pcntl_getpriority)
+{
+       long who = PRIO_PROCESS;
+       long pid = getpid();
+       int pri;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &pid, &who) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       /* needs to be cleared, since any returned value is valid */ 
+       errno = 0;
+
+       pri = getpriority(who, pid);
+
+       if (errno) {
+               switch (errno) {
+                       case ESRCH:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: No process was located using the given parameters.", errno);
+                               break;
+                       case EINVAL:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: Invalid identifier flag.", errno);
+                               break;
+                       default:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error %l has occured.", errno);
+                               break;
+               }
+               RETURN_FALSE;
+       }
+
+       RETURN_LONG(pri);
+}
+/* }}} */
+#endif
+
+#ifdef HAVE_SETPRIORITY
+/* {{{ proto bool pcntl_setpriority(int priority, [int pid, [int process_identifier]])
+   Change the priority of any process */
+PHP_FUNCTION(pcntl_setpriority)
+{
+       long who = PRIO_PROCESS;
+       long pid = getpid();
+       long pri;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ll", &pri, &pid, &who) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       if (setpriority(who, pid, pri)) {
+               switch (errno) {
+                       case ESRCH:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: No process was located using the given parameters.", errno);
+                               break;
+                       case EINVAL:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: Invalid identifier flag.", errno);
+                               break;
+                       case EPERM:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: A process was located, but neither its effective nor real user ID matched the effective user ID of the caller.", errno);
+                               break;
+                       case EACCES:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "%l: Only a super user may attempt to increase the process priority.", errno);
+                               break;
+                       default:
+                               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error %l has occured.", errno);
+                               break;
+               }
+               RETURN_FALSE;
+       }
+       
+       RETURN_TRUE;
+}
+/* }}} */
+#endif
+
 /* Our custom signal handler that calls the appropriate php_function */
 static void pcntl_signal_handler(int signo)
 {
index ecbbd263d1160f51a7765ad2bd857a47ce849d31..ccca57813f3cbaca8379d4591c989e0f80097f74 100644 (file)
@@ -50,6 +50,8 @@ PHP_FUNCTION(pcntl_wtermsig);
 PHP_FUNCTION(pcntl_wstopsig);
 PHP_FUNCTION(pcntl_signal);
 PHP_FUNCTION(pcntl_exec);
+PHP_FUNCTION(pcntl_getpriority);
+PHP_FUNCTION(pcntl_setpriority);
 
 static void pcntl_signal_handler(int);
 static void pcntl_tick_handler();