[sheepdog] [PATCH v2 3/3] let logger work on rhel5 environment
Robin Dong
robin.k.dong at gmail.com
Wed Aug 21 08:37:37 CEST 2013
From: Robin Dong <sanbai at taobao.com>
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>
---
lib/logger.c | 184 +++++++++++++++++++++++++++++----------------------------
1 files changed, 94 insertions(+), 90 deletions(-)
diff --git a/lib/logger.c b/lib/logger.c
index 6c2f96f..24a3e2c 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,99 @@ 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) {
+ 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)
{
--
1.7.3.2
More information about the sheepdog
mailing list