18 #if defined(__darwin__)
19 #include <crt_externs.h>
51 #if defined(HAVE_SETPROCTITLE_FAST)
52 #define PS_USE_SETPROCTITLE_FAST
53 #elif defined(HAVE_SETPROCTITLE)
54 #define PS_USE_SETPROCTITLE
55 #elif defined(__linux__) || defined(_AIX) || defined(__sun) || defined(__darwin__)
56 #define PS_USE_CLOBBER_ARGV
65 #if defined(_AIX) || defined(__linux__) || defined(__darwin__)
66 #define PS_PADDING '\0'
68 #define PS_PADDING ' '
74 #ifndef PS_USE_CLOBBER_ARGV
76 #define PS_BUFFER_SIZE 256
77 static char ps_buffer[PS_BUFFER_SIZE];
78 static const size_t ps_buffer_size = PS_BUFFER_SIZE;
80 static char *ps_buffer;
81 static size_t ps_buffer_size;
82 static size_t last_status_len;
85 static size_t ps_buffer_cur_len;
87 static size_t ps_buffer_fixed_size;
93 static size_t ps_buffer_nosuffix_len;
95 static void flush_ps_display(
void);
123 #if defined(PS_USE_CLOBBER_ARGV)
130 char *end_of_area = NULL;
137 for (
i = 0;
i < argc;
i++)
139 if (
i == 0 || end_of_area + 1 == argv[
i])
140 end_of_area = argv[
i] + strlen(argv[
i]);
143 if (end_of_area == NULL)
160 last_status_len = ps_buffer_size = end_of_area - argv[0];
165 new_environ = (
char **)
malloc((
i + 1) *
sizeof(
char *));
180 new_environ[
i] = NULL;
200 new_argv = (
char **)
malloc((argc + 1) *
sizeof(
char *));
206 for (
i = 0;
i < argc;
i++)
208 new_argv[
i] = strdup(argv[
i]);
215 new_argv[argc] = NULL;
217 #if defined(__darwin__)
223 *_NSGetArgv() = new_argv;
245 bool save_update_process_title;
261 #ifdef PS_USE_CLOBBER_ARGV
275 #if defined(PS_USE_SETPROCTITLE) || defined(PS_USE_SETPROCTITLE_FAST)
281 #define PROGRAM_NAME_PREFIX ""
283 #define PROGRAM_NAME_PREFIX "postgres: "
289 PROGRAM_NAME_PREFIX
"%s ",
295 PROGRAM_NAME_PREFIX
"%s: %s ",
299 ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer);
318 update_ps_display_precheck(
void)
328 #ifdef PS_USE_CLOBBER_ARGV
350 if (!update_ps_display_precheck())
354 if (ps_buffer_nosuffix_len > 0)
355 ps_buffer_cur_len = ps_buffer_nosuffix_len;
357 ps_buffer_nosuffix_len = ps_buffer_cur_len;
359 len = strlen(suffix);
362 if (ps_buffer_cur_len +
len + 1 >= ps_buffer_size)
365 if (ps_buffer_cur_len < ps_buffer_size - 1)
368 ps_buffer[ps_buffer_cur_len++] =
' ';
371 memcpy(ps_buffer + ps_buffer_cur_len, suffix,
372 ps_buffer_size - ps_buffer_cur_len - 1);
373 ps_buffer[ps_buffer_size - 1] =
'\0';
374 ps_buffer_cur_len = ps_buffer_size - 1;
379 ps_buffer[ps_buffer_cur_len++] =
' ';
380 memcpy(ps_buffer + ps_buffer_cur_len, suffix,
len + 1);
381 ps_buffer_cur_len = ps_buffer_cur_len +
len;
384 Assert(strlen(ps_buffer) == ps_buffer_cur_len);
400 if (!update_ps_display_precheck())
404 if (ps_buffer_nosuffix_len == 0)
408 ps_buffer[ps_buffer_nosuffix_len] =
'\0';
409 ps_buffer_cur_len = ps_buffer_nosuffix_len;
410 ps_buffer_nosuffix_len = 0;
412 Assert(ps_buffer_cur_len == strlen(ps_buffer));
432 if (!update_ps_display_precheck())
436 ps_buffer_nosuffix_len = 0;
439 if (ps_buffer_fixed_size +
len >= ps_buffer_size)
442 memcpy(ps_buffer + ps_buffer_fixed_size, activity,
443 ps_buffer_size - ps_buffer_fixed_size - 1);
444 ps_buffer[ps_buffer_size - 1] =
'\0';
445 ps_buffer_cur_len = ps_buffer_size - 1;
449 memcpy(ps_buffer + ps_buffer_fixed_size, activity,
len + 1);
450 ps_buffer_cur_len = ps_buffer_fixed_size +
len;
452 Assert(strlen(ps_buffer) == ps_buffer_cur_len);
461 flush_ps_display(
void)
463 #ifdef PS_USE_SETPROCTITLE
464 setproctitle(
"%s", ps_buffer);
465 #elif defined(PS_USE_SETPROCTITLE_FAST)
466 setproctitle_fast(
"%s", ps_buffer);
469 #ifdef PS_USE_CLOBBER_ARGV
471 if (last_status_len > ps_buffer_cur_len)
473 last_status_len - ps_buffer_cur_len);
474 last_status_len = ps_buffer_cur_len;
484 static HANDLE ident_handle = INVALID_HANDLE_VALUE;
485 char name[PS_BUFFER_SIZE + 32];
487 if (ident_handle != INVALID_HANDLE_VALUE)
488 CloseHandle(ident_handle);
492 ident_handle = CreateEvent(NULL, TRUE, FALSE,
name);
507 #ifdef PS_USE_CLOBBER_ARGV
517 *displen = (int) (ps_buffer_cur_len - ps_buffer_fixed_size);
519 return ps_buffer + ps_buffer_fixed_size;
#define write_stderr(str)
#define MemSet(start, val, len)
Assert(fmt[strlen(fmt) - 1] !='\n')
const char * GetBackendTypeDesc(BackendType backendType)
BackendType MyBackendType
const char * get_ps_display(int *displen)
void set_ps_display_remove_suffix(void)
void set_ps_display_with_len(const char *activity, size_t len)
void init_ps_display(const char *fixed_part)
void set_ps_display_suffix(const char *suffix)
bool update_process_title
char ** save_ps_display_args(int argc, char **argv)
static void set_ps_display(const char *activity)
#define DEFAULT_UPDATE_PROCESS_TITLE