wangzhengquan
2021-01-22 09a82c2ece4caadad0baa0d1f3b84f1506363fdd
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;
}