@@ -47,15 +47,19 @@ PG_FUNCTION_INFO_V1( show_concurrent_part_tasks_internal );
4747PG_FUNCTION_INFO_V1 ( stop_concurrent_part_task );
4848
4949
50+ /*
51+ * Dynamically resolve functions (for BGW API).
52+ */
53+ extern PGDLLEXPORT void bgw_main_spawn_partitions (Datum main_arg );
54+ extern PGDLLEXPORT void bgw_main_concurrent_part (Datum main_arg );
55+
56+
5057static void handle_sigterm (SIGNAL_ARGS );
5158static void bg_worker_load_config (const char * bgw_name );
5259static void start_bg_worker (const char bgworker_name [BGW_MAXLEN ],
53- bgworker_main_type bgw_main_func ,
60+ const char bgworker_proc [ BGW_MAXLEN ] ,
5461 Datum bgw_arg , bool wait_for_shutdown );
5562
56- static void bgw_main_spawn_partitions (Datum main_arg );
57- static void bgw_main_concurrent_part (Datum main_arg );
58-
5963
6064/*
6165 * Function context for concurrent_part_tasks_internal() SRF.
@@ -157,7 +161,7 @@ bg_worker_load_config(const char *bgw_name)
157161 */
158162static void
159163start_bg_worker (const char bgworker_name [BGW_MAXLEN ],
160- bgworker_main_type bgw_main_func ,
164+ const char bgworker_proc [ BGW_MAXLEN ] ,
161165 Datum bgw_arg , bool wait_for_shutdown )
162166{
163167#define HandleError (condition , new_state ) \
@@ -179,12 +183,16 @@ start_bg_worker(const char bgworker_name[BGW_MAXLEN],
179183
180184 /* Initialize worker struct */
181185 memcpy (worker .bgw_name , bgworker_name , BGW_MAXLEN );
182- worker .bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION ;
183- worker .bgw_start_time = BgWorkerStart_RecoveryFinished ;
184- worker .bgw_restart_time = BGW_NEVER_RESTART ;
185- worker .bgw_main = bgw_main_func ;
186- worker .bgw_main_arg = bgw_arg ;
187- worker .bgw_notify_pid = MyProcPid ;
186+ memcpy (worker .bgw_function_name , bgworker_proc , BGW_MAXLEN );
187+ memcpy (worker .bgw_library_name , "pg_pathman" , BGW_MAXLEN );
188+
189+ worker .bgw_flags = BGWORKER_SHMEM_ACCESS |
190+ BGWORKER_BACKEND_DATABASE_CONNECTION ;
191+ worker .bgw_start_time = BgWorkerStart_RecoveryFinished ;
192+ worker .bgw_restart_time = BGW_NEVER_RESTART ;
193+ worker .bgw_main = NULL ;
194+ worker .bgw_main_arg = bgw_arg ;
195+ worker .bgw_notify_pid = MyProcPid ;
188196
189197 /* Start dynamic worker */
190198 bgw_started = RegisterDynamicBackgroundWorker (& worker , & bgw_handle );
@@ -301,7 +309,7 @@ create_partitions_for_value_bg_worker(Oid relid, Datum value, Oid value_type)
301309
302310 /* Start worker and wait for it to finish */
303311 start_bg_worker (spawn_partitions_bgw ,
304- bgw_main_spawn_partitions ,
312+ CppAsString ( bgw_main_spawn_partitions ) ,
305313 UInt32GetDatum (segment_handle ),
306314 true);
307315
@@ -323,7 +331,7 @@ create_partitions_for_value_bg_worker(Oid relid, Datum value, Oid value_type)
323331/*
324332 * Entry point for SpawnPartitionsWorker's process.
325333 */
326- static void
334+ void
327335bgw_main_spawn_partitions (Datum main_arg )
328336{
329337 dsm_handle handle = DatumGetUInt32 (main_arg );
@@ -403,7 +411,7 @@ bgw_main_spawn_partitions(Datum main_arg)
403411/*
404412 * Entry point for ConcurrentPartWorker's process.
405413 */
406- static void
414+ void
407415bgw_main_concurrent_part (Datum main_arg )
408416{
409417 int rows ;
@@ -671,7 +679,7 @@ partition_table_concurrently(PG_FUNCTION_ARGS)
671679
672680 /* Start worker (we should not wait) */
673681 start_bg_worker (concurrent_part_bgw ,
674- bgw_main_concurrent_part ,
682+ CppAsString ( bgw_main_concurrent_part ) ,
675683 Int32GetDatum (empty_slot_idx ),
676684 false);
677685
0 commit comments