cvs: php4(PHP_4_2_0) /ext/sysvsem php_sysvsem.h sysvsem.c
| From: | Derick Rethans | Date: | Mon, 24 Jun 2002 08:42:33 +0000 |
| Subject: | cvs: php4(PHP_4_2_0) /ext/sysvsem php_sysvsem.h sysvsem.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-12485@lists.php.net to get a copy of this message | ||
derick Mon Jun 24 04:42:33 2002 EDT
Modified files: (Branch: PHP_4_2_0)
/php4/ext/sysvsem php_sysvsem.h sysvsem.c
Log:
- MFH
Index: php4/ext/sysvsem/php_sysvsem.h
diff -u php4/ext/sysvsem/php_sysvsem.h:1.11 php4/ext/sysvsem/php_sysvsem.h:1.11.2.1
--- php4/ext/sysvsem/php_sysvsem.h:1.11 Thu Feb 28 03:26:51 2002
+++ php4/ext/sysvsem/php_sysvsem.h Mon Jun 24 04:42:30 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.11.2.1 2002/06/24 08:42:30 derick 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.38.2.1 php4/ext/sysvsem/sysvsem.c:1.38.2.2
--- php4/ext/sysvsem/sysvsem.c:1.38.2.1 Thu Mar 28 02:35:09 2002
+++ php4/ext/sysvsem/sysvsem.c Mon Jun 24 04:42:30 2002
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: sysvsem.c,v 1.38.2.1 2002/03/28 07:35:09 derick Exp $ */
+/* $Id: sysvsem.c,v 1.38.2.2 2002/06/24 08:42:30 derick Exp $ */
/* Latest update build anc tested on Linux 2.2.14
*
@@ -108,12 +108,14 @@
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 +132,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 +158,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 +174,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 +272,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,11 +357,12 @@
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;
@@ -403,29 +379,30 @@
}
#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;
}
/* }}} */