Re: cvs: php4 /ext/sysvsem php_sysvsem.h sysvsem.c
| From: | derick@php.net | Date: | Fri, 17 May 2002 12:35:38 +0000 |
| Subject: | Re: cvs: php4 /ext/sysvsem php_sysvsem.h sysvsem.c | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-11973@lists.php.net to get a copy of this message | ||
On Fri, 17 May 2002, Wez Furlong wrote:
> 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)
Can you merge this bugfix to the branch?
Derick
>
>
> 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;
> }
>
> /* }}} */
>
>
>
> --
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
---------------------------------------------------------------------------
Did I help you? http://www.jdimedia.nl/derick/link.php?url=giftlist
Frequent ranting: http://www.jdimedia.nl/derick/
---------------------------------------------------------------------------
PHP: Scripting the Web - derick@php.net
All your branches are belong to me!
SRM: Script Running Machine - www.vl-srm.net
---------------------------------------------------------------------------