Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Set proctitle: avoid the use of __attribute__((constructor)).

This cased a segfault in some Linux system and was GCC-specific.

Commit modified by @antirez:

1) Stripped away the part to set the proc title via config for now.
2) Handle initialization of setproctitle only when the replacement
   is used.
3) Don't require GCC now that the attribute constructor is no
   longer used.
  • Loading branch information...
commit 6f96ac1c1ca040043f4249e5b230d080aec82ac7 1 parent f69b0a0
@stamhe stamhe authored committed
Showing with 15 additions and 4 deletions.
  1. +2 −0  src/config.h
  2. +7 −0 src/redis.c
  3. +6 −4 src/setproctitle.c
View
2  src/config.h
@@ -114,6 +114,8 @@
#if (defined __linux || defined __APPLE__)
#define USE_SETPROCTITLE
+#define INIT_SETPROCTITLE_REPLACEMENT
+void spt_init(int argc, char *argv[]);
void setproctitle(const char *fmt, ...);
#endif
View
7 src/redis.c
@@ -2586,16 +2586,23 @@ void redisOutOfMemoryHandler(size_t allocation_size) {
}
void redisSetProcTitle(char *title) {
+#ifdef USE_SETPROCTITLE
setproctitle("%s %s:%d",
title,
server.bindaddr ? server.bindaddr : "*",
server.port);
+#else
+ REDIS_NOTUSED(title);
+#endif
}
int main(int argc, char **argv) {
struct timeval tv;
/* We need to initialize our libraries, and the server configuration. */
+#ifdef INIT_SETPROCTITLE_REPLACEMENT
+ spt_init(argc, argv);
+#endif
zmalloc_enable_thread_safeness();
zmalloc_set_oom_handler(redisOutOfMemoryHandler);
srand(time(NULL)^getpid());
View
10 src/setproctitle.c
@@ -2,6 +2,8 @@
* setproctitle.c - Linux/Darwin setproctitle.
* --------------------------------------------------------------------------
* Copyright (C) 2010 William Ahern
+ * Copyright (C) 2013 Salvatore Sanfilippo
+ * Copyright (C) 2013 Stam He
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -42,8 +44,9 @@
#if !HAVE_SETPROCTITLE
-#if (defined __linux || defined __APPLE__) && defined __GNUC__
+#if (defined __linux || defined __APPLE__)
+extern char **environ;
static struct {
/* original value */
@@ -142,9 +145,8 @@ static int spt_copyargs(int argc, char *argv[]) {
} /* spt_copyargs() */
-void spt_init(int argc, char *argv[], char *envp[]) __attribute__((constructor));
-
-void spt_init(int argc, char *argv[], char *envp[]) {
+void spt_init(int argc, char *argv[]) {
+ char **envp = environ;
char *base, *end, *nul, *tmp;
int i, error;
Please sign in to comment.
Something went wrong with that request. Please try again.