cvs: php4 /ext/sysvsem php_sysvsem.h sysvsem.c

From: Date: Fri, 17 May 2002 12:33:50 +0000
Subject: cvs: php4 /ext/sysvsem php_sysvsem.h sysvsem.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-11972@lists.php.net to get a copy of this message
wez Fri May 17 08:33:50 2002 EDT Modified files: /php4/ext/sysvsem php_sysvsem.h sysvsem.c Log: Add an optional flag to sem_get that specifies if the semaphore should be automatically released on request shutdown. (#16986) Fix a segfault in sem_remove (#17274) Index: php4/ext/sysvsem/php_sysvsem.h diff -u php4/ext/sysvsem/php_sysvsem.h:1.11 php4/ext/sysvsem/php_sysvsem.h:1.12 --- php4/ext/sysvsem/php_sysvsem.h:1.11 Thu Feb 28 03:26:51 2002 +++ php4/ext/sysvsem/php_sysvsem.h Fri May 17 08:33:48 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_sysvsem.h,v 1.11 2002/02/28 08:26:51 sebastian Exp $ */ +/* $Id: php_sysvsem.h,v 1.12 2002/05/17 12:33:48 wez Exp $ */ #ifndef PHP_SYSVSEM_H #define PHP_SYSVSEM_H @@ -41,6 +41,7 @@ int key; /* For error reporting. */ int semid; /* Returned by semget(). */ int count; /* Acquire count for auto-release. */ + int auto_release; /* flag that says to auto-release. */ } sysvsem_sem; extern sysvsem_module php_sysvsem_module; Index: php4/ext/sysvsem/sysvsem.c diff -u php4/ext/sysvsem/sysvsem.c:1.39 php4/ext/sysvsem/sysvsem.c:1.40 --- php4/ext/sysvsem/sysvsem.c:1.39 Thu Mar 28 02:36:02 2002 +++ php4/ext/sysvsem/sysvsem.c Fri May 17 08:33:49 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sysvsem.c,v 1.39 2002/03/28 07:36:02 derick Exp $ */ +/* $Id: sysvsem.c,v 1.40 2002/05/17 12:33:49 wez Exp $ */ /* Latest update build anc tested on Linux 2.2.14 * @@ -107,13 +107,13 @@ { sysvsem_sem *sem_ptr = (sysvsem_sem *)rsrc->ptr; struct sembuf sop[2]; - + int opcount = 1; /* * if count == -1, semaphore has been removed * Need better way to handle this */ - if(sem_ptr->count == -1) { + if(sem_ptr->count == -1 || !sem_ptr->auto_release) { return; } /* Decrement the usage count. */ @@ -130,8 +130,10 @@ sop[1].sem_num = SYSVSEM_SEM; sop[1].sem_op = sem_ptr->count; sop[1].sem_flg = SEM_UNDO; + + opcount++; } - if (semop(sem_ptr->semid, sop, sem_ptr->count ? 2 : 1) == -1) { + if (semop(sem_ptr->semid, sop, opcount) == -1) { php_error(E_WARNING, "semop() failed in release_sysvsem_sem for key 0x%x: %s", sem_ptr->key, strerror(errno)); } @@ -154,12 +156,11 @@ #undef SETVAL_WANTS_PTR #endif -/* {{{ proto int sem_get(int key [, int max_acquire [, int perm]]) +/* {{{ proto int sem_get(int key [, int max_acquire [, int perm [, int auto_release]]) Return an id for the semaphore with the given key, and allow max_acquire (default 1) processes to acquire it simultaneously */ PHP_FUNCTION(sem_get) { - pval **arg_key, **arg_max_acquire, **arg_perm; - int key, max_acquire, perm; + int key, max_acquire, perm, auto_release = 1; int semid; struct sembuf sop[3]; int count; @@ -171,37 +172,8 @@ max_acquire = 1; perm = 0666; - switch (ZEND_NUM_ARGS()) { - case 1: - if (zend_get_parameters_ex(1, &arg_key)==FAILURE) { - RETURN_FALSE; - } - convert_to_long_ex(arg_key); - key = (int)Z_LVAL_PP(arg_key); - break; - case 2: - if (zend_get_parameters_ex(2, &arg_key, &arg_max_acquire)==FAILURE) { - RETURN_FALSE; - } - convert_to_long_ex(arg_key); - key = (int)Z_LVAL_PP(arg_key); - convert_to_long_ex(arg_max_acquire); - max_acquire = (int)Z_LVAL_PP(arg_max_acquire); - break; - case 3: - if (zend_get_parameters_ex(3, &arg_key, &arg_max_acquire, &arg_perm)==FAILURE) { - RETURN_FALSE; - } - convert_to_long_ex(arg_key); - convert_to_long_ex(arg_max_acquire); - convert_to_long_ex(arg_perm); - key = (int)Z_LVAL_PP(arg_key); - max_acquire = (int)Z_LVAL_PP(arg_max_acquire); - perm = (int)Z_LVAL_PP(arg_perm); - break; - default: - WRONG_PARAM_COUNT; - break; + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|lll", &key, &max_acquire, &perm, &auto_release)) { + RETURN_FALSE; } /* Get/create the semaphore. Note that we rely on the semaphores @@ -298,6 +270,7 @@ sem_ptr->key = key; sem_ptr->semid = semid; sem_ptr->count = 0; + sem_ptr->auto_release = auto_release; Z_LVAL_P(return_value) = zend_list_insert(sem_ptr, php_sysvsem_module.le_sem); Z_TYPE_P(return_value) = IS_LONG; @@ -382,50 +355,53 @@ PHP_FUNCTION(sem_remove) { - pval **arg_id; - int id,type; + pval **arg_id; + int id,type; sysvsem_sem *sem_ptr; #if HAVE_SEMUN union semun un; + struct semid_ds buf; #endif - if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg_id) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_long_ex(arg_id); - - id = Z_LVAL_PP(arg_id); - - sem_ptr = (sysvsem_sem *) zend_list_find(id, &type); - - if (type!=php_sysvsem_module.le_sem) { - php_error(E_WARNING, "%d is not a SysV semaphore index", id); - RETURN_FALSE; - } + + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg_id) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_long_ex(arg_id); + + id = Z_LVAL_PP(arg_id); + + sem_ptr = (sysvsem_sem *) zend_list_find(id, &type); + + if (type!=php_sysvsem_module.le_sem) { + php_error(E_WARNING, "%d is not a SysV semaphore index", id); + RETURN_FALSE; + } #if HAVE_SEMUN - if(semctl(sem_ptr->semid,NULL,IPC_STAT,un)<0) { + un.buf = &buf; + if(semctl(sem_ptr->semid, 0, IPC_STAT, &un) < 0) { #else - if(semctl(sem_ptr->semid,NULL,IPC_STAT,NULL)<0) { + if(semctl(sem_ptr->semid, 0, IPC_STAT, NULL) < 0) { #endif - php_error(E_WARNING, "%d is not a existing SysV Semaphore Id", id); - RETURN_FALSE; - } + php_error(E_WARNING, "%d is not a existing SysV Semaphore Id", id); + RETURN_FALSE; + } #if HAVE_SEMUN - if(semctl(sem_ptr->semid,NULL,IPC_RMID,un)<0) { + if(semctl(sem_ptr->semid, 0, IPC_RMID, &un) < 0) { #else - if(semctl(sem_ptr->semid,NULL,IPC_RMID,NULL)<0) { + if(semctl(sem_ptr->semid, 0, IPC_RMID, NULL) < 0) { #endif - php_error(E_WARNING, "sem_remove() failed for id %d: %s", id, strerror(errno)); - RETURN_FALSE; - } + php_error(E_WARNING, "sem_remove() failed for id %d: %s", id, strerror(errno)); + RETURN_FALSE; + } /* let release_sysvsem_sem know we have removed * the semaphore to avoid issues with releasing. */ sem_ptr->count = -1; - RETURN_TRUE; + RETURN_TRUE; } /* }}} */

« previous php.cvs (#11972) next »