| | |
| | | union semun arg; |
| | | struct sembuf sop; |
| | | |
| | | logger.info("%ld: created semaphore\n", (long)getpid()); |
| | | //logger.info("%ld: created semaphore\n", (long)getpid()); |
| | | |
| | | arg.val = 0; /* So initialize it to 0 */ |
| | | if (semctl(semid, 0, SETVAL, arg) == -1) |
| | | err_exit(errno, "semctl 1"); |
| | | logger.info("%ld: initialized semaphore\n", (long)getpid()); |
| | | //logger.info("%ld: initialized semaphore\n", (long)getpid()); |
| | | |
| | | /* Perform a "no-op" semaphore operation - changes sem_otime |
| | | so other processes can see we've initialized the set. */ |
| | |
| | | sop.sem_flg = 0; |
| | | if (semop(semid, &sop, 1) == -1) |
| | | err_exit(errno, "semop"); |
| | | logger.info("%ld: completed dummy semop()\n", (long)getpid()); |
| | | //logger.info("%ld: completed dummy semop()\n", (long)getpid()); |
| | | |
| | | } else { /* We didn't create the semaphore set */ |
| | | |
| | |
| | | if (semid == -1) |
| | | err_exit(errno, "semget 2"); |
| | | |
| | | logger.info("%ld: got semaphore key\n", (long)getpid()); |
| | | // logger.info("%ld: got semaphore key\n", (long)getpid()); |
| | | /* Wait until another process has called semop() */ |
| | | |
| | | arg.buf = &ds; |
| | | for (j = 0; j < MAX_TRIES; j++) { |
| | | logger.info("Try %d\n", j); |
| | | //logger.info("Try %d\n", j); |
| | | if (semctl(semid, 0, IPC_STAT, arg) == -1) |
| | | err_exit(errno, "semctl 2"); |
| | | |