summaryrefslogtreecommitdiffhomepage
path: root/src/daemon/ntapi_dsr_init.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2017-01-06 19:20:23 -0500
committermidipix <writeonce@midipix.org>2017-01-07 09:02:37 -0500
commita5dc9f23b94eddb634e915f600bc928b3e6ed316 (patch)
tree2bc6879c976a1d9394b64678cb1c0a021462dbf8 /src/daemon/ntapi_dsr_init.c
parent6336c42970e39d7cc76071a93e7058ba3d8fda3e (diff)
downloadntapi-a5dc9f23b94eddb634e915f600bc928b3e6ed316.tar.bz2
ntapi-a5dc9f23b94eddb634e915f600bc928b3e6ed316.tar.xz
daemon initialization: simplified logic, fixed params-related race hazard.
Diffstat (limited to 'src/daemon/ntapi_dsr_init.c')
-rw-r--r--src/daemon/ntapi_dsr_init.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/daemon/ntapi_dsr_init.c b/src/daemon/ntapi_dsr_init.c
index f028efd..317a421 100644
--- a/src/daemon/ntapi_dsr_init.c
+++ b/src/daemon/ntapi_dsr_init.c
@@ -54,19 +54,23 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
return status;
if (params->pevent_daemon_ready)
- *(params->pevent_daemon_ready) = params->hevent_daemon_ready;
+ at_store(
+ (intptr_t *)params->pevent_daemon_ready,
+ (intptr_t)params->hevent_daemon_ready);
}
/* 'internal-client-is-ready' event */
if (!params->hevent_internal_client_ready) {
- if ((status = __ntapi->tt_create_inheritable_event(
+ if ((status = __ntapi->tt_create_private_event(
&params->hevent_internal_client_ready,
NT_NOTIFICATION_EVENT,
NT_EVENT_NOT_SIGNALED)))
return status;
if (params->pevent_internal_client_ready)
- *(params->pevent_internal_client_ready) = params->hevent_internal_client_ready;
+ at_store(
+ (intptr_t *)params->pevent_internal_client_ready,
+ (intptr_t)params->hevent_internal_client_ready);
}
/* daemon dedicated thread: general parameters */
@@ -82,17 +86,17 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
tparams.stack_info = params->stack_info;
/* daemon dedicated thread: create */
- status = __ntapi->tt_create_local_thread(&tparams);
- params->hthread_daemon_loop = tparams.hthread;
- if (status) return status;
+ if ((status = __ntapi->tt_create_local_thread(&tparams)))
+ return status;
+ params->hthread_daemon_loop = tparams.hthread;
/* wait for the server to be ready */
timeout.quad = NT_DSR_INIT_MAX_WAIT;
if ((status = __ntapi->zw_wait_for_single_object(
params->hevent_daemon_ready,
- 0,&timeout))) {
+ NT_SYNC_NON_ALERTABLE,&timeout))) {
__ntapi->zw_terminate_thread(
tparams.hthread,
status);
@@ -112,24 +116,25 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
tparams.start = (nt_thread_start_routine *)__ntapi_dsr_internal_client_connect;
tparams.arg = params;
- status = __ntapi->tt_create_local_thread(&tparams);
+ if ((status = __ntapi->tt_create_local_thread(&tparams)))
+ return status;
+
params->hthread_internal_client = tparams.hthread;
- if (status) return status;
/* wait until the internal connection had been established */
timeout.quad = NT_DSR_INIT_MAX_WAIT;
- status = __ntapi->zw_wait_for_single_object(
- params->hevent_internal_client_ready,
- 0,
- &timeout);
+ if ((status = __ntapi->zw_wait_for_single_object(
+ params->hevent_internal_client_ready,
+ NT_SYNC_NON_ALERTABLE,&timeout)))
+ return status;
if (params->flags & NT_DSR_INIT_CLOSE_EVENTS) {
__ntapi->zw_close(params->hevent_daemon_ready);
__ntapi->zw_close(params->hevent_internal_client_ready);
}
- return status;
+ return NT_STATUS_SUCCESS;;
}
@@ -137,6 +142,9 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
int32_t __stdcall __ntapi_dsr_start_impl(nt_daemon_params * params)
{
int32_t status;
+ void * ctx;
+
+ ctx = params->daemon_loop_context;
if ((status = __ntapi_dsr_once(params)))
return status;
@@ -147,7 +155,7 @@ int32_t __stdcall __ntapi_dsr_start_impl(nt_daemon_params * params)
if ((status = __ntapi_dsr_connect_internal_client(params)))
return status;
- if ((status = params->daemon_loop_routine(params->daemon_loop_context)))
+ if ((status = params->daemon_loop_routine(ctx)))
return status;
return NT_STATUS_SUCCESS;