components/php-5_3/APC/patches/04-apc_sem.c.patch
changeset 4987 6a82655eda42
parent 4986 90a869b3f47a
child 4988 4b69c7c7e09b
equal deleted inserted replaced
4986:90a869b3f47a 4987:6a82655eda42
     1 --- APC-3.1.9/apc_sem.c_orig	Sat May 14 15:14:56 2011
       
     2 +++ APC-3.1.9/apc_sem.c	Tue Dec 13 16:01:59 2011
       
     3 @@ -76,12 +76,16 @@
       
     4      union semun arg;
       
     5      key_t key = IPC_PRIVATE;
       
     6  
       
     7 -    if ((semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms)) >= 0) {
       
     8 +    if ((semid = semget(key, 2, IPC_CREAT | IPC_EXCL | perms)) >= 0) {
       
     9          /* sempahore created for the first time, initialize now */
       
    10          arg.val = initval;
       
    11          if (semctl(semid, 0, SETVAL, arg) < 0) {
       
    12              apc_error("apc_sem_create: semctl(%d,...) failed:" TSRMLS_CC, semid);
       
    13          }
       
    14 +	arg.val = getpid();
       
    15 +	if (semctl(semid, 1, SETVAL, arg) < 0) {
       
    16 +	    apc_error("apc_sem_create: semctl(%d,...) failed:", TSRMLS_CC, semid);
       
    17 +	}
       
    18      }
       
    19      else if (errno == EEXIST) {
       
    20          /* sempahore already exists, don't initialize */
       
    21 @@ -101,7 +105,10 @@
       
    22  {
       
    23      /* we expect this call to fail often, so we do not check */
       
    24      union semun arg;
       
    25 -    semctl(semid, 0, IPC_RMID, arg);
       
    26 +    int semPid = semctl(semid, 1, GETVAL, 0);
       
    27 +    if (semPid == getpid()) {
       
    28 +        semctl(semid, 0, IPC_RMID, arg);
       
    29 +    }
       
    30  }
       
    31  
       
    32  void apc_sem_lock(int semid TSRMLS_DC)