diff --git a/contrib/worker_spi/worker_spi.c b/contrib/worker_spi/worker_spi.c index 84ac1b7730b..3a75bb3f4eb 100644 --- a/contrib/worker_spi/worker_spi.c +++ b/contrib/worker_spi/worker_spi.c @@ -154,10 +154,17 @@ initialize_worker_spi(worktable *table) } static void -worker_spi_main(void *main_arg) +worker_spi_main(Datum main_arg) { - worktable *table = (worktable *) main_arg; + int index = DatumGetInt32(main_arg); + worktable *table; StringInfoData buf; + char name[20]; + + table = palloc(sizeof(worktable)); + sprintf(name, "schema%d", index); + table->schema = pstrdup(name); + table->name = pstrdup("counted"); /* Establish signal handlers before unblocking signals. */ pqsignal(SIGHUP, worker_spi_sighup); @@ -296,9 +303,7 @@ void _PG_init(void) { BackgroundWorker worker; - worktable *table; unsigned int i; - char name[20]; /* get the configuration */ DefineCustomIntVariable("worker_spi.naptime", @@ -338,14 +343,8 @@ _PG_init(void) */ for (i = 1; i <= worker_spi_total_workers; i++) { - sprintf(name, "worker %d", i); - worker.bgw_name = pstrdup(name); - - table = palloc(sizeof(worktable)); - sprintf(name, "schema%d", i); - table->schema = pstrdup(name); - table->name = pstrdup("counted"); - worker.bgw_main_arg = (void *) table; + snprintf(worker.bgw_name, BGW_MAXLEN, "worker %d", i); + worker.bgw_main_arg = Int32GetDatum(i); RegisterBackgroundWorker(&worker); } diff --git a/doc/src/sgml/bgworker.sgml b/doc/src/sgml/bgworker.sgml index 7d2ffd14fef..7ffeca5321a 100644 --- a/doc/src/sgml/bgworker.sgml +++ b/doc/src/sgml/bgworker.sgml @@ -40,12 +40,12 @@ typedef void (*bgworker_main_type)(void *main_arg); typedef struct BackgroundWorker { - char *bgw_name; + char bgw_name[BGW_MAXLEN]; int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ - bgworker_main_type bgw_main; - void *bgw_main_arg; + bgworker_main_type bgw_main; + Datum bgw_main_arg; } BackgroundWorker; diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 1e41a0e75ec..f219bd13013 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -5247,9 +5247,6 @@ RegisterBackgroundWorker(BackgroundWorker *worker) } rw->rw_worker = *worker; - rw->rw_worker.bgw_name = ((char *) rw) + sizeof(RegisteredBgWorker); - strlcpy(rw->rw_worker.bgw_name, worker->bgw_name, namelen + 1); - rw->rw_backend = NULL; rw->rw_pid = 0; rw->rw_child_slot = 0; diff --git a/src/include/postmaster/bgworker.h b/src/include/postmaster/bgworker.h index e91e344eb67..e0f468fab9e 100644 --- a/src/include/postmaster/bgworker.h +++ b/src/include/postmaster/bgworker.h @@ -52,7 +52,7 @@ #define BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002 -typedef void (*bgworker_main_type) (void *main_arg); +typedef void (*bgworker_main_type) (Datum main_arg); /* * Points in time at which a bgworker can request to be started @@ -66,15 +66,16 @@ typedef enum #define BGW_DEFAULT_RESTART_INTERVAL 60 #define BGW_NEVER_RESTART -1 +#define BGW_MAXLEN 64 typedef struct BackgroundWorker { - char *bgw_name; + char bgw_name[BGW_MAXLEN]; int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ bgworker_main_type bgw_main; - void *bgw_main_arg; + Datum bgw_main_arg; } BackgroundWorker; /* Register a new bgworker */