Fu Juntang
2021-09-17 5c912c70e9333298ff48f7ea15424f72ca977b99
src/svsem.cpp
@@ -1,24 +1,24 @@
#include "svsem.h"
int svsem_get(key_t key, unsigned int value) {
// printf("==================svsem_get===============================\n");
  int semid, perms;
  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;
    struct sembuf sop;
    //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());
    arg.val = 1;
    if (semctl(semid, 1, SETVAL, arg) == -1)
      err_exit(errno, "semctl 2");
    /* Perform a "no-op" semaphore operation - changes sem_otime
       so other processes can see we've initialized the set. */
@@ -27,7 +27,6 @@
    sop.sem_flg = 0;
    if (semop(semid, &sop, 1) == -1)
      err_exit(errno, "semop");
    //logger.info("%ld: completed dummy semop()\n", (long)getpid());
  } else { /* We didn't create the semaphore set */
@@ -44,12 +43,10 @@
      if (semid == -1)
        err_exit(errno, "semget 2");
     // 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);
        if (semctl(semid, 0, IPC_STAT, arg) == -1)
          err_exit(errno, "semctl 2");
@@ -78,8 +75,9 @@
  while (semop(semid, &sops, 1) == -1)
    if (errno != EINTR) {
      // err_msg(errno, "svsem_dec");
      return errno;
      err_msg(errno, "svsem_dec");
      return -1;
    }
  return 0;
@@ -91,14 +89,9 @@
  sops.sem_num = 0;
  sops.sem_op = -1;
  sops.sem_flg = IPC_NOWAIT | 0;
  while (semop(semid, &sops, 1) == -1)
    if (errno != EINTR) {
      // err_msg(errno, "svsem_dec_nowait");
      return errno;
    }
  return 0;
  return semop(semid, &sops, 1) ;
}
int svsem_timedwait(const int semid, const struct timespec *timeout) {
@@ -111,7 +104,7 @@
  while (semtimedop(semid, &sops, 1, timeout) == -1)
    if (errno != EINTR) {
      // err_msg(errno, "svsem_psem_timedwait");
      return errno;
      return -1;
    }
  return 0;
@@ -129,7 +122,64 @@
  int rv = semop(semid, &sops, 1);
  if (rv == -1) {
    // err_msg(errno, "svsem_inc");
    return errno;
    return -1;
  }
  return 0;
}
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 -1;
  }
  //释放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 -1;
    }
   //重新获取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 -1;
    }
  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 -1;
  }
  return 0;
}
@@ -151,7 +201,7 @@
  while (semop(semid, &sops, 1) == -1)
    if (errno != EINTR) {
      // err_msg(errno, "svsem_zero");
      return errno;
      return -1;
    }
  return 0;
@@ -168,7 +218,7 @@
  while (semop(semid, &sops, 1) == -1)
    if (errno != EINTR) {
      // err_msg(errno, "svsem_zero_nowait");
      return errno;
      return -1;
    }
  return 0;
@@ -184,7 +234,7 @@
  while (semtimedop(semid, &sops, 1, timeout) == -1)
    if (errno != EINTR) {
      // err_msg(errno, "svsem_zero_timeout");
      return errno;
      return -1;
    }
  return 0;
@@ -196,11 +246,8 @@
int svsem_set(int semid, int val) {
  union semun arg;
  arg.val = val;
  if (semctl(semid, 0, SETVAL, arg) == -1) {
    err_msg(errno, "svsem_set");
    return errno;
  }
  return 0;
  return semctl(semid, 0, SETVAL, arg);
}
@@ -213,46 +260,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;
}