Skip to content
Snippets Groups Projects
Commit 27f14df8 authored by pavel.uhanov's avatar pavel.uhanov Committed by Constantin P.
Browse files

feature-12348

parent 990a8a7a
No related branches found
No related tags found
1 merge request!403feature-12348
...@@ -349,6 +349,7 @@ static void *s_context_thread(void *a_arg) ...@@ -349,6 +349,7 @@ static void *s_context_thread(void *a_arg)
pthread_cond_destroy(&l_context->started_cond); pthread_cond_destroy(&l_context->started_cond);
pthread_mutex_destroy(&l_context->started_mutex); pthread_mutex_destroy(&l_context->started_mutex);
DAP_DELETE(l_context); DAP_DELETE(l_context);
DAP_DELETE(l_msg);
return NULL; return NULL;
} }
......
...@@ -37,9 +37,31 @@ static dap_proc_thread_t *s_threads = NULL; ...@@ -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_started(dap_context_t *a_context, void *a_arg);
static int s_context_callback_stopped(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 * @brief dap_proc_thread_init
* @param a_cpu_count 0 means autodetect * @param a_threads_count 0 means autodetect
* @return * @return
*/ */
...@@ -50,19 +72,11 @@ int dap_proc_thread_init(uint32_t a_threads_count) ...@@ -50,19 +72,11 @@ int dap_proc_thread_init(uint32_t a_threads_count)
return -1; return -1;
} }
s_threads = DAP_NEW_Z_SIZE(dap_proc_thread_t, sizeof(dap_proc_thread_t) * s_threads_count); 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++) { int l_ret = 0;
dap_proc_thread_t *l_thread = s_threads + i; for (uint32_t i = 0; i < s_threads_count && !l_ret; ++i) {
l_thread->context = dap_context_new(DAP_CONTEXT_TYPE_PROC_THREAD); l_ret = dap_proc_thread_create(s_threads + i, i);
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;
}
} }
return 0; return l_ret;
} }
/** /**
...@@ -167,7 +181,8 @@ int dap_proc_thread_loop(dap_context_t *a_context) ...@@ -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))) !(l_item = s_proc_queue_pull(l_thread, &l_item_priority)))
pthread_cond_wait(&l_thread->queue_event, &l_thread->queue_lock); pthread_cond_wait(&l_thread->queue_event, &l_thread->queue_lock);
pthread_mutex_unlock(&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); l_item->callback, l_item->callback_arg, l_thread);
if (!a_context->signal_exit && if (!a_context->signal_exit &&
l_item->callback(l_item->callback_arg)) l_item->callback(l_item->callback_arg))
......
...@@ -61,6 +61,7 @@ typedef struct dap_proc_thread { ...@@ -61,6 +61,7 @@ typedef struct dap_proc_thread {
#define DAP_PROC_THREAD(a) (dap_proc_thread_t *)((a)->_inheritor); #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); int dap_proc_thread_init(uint32_t a_threads_count);
void dap_proc_thread_deinit(); void dap_proc_thread_deinit();
int dap_proc_thread_loop(dap_context_t *a_context); int dap_proc_thread_loop(dap_context_t *a_context);
......
...@@ -245,7 +245,7 @@ void dap_link_manager_deinit() ...@@ -245,7 +245,7 @@ void dap_link_manager_deinit()
DL_FOREACH_SAFE(s_link_manager->nets, it, tmp) DL_FOREACH_SAFE(s_link_manager->nets, it, tmp)
dap_link_manager_remove_net(((dap_managed_net_t *)it->data)->id); dap_link_manager_remove_net(((dap_managed_net_t *)it->data)->id);
pthread_rwlock_destroy(&s_link_manager->links_lock); pthread_rwlock_destroy(&s_link_manager->links_lock);
DAP_DELETE(s_link_manager); DAP_DEL_Z(s_link_manager);
} }
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment