static void pgstrom_opencl_sighup(SIGNAL_ARGS) { pgstrom_clserv_exit_pending = true; pgstrom_cancel_server_loop(); clserv_log("Got SIGHUP"); }
static void pgstrom_opencl_sighup(SIGNAL_ARGS) { pgstrom_clserv_exit_pending = true; pgstrom_cancel_server_loop(); elog(LOG, "got sighup"); }
/* * pgstrom_opencl_main * * Main routine of opencl intermediation server. * * TODO: enhancement to use multi-threaded message handler. */ static void pgstrom_opencl_main(Datum main_arg) { pthread_t *threads; int i; /* mark this process is OpenCL intermediator */ pgstrom_i_am_clserv = true; /* * Set up signal handlers. Currently, OpenCL Server does not pay * attention on reloading of postgresql.conf, so we can ignore SIGHUP. */ pqsignal(SIGHUP, SIG_IGN); pqsignal(SIGTERM, pgstrom_opencl_sigterm); /* We're now ready to receive signals */ BackgroundWorkerUnblockSignals(); /* collect opencl platform/device info */ construct_opencl_device_info(); /* initialize opencl context and shared memory segment */ init_opencl_context_and_shmem(); elog(LOG, "Starting PG-Strom OpenCL Server"); /* * OK, ready to launch server thread. In the default, it creates * same number with online CPUs, but user can give an explicit * number using "pg_strom.opencl_num_threads" parameter. * * NOTE: sysconf(_SC_NPROCESSORS_ONLN) may not be portable. */ if (opencl_num_threads == 0) opencl_num_threads = sysconf(_SC_NPROCESSORS_ONLN); Assert(opencl_num_threads > 0); threads = malloc(sizeof(pthread_t) * opencl_num_threads); if (!threads) { elog(LOG, "out of memory"); return; } for (i=0; i < opencl_num_threads; i++) { if (pthread_create(&threads[i], NULL, pgstrom_opencl_event_loop, NULL) != 0) break; } /* * In case of any failure during pthread_create(), worker threads * will be terminated soon, then we can wait for thread joining. */ if (i < opencl_num_threads) { elog(LOG, "failed to create server threads"); pgstrom_clserv_exit_pending = true; pgstrom_cancel_server_loop(); } else elog(LOG, "PG-Strom: %d of server threads are up", opencl_num_threads); while (--i >= 0) pthread_join(threads[i], NULL); /* got a signal to stop background worker process */ elog(LOG, "Stopping PG-Strom OpenCL Server"); /* * close the server queue and returns unprocessed message with error. * * XXX - here is possible bug if server got signals during program * building; that holds some messages and callback enqueues * the messages again. */ pgstrom_close_server_queue(); }