[sheepdog] [PATCH 2/2] modify util to build sheepdog on rhel5 environment

Robin Dong robin.k.dong at gmail.com
Wed Aug 21 07:02:36 CEST 2013


From: Robin Dong <sanbai at taobao.com>

For using timerfd, eventfd, signalfd, it need to use syscall() instead of glibc's
standard fucntions on rhel5.

In gcc-4.1.2, it dose not support attribute like "constructor(priority)" (it only support
contstructor without 'priority'), so call regist_json/server/default_log_formatter in
init_log_formatter() directly.

Signed-off-by: Robin Dong <sanbai at taobao.com>
---
 include/bitops.h         |    6 +-
 include/util.h           |   54 +++++++++++++-
 lib/event.c              |    1 -
 lib/logger.c             |  185 +++++++++++++++++++++++----------------------
 lib/util.c               |   47 ++++++++++++-
 lib/work.c               |    1 -
 sheep/cluster/local.c    |    1 -
 sheep/cluster/shepherd.c |    1 -
 sheep/sheep.c            |    1 -
 shepherd/shepherd.c      |    1 -
 10 files changed, 197 insertions(+), 101 deletions(-)

diff --git a/include/bitops.h b/include/bitops.h
index c2ff3e7..c4e8f74 100644
--- a/include/bitops.h
+++ b/include/bitops.h
@@ -157,7 +157,7 @@ static inline void clear_bit(unsigned int nr, unsigned long *addr)
  * set bit if value is nonzero. The last (most significant) bit is
  * at position 64.
  */
-#if __SIZEOF_LONG__ == 4
+#if SIZEOF_LONG == 4
 static __always_inline int fls64(uint64_t x)
 {
 	uint32_t h = x >> 32;
@@ -169,7 +169,7 @@ static __always_inline int fls64(uint64_t x)
 		return 64 - __builtin_clzl(h);
 	return 32 - __builtin_clzl(x);
 }
-#elif __SIZEOF_LONG__ == 8
+#elif SIZEOF_LONG == 8
 static __always_inline int fls64(uint64_t x)
 {
 	if (x == 0)
@@ -177,7 +177,7 @@ static __always_inline int fls64(uint64_t x)
 	return 64 - __builtin_clzl(x);
 }
 #else
-#error __SIZEOF_LONG__ not 4 or 8
+#error SIZEOF_LONG not 4 or 8
 #endif
 
 #endif /* __BITOPS_H__ */
diff --git a/include/util.h b/include/util.h
index 9e6b959..f104e17 100644
--- a/include/util.h
+++ b/include/util.h
@@ -10,14 +10,66 @@
 #include <unistd.h>
 #include <search.h>
 #include <urcu/uatomic.h>
-#include <sys/eventfd.h>
+#include <linux/types.h>
 #include <pthread.h>
 #include <errno.h>
 
+#include "config.h"
 #include "logger.h"
 #include "list.h"
 #include "compiler.h"
 
+#ifdef HAVE_SYS_SIGNALFD_H
+#include <sys/signalfd.h>
+#else
+#define SFD_NONBLOCK	(04000)
+struct signalfd_siginfo {
+	__u32 ssi_signo;
+	__s32 ssi_errno;
+	__s32 ssi_code;
+	__u32 ssi_pid;
+	__u32 ssi_uid;
+	__s32 ssi_fd;
+	__u32 ssi_tid;
+	__u32 ssi_band;
+	__u32 ssi_overrun;
+	__u32 ssi_trapno;
+	__s32 ssi_status;
+	__s32 ssi_int;
+	__u64 ssi_ptr;
+	__u64 ssi_utime;
+	__u64 ssi_stime;
+	__u64 ssi_addr;
+	__u16 ssi_addr_lsb;
+	__u8 __pad[46];
+};
+int signalfd(int __fd, const sigset_t *__mask, int __flags);
+#endif
+
+#ifdef HAVE_SYS_EVENTFD_H
+#include <sys/eventfd.h>
+#else
+#define EFD_SEMAPHORE	(1)
+#define EFD_NONBLOCK	(04000)
+#define eventfd_t	uint64_t
+int eventfd_write(int fd, eventfd_t value);
+int eventfd_read(int fd, eventfd_t *value);
+int eventfd(unsigned int initval, int flags);
+#endif
+
+#ifdef HAVE_SYS_TIMERFD_H
+#include <sys/timerfd.h>
+#else
+#define TFD_NONBLOCK (04000)
+int timerfd_create(clockid_t __clock_id, int __flags);
+int timerfd_settime(int __ufd, int __flags, __const struct itimerspec *__utmr,
+		struct itimerspec *__otmr);
+#endif
+
+#ifndef HAVE_FALLOCATE
+int fallocate(int fd, int mode, __off_t offset, __off_t len);
+#endif
+
 #define SECTOR_SIZE (1U << 9)
 #define BLOCK_SIZE (1U << 12)
 
diff --git a/lib/event.c b/lib/event.c
index 2143c5e..55f94a2 100644
--- a/lib/event.c
+++ b/lib/event.c
@@ -14,7 +14,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/epoll.h>
-#include <sys/timerfd.h>
 
 #include "list.h"
 #include "util.h"
diff --git a/lib/logger.c b/lib/logger.c
index 6c2f96f..531721a 100644
--- a/lib/logger.c
+++ b/lib/logger.c
@@ -102,7 +102,7 @@ struct log_format {
 };
 
 #define log_format_register(n, formatter_fn)				\
-	static void __attribute__((constructor(101)))			\
+	static void							\
 	regist_ ## formatter_fn(void) {					\
 		static struct log_format f =				\
 			{ .name = n, .formatter = formatter_fn };	\
@@ -141,95 +141,6 @@ static const char *format_thread_name(char *str, size_t size, const char *name,
 	return str;
 }
 
-/*
- * We need to set default log formatter because dog doesn't want to call
- * select_log_formatter().
- */
-static void __attribute__((constructor(65535)))
-init_log_formatter(void)
-{
-	struct log_format *f;
-
-	list_for_each_entry(f, &log_formats, list) {
-		if (!strcmp(f->name, "default")) {
-			format = f;
-			return;
-		}
-	}
-	syslog(LOG_ERR, "failed to set default formatter\n");
-	exit(1);
-}
-
-static int logarea_init(int size)
-{
-	int shmid;
-
-	shmid = shmget(IPC_PRIVATE, sizeof(struct logarea),
-		       0644 | IPC_CREAT | IPC_EXCL);
-	if (shmid == -1) {
-		syslog(LOG_ERR, "shmget logarea failed: %m");
-		return 1;
-	}
-
-	la = shmat(shmid, NULL, 0);
-	if (!la) {
-		syslog(LOG_ERR, "shmat logarea failed: %m");
-		return 1;
-	}
-
-	shmctl(shmid, IPC_RMID, NULL);
-
-	if (size < MAX_MSG_SIZE)
-		size = LOG_SPACE_SIZE;
-
-	shmid = shmget(IPC_PRIVATE, size, 0644 | IPC_CREAT | IPC_EXCL);
-	if (shmid == -1) {
-		syslog(LOG_ERR, "shmget msg failed: %m");
-		shmdt(la);
-		return 1;
-	}
-
-	la->start = shmat(shmid, NULL, 0);
-	if (!la->start) {
-		syslog(LOG_ERR, "shmat msg failed: %m");
-		shmdt(la);
-		return 1;
-	}
-	memset(la->start, 0, size);
-
-	shmctl(shmid, IPC_RMID, NULL);
-
-	la->end = la->start + size;
-	la->tail = la->start;
-
-	la->semid = semget(semkey, 1, 0666 | IPC_CREAT);
-	if (la->semid < 0) {
-		syslog(LOG_ERR, "semget failed: %m");
-		shmdt(la->start);
-		shmdt(la);
-		return 1;
-	}
-
-	la->semarg.val = 1;
-	if (semctl(la->semid, 0, SETVAL, la->semarg) < 0) {
-		syslog(LOG_ERR, "semctl failed: %m");
-		shmdt(la->start);
-		shmdt(la);
-		return 1;
-	}
-
-	return 0;
-}
-
-static void free_logarea(void)
-{
-	if (log_fd >= 0)
-		close(log_fd);
-	semctl(la->semid, 0, IPC_RMID, la->semarg);
-	shmdt(la->start);
-	shmdt(la);
-}
-
 static int server_log_formatter(char *buff, size_t size,
 				const struct logmsg *msg)
 {
@@ -318,6 +229,100 @@ static int json_log_formatter(char *buff, size_t size,
 }
 log_format_register("json", json_log_formatter);
 
+/*
+ * We need to set default log formatter because dog doesn't want to call
+ * select_log_formatter().
+ */
+static void __attribute__((constructor))
+init_log_formatter(void)
+{
+	struct log_format *f;
+
+	regist_json_log_formatter();
+	regist_server_log_formatter();
+	regist_default_log_formatter();
+
+	list_for_each_entry(f, &log_formats, list) {
+		printf("%s\n", f->name);
+		if (!strcmp(f->name, "default")) {
+			format = f;
+			return;
+		}
+	}
+	syslog(LOG_ERR, "failed to set default formatter\n");
+	exit(1);
+}
+
+static int logarea_init(int size)
+{
+	int shmid;
+
+	shmid = shmget(IPC_PRIVATE, sizeof(struct logarea),
+		       0644 | IPC_CREAT | IPC_EXCL);
+	if (shmid == -1) {
+		syslog(LOG_ERR, "shmget logarea failed: %m");
+		return 1;
+	}
+
+	la = shmat(shmid, NULL, 0);
+	if (!la) {
+		syslog(LOG_ERR, "shmat logarea failed: %m");
+		return 1;
+	}
+
+	shmctl(shmid, IPC_RMID, NULL);
+
+	if (size < MAX_MSG_SIZE)
+		size = LOG_SPACE_SIZE;
+
+	shmid = shmget(IPC_PRIVATE, size, 0644 | IPC_CREAT | IPC_EXCL);
+	if (shmid == -1) {
+		syslog(LOG_ERR, "shmget msg failed: %m");
+		shmdt(la);
+		return 1;
+	}
+
+	la->start = shmat(shmid, NULL, 0);
+	if (!la->start) {
+		syslog(LOG_ERR, "shmat msg failed: %m");
+		shmdt(la);
+		return 1;
+	}
+	memset(la->start, 0, size);
+
+	shmctl(shmid, IPC_RMID, NULL);
+
+	la->end = la->start + size;
+	la->tail = la->start;
+
+	la->semid = semget(semkey, 1, 0666 | IPC_CREAT);
+	if (la->semid < 0) {
+		syslog(LOG_ERR, "semget failed: %m");
+		shmdt(la->start);
+		shmdt(la);
+		return 1;
+	}
+
+	la->semarg.val = 1;
+	if (semctl(la->semid, 0, SETVAL, la->semarg) < 0) {
+		syslog(LOG_ERR, "semctl failed: %m");
+		shmdt(la->start);
+		shmdt(la);
+		return 1;
+	}
+
+	return 0;
+}
+
+static void free_logarea(void)
+{
+	if (log_fd >= 0)
+		close(log_fd);
+	semctl(la->semid, 0, IPC_RMID, la->semarg);
+	shmdt(la->start);
+	shmdt(la);
+}
+
 /* this one can block under memory pressure */
 static void log_syslog(const struct logmsg *msg)
 {
diff --git a/lib/util.c b/lib/util.c
index 5c57449..a2e34d2 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -13,7 +13,6 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <sys/syscall.h>
-#include <sys/types.h>
 #include <dirent.h>
 #include <sys/stat.h>
 #include <unistd.h>
@@ -25,6 +24,52 @@
 
 #include "util.h"
 
+#ifndef HAVE_SYS_EVENTFD_H
+int eventfd_write(int fd, eventfd_t value)
+{
+	return write(fd, &value, sizeof(eventfd_t)) !=
+			sizeof(eventfd_t) ? -1 : 0;
+}
+
+int eventfd_read(int fd, eventfd_t *value)
+{
+	return read(fd, value, sizeof(eventfd_t)) !=
+			sizeof(eventfd_t) ? -1 : 0;
+}
+
+int eventfd(unsigned int initval, int flags)
+{
+	return syscall(__NR_eventfd, initval, flags);
+}
+#endif
+
+#ifndef HAVE_SYS_SIGNALFD_H
+int signalfd(int __fd, const sigset_t *__mask, int __flags)
+{
+	return syscall(__NR_signalfd, __fd, __mask, _NSIG / 8);
+}
+#endif
+
+#ifndef HAVE_SYS_TIMERFD_H
+int timerfd_create(clockid_t __clock_id, int __flags)
+{
+	return syscall(__NR_timerfd_create, CLOCK_MONOTONIC, TFD_NONBLOCK);
+}
+
+int timerfd_settime(int __ufd, int __flags, __const struct itimerspec *__utmr,
+		struct itimerspec *__otmr)
+{
+	return syscall(__NR_timerfd_settime, __ufd, __flags, __utmr, __otmr);
+}
+#endif
+
+#ifndef HAVE_FALLOCATE
+int fallocate(int fd, int mode, __off_t offset, __off_t len)
+{
+	return syscall(__NR_fallocate, fd, mode, offset, len);
+}
+#endif
+
 mode_t sd_def_dmode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP;
 mode_t sd_def_fmode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
 
diff --git a/lib/work.c b/lib/work.c
index bf9252e..6933e1a 100644
--- a/lib/work.c
+++ b/lib/work.c
@@ -23,7 +23,6 @@
 #include <stdlib.h>
 #include <syscall.h>
 #include <sys/types.h>
-#include <sys/eventfd.h>
 #include <sys/time.h>
 #include <linux/types.h>
 #include <signal.h>
diff --git a/sheep/cluster/local.c b/sheep/cluster/local.c
index b4adf87..de3dfb1 100644
--- a/sheep/cluster/local.c
+++ b/sheep/cluster/local.c
@@ -13,7 +13,6 @@
 #include <unistd.h>
 #include <sys/epoll.h>
 #include <sys/mman.h>
-#include <sys/signalfd.h>
 #include <sys/file.h>
 #include <signal.h>
 #include <fcntl.h>
diff --git a/sheep/cluster/shepherd.c b/sheep/cluster/shepherd.c
index f61f659..9453ff8 100644
--- a/sheep/cluster/shepherd.c
+++ b/sheep/cluster/shepherd.c
@@ -19,7 +19,6 @@
 #include <sys/types.h>
 #include <sys/un.h>
 #include <sys/epoll.h>
-#include <sys/eventfd.h>
 
 #include "cluster.h"
 #include "event.h"
diff --git a/sheep/sheep.c b/sheep/sheep.c
index dacedff..47eb131 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -9,7 +9,6 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sys/signalfd.h>
 #include <sys/resource.h>
 #include <malloc.h>
 
diff --git a/shepherd/shepherd.c b/shepherd/shepherd.c
index 4ad4944..33670d5 100644
--- a/shepherd/shepherd.c
+++ b/shepherd/shepherd.c
@@ -21,7 +21,6 @@
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <sys/epoll.h>
-#include <sys/eventfd.h>
 
 #include <sys/un.h>
 #include <netinet/in.h>
-- 
1.7.3.2




More information about the sheepdog mailing list