@@ -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 ] ,
5461Datum 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 ] ,
161165Datum 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 */
181185memcpy (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 */
190198bgw_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 */
303311start_bg_worker (spawn_partitions_bgw ,
304- bgw_main_spawn_partitions ,
312+ CppAsString ( bgw_main_spawn_partitions ) ,
305313UInt32GetDatum (segment_handle ),
306314true);
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{
329337dsm_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{
409417int rows ;
@@ -671,7 +679,7 @@ partition_table_concurrently(PG_FUNCTION_ARGS)
671679
672680/* Start worker (we should not wait) */
673681start_bg_worker (concurrent_part_bgw ,
674- bgw_main_concurrent_part ,
682+ CppAsString ( bgw_main_concurrent_part ) ,
675683Int32GetDatum (empty_slot_idx ),
676684false);
677685