From: Liu Yuan <
liu...@cmss.chinamobile.com>
Signed-off-by: Liu Yuan <
liu...@cmss.chinamobile.com>
---
include/util.h | 4 ++++
lib/logger.c | 18 ++++++++----------
lib/util.c | 11 ++++++++++-
3 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/include/util.h b/include/util.h
index 2ff1f43..914d767 100644
--- a/include/util.h
+++ b/include/util.h
@@ -14,6 +14,8 @@
#include <errno.h>
#include <sys/param.h>
#include <assert.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
#include "list.h"
@@ -575,4 +577,6 @@ static inline uint64_t clock_get_time(void)
}
char *xstrdup(const char *s);
+int xsemop(int semid, struct sembuf *sops, unsigned nsops);
+
#endif
diff --git a/lib/logger.c b/lib/logger.c
index 386b949..7d7441a 100644
--- a/lib/logger.c
+++ b/lib/logger.c
@@ -23,12 +23,10 @@
#include <errno.h>
#include <time.h>
#include <sys/shm.h>
-#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/prctl.h>
-#include <sys/sem.h>
#include <pthread.h>
#include <libgen.h>
#include <sys/time.h>
@@ -417,8 +415,8 @@ static void dolog(int prio, const char *func, int line,
ops.sem_num = 0;
ops.sem_flg = SEM_UNDO;
ops.sem_op = -1;
- if (semop(la->semid, &ops, 1) < 0) {
- syslog(LOG_ERR, "semop up failed: %m");
+ if (xsemop(la->semid, &ops, 1) < 0) {
+ syslog(LOG_ERR, "xsemop up failed: %m");
return;
}
@@ -436,8 +434,8 @@ static void dolog(int prio, const char *func, int line,
}
ops.sem_op = 1;
- if (semop(la->semid, &ops, 1) < 0) {
- syslog(LOG_ERR, "semop down failed: %m");
+ if (xsemop(la->semid, &ops, 1) < 0) {
+ syslog(LOG_ERR, "xsemop down failed: %m");
return;
}
} else {
@@ -505,8 +503,8 @@ static void log_flush(void)
ops.sem_num = 0;
ops.sem_flg = SEM_UNDO;
ops.sem_op = -1;
- if (semop(la->semid, &ops, 1) < 0) {
- syslog(LOG_ERR, "semop up failed: %m");
+ if (xsemop(la->semid, &ops, 1) < 0) {
+ syslog(LOG_ERR, "xsemop up failed: %m");
exit(1);
}
@@ -516,8 +514,8 @@ static void log_flush(void)
la->tail = la->start;
ops.sem_op = 1;
- if (semop(la->semid, &ops, 1) < 0) {
- syslog(LOG_ERR, "semop down failed: %m");
+ if (xsemop(la->semid, &ops, 1) < 0) {
+ syslog(LOG_ERR, "xsemop down failed: %m");
exit(1);
}
diff --git a/lib/util.c b/lib/util.c
index e9ba2aa..395a2c9 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -22,7 +22,6 @@
#include <sys/eventfd.h>
#include <sys/syscall.h>
-
#include "util.h"
mode_t sd_def_dmode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP;
@@ -625,3 +624,13 @@ char *xstrdup(const char *s)
return ret;
}
+int xsemop(int semid, struct sembuf *sops, unsigned nsops)
+{
+ int ret;
+
+ do {
+ ret = semop(semid, sops, nsops);
+ } while (unlikely(ret < 0) && errno == EINTR);
+
+ return ret;
+}
--
1.9.1