18#if defined(__darwin__)
19#include <crt_externs.h>
26#if !defined(WIN32) || defined(_MSC_VER)
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(__sun) || defined(__darwin__)
56#define PS_USE_CLOBBER_ARGV
65#if defined(__linux__) || defined(__darwin__)
66#define PS_PADDING '\0'
74#ifndef PS_USE_CLOBBER_ARGV
76#define PS_BUFFER_SIZE 256
77static char ps_buffer[PS_BUFFER_SIZE];
78static const size_t ps_buffer_size = PS_BUFFER_SIZE;
80static char *ps_buffer;
81static size_t ps_buffer_size;
82static size_t last_status_len;
85static size_t ps_buffer_cur_len;
87static size_t ps_buffer_fixed_size;
93static size_t ps_buffer_nosuffix_len;
95static void flush_ps_display(
void);
109#if defined(PS_USE_CLOBBER_ARGV) && defined(USE_VALGRIND)
110extern char **ps_status_new_environ;
111char **ps_status_new_environ;
135#if defined(PS_USE_CLOBBER_ARGV)
142 char *end_of_area = NULL;
149 for (
i = 0;
i < argc;
i++)
151 if (
i == 0 || end_of_area + 1 == argv[
i])
152 end_of_area = argv[
i] + strlen(argv[
i]);
155 if (end_of_area == NULL)
178#if defined(__linux__) && (!defined(__GLIBC__) && !defined(__UCLIBC__))
179 if (strncmp(
environ[
i],
"LD_LIBRARY_PATH=", 16) == 0)
198 last_status_len = ps_buffer_size = end_of_area - argv[0];
203 new_environ = (
char **)
malloc((
i + 1) *
sizeof(
char *));
218 new_environ[
i] = NULL;
223 ps_status_new_environ = new_environ;
243 new_argv = (
char **)
malloc((argc + 1) *
sizeof(
char *));
249 for (
i = 0;
i < argc;
i++)
251 new_argv[
i] = strdup(argv[
i]);
258 new_argv[argc] = NULL;
260#if defined(__darwin__)
266 *_NSGetArgv() = new_argv;
288 bool save_update_process_title;
304#ifdef PS_USE_CLOBBER_ARGV
318#if defined(PS_USE_SETPROCTITLE) || defined(PS_USE_SETPROCTITLE_FAST)
324#define PROGRAM_NAME_PREFIX ""
326#define PROGRAM_NAME_PREFIX "postgres: "
332 PROGRAM_NAME_PREFIX
"%s ",
338 PROGRAM_NAME_PREFIX
"%s: %s ",
342 ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer);
361update_ps_display_precheck(
void)
371#ifdef PS_USE_CLOBBER_ARGV
393 if (!update_ps_display_precheck())
397 if (ps_buffer_nosuffix_len > 0)
398 ps_buffer_cur_len = ps_buffer_nosuffix_len;
400 ps_buffer_nosuffix_len = ps_buffer_cur_len;
402 len = strlen(suffix);
405 if (ps_buffer_cur_len +
len + 1 >= ps_buffer_size)
408 if (ps_buffer_cur_len < ps_buffer_size - 1)
411 ps_buffer[ps_buffer_cur_len++] =
' ';
414 memcpy(ps_buffer + ps_buffer_cur_len, suffix,
415 ps_buffer_size - ps_buffer_cur_len - 1);
416 ps_buffer[ps_buffer_size - 1] =
'\0';
417 ps_buffer_cur_len = ps_buffer_size - 1;
422 ps_buffer[ps_buffer_cur_len++] =
' ';
423 memcpy(ps_buffer + ps_buffer_cur_len, suffix,
len + 1);
424 ps_buffer_cur_len = ps_buffer_cur_len +
len;
427 Assert(strlen(ps_buffer) == ps_buffer_cur_len);
443 if (!update_ps_display_precheck())
447 if (ps_buffer_nosuffix_len == 0)
451 ps_buffer[ps_buffer_nosuffix_len] =
'\0';
452 ps_buffer_cur_len = ps_buffer_nosuffix_len;
453 ps_buffer_nosuffix_len = 0;
455 Assert(ps_buffer_cur_len == strlen(ps_buffer));
475 if (!update_ps_display_precheck())
479 ps_buffer_nosuffix_len = 0;
482 if (ps_buffer_fixed_size +
len >= ps_buffer_size)
485 memcpy(ps_buffer + ps_buffer_fixed_size, activity,
486 ps_buffer_size - ps_buffer_fixed_size - 1);
487 ps_buffer[ps_buffer_size - 1] =
'\0';
488 ps_buffer_cur_len = ps_buffer_size - 1;
492 memcpy(ps_buffer + ps_buffer_fixed_size, activity,
len + 1);
493 ps_buffer_cur_len = ps_buffer_fixed_size +
len;
495 Assert(strlen(ps_buffer) == ps_buffer_cur_len);
504flush_ps_display(
void)
506#ifdef PS_USE_SETPROCTITLE
507 setproctitle(
"%s", ps_buffer);
508#elif defined(PS_USE_SETPROCTITLE_FAST)
509 setproctitle_fast(
"%s", ps_buffer);
512#ifdef PS_USE_CLOBBER_ARGV
514 if (last_status_len > ps_buffer_cur_len)
516 last_status_len - ps_buffer_cur_len);
517 last_status_len = ps_buffer_cur_len;
527 static HANDLE ident_handle = INVALID_HANDLE_VALUE;
528 char name[PS_BUFFER_SIZE + 32];
530 if (ident_handle != INVALID_HANDLE_VALUE)
531 CloseHandle(ident_handle);
535 ident_handle = CreateEvent(NULL, TRUE, FALSE,
name);
550#ifdef PS_USE_CLOBBER_ARGV
560 *displen = (int) (ps_buffer_cur_len - ps_buffer_fixed_size);
562 return ps_buffer + ps_buffer_fixed_size;
#define write_stderr(str)
#define MemSet(start, val, len)
Assert(PointerIsAligned(start, uint64))
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