Selaa lähdekoodia

- possible signal interruptions treated for sysv sems

Andrei Pelinescu-Onciul 22 vuotta sitten
vanhempi
commit
e7d698cc3c
1 muutettua tiedostoa jossa 43 lisäystä ja 4 poistoa
  1. 43 4
      lock_ops.h

+ 43 - 4
lock_ops.h

@@ -39,6 +39,7 @@
  *              the locking.h<->shm_mem.h interdependency) (andrei)
  *  2003-03-10  lock set support added also for PTHREAD_MUTEX & POSIX_SEM
  *               (andrei)
+ *  2003-03-17  possible signal interruptions treated for sysv (andrei)
  *
 Implements:
 
@@ -164,7 +165,16 @@ inline static void lock_get(gen_lock_t* lock)
 	sop.sem_num=0;
 	sop.sem_op=-1; /* down */
 	sop.sem_flg=0; 
-	semop(*lock, &sop, 1);
+tryagain:
+	if (semop(*lock, &sop, 1)==-1){
+		if (errno==EINTR){
+			DBG("lock_get: signal received while waiting for on a mutex\n");
+			goto tryagain;
+		}else{
+			LOG(L_CRIT, "ERROR: lock_get sysv: %s (%d)\n", strerror(errno),
+						errno);
+		}
+	}
 }
 
 inline static void lock_release(gen_lock_t* lock)
@@ -174,7 +184,17 @@ inline static void lock_release(gen_lock_t* lock)
 	sop.sem_num=0;
 	sop.sem_op=1; /* up */
 	sop.sem_flg=0; 
-	semop(*lock, &sop, 1);
+tryagain:
+	if (semop(*lock, &sop, 1)==-1){
+		if (errno==EINTR){
+			/* very improbable*/
+			DBG("lock_release: signal received while releasing a mutex\n");
+			goto tryagain;
+		}else{
+			LOG(L_CRIT, "ERROR: lock_release sysv: %s (%d)\n",
+					strerror(errno), errno);
+		}
+	}
 }
 
 
@@ -250,7 +270,16 @@ inline static void lock_set_get(lock_set_t* s, int n)
 	sop.sem_num=n;
 	sop.sem_op=-1; /* down */
 	sop.sem_flg=0;
-	semop(s->semid, &sop, 1);
+tryagain:
+	if (semop(s->semid, &sop, 1)==-1){
+		if (errno==EINTR){
+			DBG("lock_set_get: signal received while waiting on a mutex\n");
+			goto tryagain;
+		}else{
+			LOG(L_CRIT, "ERROR: lock_set_get sysv: %s (%d)\n",
+					strerror(errno), errno);
+		}
+	}
 }
 
 inline static void lock_set_release(lock_set_t* s, int n)
@@ -259,7 +288,17 @@ inline static void lock_set_release(lock_set_t* s, int n)
 	sop.sem_num=n;
 	sop.sem_op=1; /* up */
 	sop.sem_flg=0;
-	semop(s->semid, &sop, 1);
+tryagain:
+	if (semop(s->semid, &sop, 1)==-1){
+		if (errno==EINTR){
+			/* very improbable */
+			DBG("lock_set_release: signal received while releasing mutex\n");
+			goto tryagain;
+		}else{
+			LOG(L_CRIT, "ERROR: lock_set_release sysv: %s (%d)\n",
+					strerror(errno), errno);
+		}
+	}
 }
 #else 
 #error "no lock set method selected"