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) |
|