From ad58de287d1c25c8bc143803b978c4bc5b0955f2 Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 13 May 2018 12:13:30 +0000 Subject: daemon initialization: revised for optimized thread synchronization. --- src/daemon/ntapi_dsr_init.c | 95 ++++++++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 32 deletions(-) (limited to 'src/daemon/ntapi_dsr_init.c') diff --git a/src/daemon/ntapi_dsr_init.c b/src/daemon/ntapi_dsr_init.c index 8f29eec..afade50 100644 --- a/src/daemon/ntapi_dsr_init.c +++ b/src/daemon/ntapi_dsr_init.c @@ -19,9 +19,7 @@ static int32_t __stdcall __ntapi_dsr_once(nt_daemon_params * params); int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) { int32_t status; - nt_thread_params tparams; - nt_large_integer timeout; /* report status */ at_store_32( @@ -36,6 +34,9 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) ¶ms->exit_code_internal_client, NT_STATUS_PENDING); + at_locked_or((intptr_t *)params->port_name,0); + at_locked_or((intptr_t *)¶ms->port_name,0); + /* port_keys */ if (params->flags & NT_DSR_INIT_GENERATE_KEYS) if ((status = __ntapi->tt_port_generate_keys(params->port_keys))) @@ -47,6 +48,20 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) params->port_keys, params->port_name_keys); + /* 'port-created' event */ + if (!params->hevent_daemon_port) { + if ((status = __ntapi->tt_create_private_event( + ¶ms->hevent_daemon_port, + NT_NOTIFICATION_EVENT, + NT_EVENT_NOT_SIGNALED))) + return status; + + if (params->pevent_daemon_port) + at_store( + (intptr_t *)params->pevent_daemon_port, + (intptr_t)params->hevent_daemon_port); + } + /* 'daemon-is-ready' event */ if (!params->hevent_daemon_ready) { if ((status = __ntapi->tt_create_private_event( @@ -91,27 +106,25 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) 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, - NT_SYNC_NON_ALERTABLE,&timeout))) { - __ntapi->zw_terminate_thread( - tparams.hthread, - status); - return status; - } - + at_store( + (intptr_t *)¶ms->hthread_daemon_loop, + (intptr_t)tparams.hthread); /* daemon dedicated thread: actual stack size */ params->stack_size_commit = tparams.stack_size_commit; params->stack_size_reserve = tparams.stack_size_reserve; + /* wait for the port to be created */ + if ((status = __ntapi->zw_wait_for_single_object( + params->hevent_daemon_port, + NT_SYNC_NON_ALERTABLE,0))) + return status; + + /* verify the port's successful creation */ + if (params->exit_code_daemon_start) + return NT_STATUS_PORT_NOT_SET; - /* establish internal connection */ + /* internal connection task-specific thread */ __ntapi->tt_aligned_block_memset( &tparams,0,sizeof(tparams)); @@ -121,17 +134,27 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params) if ((status = __ntapi->tt_create_local_thread(&tparams))) return status; - params->hthread_internal_client = tparams.hthread; - - /* wait until the internal connection had been established */ - timeout.quad = NT_DSR_INIT_MAX_WAIT; + at_store( + (intptr_t *)¶ms->hthread_internal_client, + (intptr_t)tparams.hthread); + /* wait for the task-specific thread to exit */ if ((status = __ntapi->zw_wait_for_single_object( - params->hevent_internal_client_ready, - NT_SYNC_NON_ALERTABLE,&timeout))) + params->hthread_internal_client, + NT_SYNC_NON_ALERTABLE,0))) return status; + /* verify a successful internal connection */ + if (params->exit_code_internal_client) + return params->exit_code_internal_client; + + /* all_done */ + __ntapi->zw_set_event( + params->hevent_daemon_ready, + 0); + if (params->flags & NT_DSR_INIT_CLOSE_EVENTS) { + __ntapi->zw_close(params->hevent_daemon_port); __ntapi->zw_close(params->hevent_daemon_ready); __ntapi->zw_close(params->hevent_internal_client_ready); } @@ -208,6 +231,10 @@ static int32_t __stdcall __ntapi_dsr_create_port_exit( ¶ms->exit_code_daemon_start, status); + __ntapi->zw_set_event( + params->hevent_daemon_port, + 0); + return status; } @@ -219,9 +246,9 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params) nt_unicode_string server_name; /* init server_name */ - server_name.strlen = (uint16_t)__ntapi->tt_string_null_offset_short((const int16_t *)params->port_name); + server_name.strlen = (uint16_t)__ntapi->tt_string_null_offset_short((int16_t *)params->port_name); server_name.maxlen = 0; - server_name.buffer = (uint16_t *)params->port_name; + server_name.buffer = params->port_name; /* init security structure */ sqos.length = sizeof(sqos); @@ -231,7 +258,7 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params) /* init the port's object attributes */ oa.len = sizeof(oa); - oa.root_dir = (void *)0; + oa.root_dir = 0; oa.obj_name = &server_name; oa.obj_attr = 0; oa.sec_desc = params->port_sd; @@ -251,11 +278,15 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params) (intptr_t *)params->pport_daemon, (intptr_t)params->hport_daemon); - /* signal the daemon-is-ready event */ - status = __ntapi->zw_set_event( - params->hevent_daemon_ready, - (int32_t *)0); + /* set status */ + at_store_32( + ¶ms->exit_code_daemon_start, + NT_STATUS_SUCCESS); + + /* signal the port-created event */ + __ntapi->zw_set_event( + params->hevent_daemon_port, + 0); - return __ntapi_dsr_create_port_exit( - params,status); + return NT_STATUS_SUCCESS; } -- cgit v1.2.3