diff --git a/io/dap_context.c b/io/dap_context.c index c2ac6741799125cab63a5fede46db714aae00600..db352198212efec227f9495da4de81fc89891c2a 100644 --- a/io/dap_context.c +++ b/io/dap_context.c @@ -349,6 +349,7 @@ static void *s_context_thread(void *a_arg) pthread_cond_destroy(&l_context->started_cond); pthread_mutex_destroy(&l_context->started_mutex); DAP_DELETE(l_context); + DAP_DELETE(l_msg); return NULL; } diff --git a/io/dap_proc_thread.c b/io/dap_proc_thread.c index e8fab8317f409e2740f0f2200ae6a38584260ef1..26d5041323e3cec43b915944d526d13a53214717 100644 --- a/io/dap_proc_thread.c +++ b/io/dap_proc_thread.c @@ -37,9 +37,31 @@ static dap_proc_thread_t *s_threads = NULL; static int s_context_callback_started(dap_context_t *a_context, void *a_arg); static int s_context_callback_stopped(dap_context_t *a_context, void *a_arg); +/** + * @brief add and run context to thread + * @param a_thread alocated thread memory + * @param a_cpu_id cpu id to thread assign + * @return result of dap_context_run (0 all OK) + */ + +int dap_proc_thread_create(dap_proc_thread_t *a_thread, int a_cpu_id) +{ + dap_return_val_if_pass(!a_thread || a_thread->context, -1); + + a_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD); + a_thread->context->_inheritor = a_thread; + int l_ret = dap_context_run(a_thread->context, a_cpu_id, DAP_CONTEXT_POLICY_TIMESHARING, + DAP_CONTEXT_PRIORITY_NORMAL, DAP_CONTEXT_FLAG_WAIT_FOR_STARTED, + s_context_callback_started, s_context_callback_stopped, a_thread); + if (l_ret) { + log_it(L_CRITICAL, "Create thread failed with code %d", l_ret); + } + return l_ret; +} + /** * @brief dap_proc_thread_init - * @param a_cpu_count 0 means autodetect + * @param a_threads_count 0 means autodetect * @return */ @@ -50,19 +72,11 @@ int dap_proc_thread_init(uint32_t a_threads_count) return -1; } s_threads = DAP_NEW_Z_SIZE(dap_proc_thread_t, sizeof(dap_proc_thread_t) * s_threads_count); - for (uint32_t i = 0; i < s_threads_count; i++) { - dap_proc_thread_t *l_thread = s_threads + i; - l_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD); - l_thread->context->_inheritor = l_thread; - int l_ret = dap_context_run(l_thread->context, i, DAP_CONTEXT_POLICY_TIMESHARING, - DAP_CONTEXT_PRIORITY_NORMAL, DAP_CONTEXT_FLAG_WAIT_FOR_STARTED, - s_context_callback_started, s_context_callback_stopped, l_thread); - if (l_ret) { - log_it(L_CRITICAL, "Create thread failed with code %d", l_ret); - return l_ret; - } + int l_ret = 0; + for (uint32_t i = 0; i < s_threads_count && !l_ret; ++i) { + l_ret = dap_proc_thread_create(s_threads + i, i); } - return 0; + return l_ret; } /** @@ -167,7 +181,8 @@ int dap_proc_thread_loop(dap_context_t *a_context) !(l_item = s_proc_queue_pull(l_thread, &l_item_priority))) pthread_cond_wait(&l_thread->queue_event, &l_thread->queue_lock); pthread_mutex_unlock(&l_thread->queue_lock); - debug_if(g_debug_reactor, L_DEBUG, "Call callback %p with arg %p on thread %p", + if (l_item) + debug_if(g_debug_reactor, L_DEBUG, "Call callback %p with arg %p on thread %p", l_item->callback, l_item->callback_arg, l_thread); if (!a_context->signal_exit && l_item->callback(l_item->callback_arg)) diff --git a/io/include/dap_proc_thread.h b/io/include/dap_proc_thread.h index 0ba6823228090592d8a4733fe4dfa0eb7f6faebe..716b273fe83134ea9a1ef6e9703765996297dde4 100644 --- a/io/include/dap_proc_thread.h +++ b/io/include/dap_proc_thread.h @@ -61,6 +61,7 @@ typedef struct dap_proc_thread { #define DAP_PROC_THREAD(a) (dap_proc_thread_t *)((a)->_inheritor); +int dap_proc_thread_create(dap_proc_thread_t *a_thread, int a_cpu_id); int dap_proc_thread_init(uint32_t a_threads_count); void dap_proc_thread_deinit(); int dap_proc_thread_loop(dap_context_t *a_context); diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c index 04467ee8bf1121ea77c94a1153b06db8f9575e43..12ee05a34405ac775b7c0227d3ffb0f1d55c5aaa 100644 --- a/net/link_manager/dap_link_manager.c +++ b/net/link_manager/dap_link_manager.c @@ -245,7 +245,7 @@ void dap_link_manager_deinit() DL_FOREACH_SAFE(s_link_manager->nets, it, tmp) dap_link_manager_remove_net(((dap_managed_net_t *)it->data)->id); pthread_rwlock_destroy(&s_link_manager->links_lock); - DAP_DELETE(s_link_manager); + DAP_DEL_Z(s_link_manager); } /**