From 09a82c2ece4caadad0baa0d1f3b84f1506363fdd Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期五, 22 一月 2021 11:58:33 +0800 Subject: [PATCH] update --- src/svsem.cpp | 105 +++++++++++++++++++++++++++++++--------------------- 1 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/svsem.cpp b/src/svsem.cpp index 54db4a2..82390b6 100644 --- a/src/svsem.cpp +++ b/src/svsem.cpp @@ -6,7 +6,7 @@ perms = S_IRUSR | S_IWUSR; - semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms); + semid = semget(key, 2, IPC_CREAT | IPC_EXCL | perms); if (semid != -1) { /* Successfully created the semaphore */ union semun arg; @@ -17,6 +17,10 @@ arg.val = 0; /* So initialize it to 0 */ if (semctl(semid, 0, SETVAL, arg) == -1) err_exit(errno, "semctl 1"); + + arg.val = 1; + if (semctl(semid, 1, SETVAL, arg) == -1) + err_exit(errno, "semctl 2"); //logger.info("%ld: initialized semaphore\n", (long)getpid()); /* Perform a "no-op" semaphore operation - changes sem_otime @@ -135,6 +139,63 @@ } + + +int svsem_cond_wait(int semid ){ + + struct sembuf sops[2]; + union semun arg; + + arg.val = 1; + if (semctl(semid, 1, SETVAL, arg) == -1) { + err_msg(errno, "svsem_set"); + return errno; + } + + //閲婃斁mutex + sops[0].sem_num = 0; + sops[0].sem_op = 1; + sops[0].sem_flg = 0; + + // 绛夊緟cond + sops[1].sem_num = 1; + sops[1].sem_op = 0; + sops[1].sem_flg = 0; + + while (semop(semid, sops, 2) == -1) + if (errno != EINTR) { + // err_msg(errno, "Svsvsem_dec"); + return errno; + } + + + //閲嶆柊鑾峰彇mutex + sops[0].sem_num = 0; + sops[0].sem_op = -1; + sops[0].sem_flg = 0; + + while (semop(semid, sops, 1) == -1) + if (errno != EINTR) { + // err_msg(errno, "Svsvsem_dec"); + return errno; + } + + return 0; +} + + +int svsem_cond_signal(int semid ){ + union semun arg; + arg.val = 0; + + if (semctl(semid, 1, SETVAL, arg) == -1) { + err_msg(errno, "svsem_set"); + return errno; + } + return 0; +} + + /** * If sem_op equals 0, the value of the semaphore is checked to see whether it * currently equals 0. If it does, the operation completes immediately; otherwise, @@ -213,46 +274,4 @@ - -int svsem_cond_wait(int semid ){ - - struct sembuf sops[2]; - - //閲婃斁mutex - sops[0].sem_num = 0; - sops[0].sem_op = 1; - sops[0].sem_flg = 0; - - // 绛夊緟cond - sops[1].sem_num = 1; - sops[1].sem_op = -1; - sops[1].sem_flg = 0; - - while (semop(semid, sops, 2) == -1) - if (errno != EINTR) { - // err_msg(errno, "Svsvsem_dec"); - return errno; - } - - - - - return 0; -} - -int svsem_cond_signal(int semid ){ - struct sembuf sops; - - // 閫氱煡绛夊緟cond鐨勮繘绋� - sops.sem_num = 1; - sops.sem_op = 1; - sops.sem_flg = 0; - - int rv = semop(semid, &sops, 1); - if (rv == -1) { - // err_msg(errno, "Svsvsem_inc"); - return errno; - } - return 0; -} \ No newline at end of file -- Gitblit v1.8.0