|
1 --- APC-3.0.19/apc_sem.c.ORIG Thu Aug 21 17:51:03 2008 |
|
2 +++ APC-3.0.19/apc_sem.c Thu Aug 21 17:51:58 2008 |
|
3 @@ -82,12 +82,16 @@ |
|
4 } |
|
5 } |
|
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_eprint("apc_sem_create: semctl(%d,...) failed:", semid); |
|
13 } |
|
14 + arg.val = getpid(); |
|
15 + if (semctl(semid, 1, SETVAL, arg) < 0) { |
|
16 + apc_eprint("apc_sem_create: semctl(%d,...) failed:", semid); |
|
17 + } |
|
18 } |
|
19 else if (errno == EEXIST) { |
|
20 /* sempahore already exists, don't initialize */ |
|
21 @@ -107,7 +111,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) |