| 282 log_ereport(LOG_INFORM, "webserver shutdown"); |
282 log_ereport(LOG_INFORM, "webserver shutdown"); |
| 283 |
283 |
| 284 srvctrl_shutdown(); |
284 srvctrl_shutdown(); |
| 285 } |
285 } |
| 286 |
286 |
| |
287 static volatile int ws_clean_shutdown = TRUE; |
| |
288 |
| |
289 void webserver_stop() { |
| |
290 log_ereport(LOG_INFORM, "webserver stop"); |
| |
291 ws_clean_shutdown = FALSE; |
| |
292 srvctrl_shutdown(); |
| |
293 } |
| |
294 |
| 287 void webserver_end() { |
295 void webserver_end() { |
| 288 cfgmgr_shutdown(); |
296 if(ws_clean_shutdown) { |
| 289 shutdown_threadpools(60); |
297 cfgmgr_shutdown(); |
| 290 |
298 shutdown_threadpools(60); |
| 291 shutdown_eventhandlers_wait(); // TODO: timeout |
299 |
| 292 |
300 shutdown_eventhandlers_wait(); // TODO: timeout |
| 293 shutdown_logging(); |
301 shutdown_logging(); |
| |
302 } |
| 294 |
303 |
| 295 // execute restart callbacks |
304 // execute restart callbacks |
| 296 RestartCallback *re = atrestart; |
305 RestartCallback *re = atrestart; |
| 297 RestartCallback *re_next; |
306 RestartCallback *re_next; |
| 298 while(re) { |
307 while(re) { |
| 299 re->func(re->data); |
308 re->func(re->data); |
| 300 re_next = re->next; |
309 re_next = re->next; |
| 301 free(re); |
310 free(re); |
| 302 re = re_next; |
311 re = re_next; |
| 303 } |
312 } |
| 304 |
313 |
| 305 webserver_destroy(); |
314 if(ws_clean_shutdown) { |
| |
315 // TODO: check if previous shutdown was successful |
| |
316 webserver_destroy(); |
| |
317 } |
| 306 } |
318 } |
| 307 |
319 |
| 308 int webserver_reconfig() { |
320 int webserver_reconfig() { |
| 309 CfgManager mgr; |
321 CfgManager mgr; |
| 310 if(cfgmgr_load_config(&mgr) != 0) { |
322 if(cfgmgr_load_config(&mgr) != 0) { |