diff --git a/.gitignore b/.gitignore index 8b9f551..70795cb 100644 --- a/.gitignore +++ b/.gitignore @@ -48,9 +48,11 @@ src/tests/test_pthread_lock src/tests/test_split_string src/tests/test_uniq_skiplist src/tests/test_server_id_func +src/tests/test_pipe # other *.swp +*.swo php-fastcommon/.deps php-fastcommon/.libs/ diff --git a/HISTORY b/HISTORY index 5b37c9b..29bfed8 100644 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,5 @@ -Version 1.44 2020-03-08 +Version 1.44 2020-03-09 * add test file src/tests/test_pthread_lock.c * add uniq_skiplist.[hc] * add function split_string_ex @@ -17,6 +17,7 @@ Version 1.44 2020-03-08 * char_converter.[hc]: add function fast_char_unescape * struct fast_task_info add ctx pointer for libserverframe nio * struct thread_data add waiting_queue for Linux eventfd notify + * struct fast_task_info add canceled field for complicated thread model Version 1.43 2019-12-25 * replace function call system to getExecResult, diff --git a/src/fast_task_queue.h b/src/fast_task_queue.h index d98e33f..469be34 100644 --- a/src/fast_task_queue.h +++ b/src/fast_task_queue.h @@ -44,7 +44,7 @@ struct nio_thread_data struct ioevent_puller ev_puller; struct fast_timer timer; int pipe_fds[2]; //for notify - struct fast_task_info *deleted_list; + struct fast_task_info *deleted_list; //tasks for cleanup ThreadLoopCallback thread_loop_callback; void *arg; //extra argument pointer struct { @@ -64,6 +64,7 @@ struct fast_task_info int length; //data length int offset; //current offset char nio_stage; //stage for network IO + bool canceled; //if task canceled int64_t req_count; //request count TaskFinishCallback finish_callback; struct nio_thread_data *thread_data; diff --git a/src/ioevent_loop.c b/src/ioevent_loop.c index bb0ce40..1081c0c 100644 --- a/src/ioevent_loop.c +++ b/src/ioevent_loop.c @@ -77,16 +77,6 @@ static void deal_timeouts(FastTimerEntry *head) } } -void iovent_add_to_deleted_list(struct fast_task_info *pTask) -{ - if (pTask->thread_data == NULL) { - return; - } - - pTask->next = pTask->thread_data->deleted_list; - pTask->thread_data->deleted_list = pTask; -} - int ioevent_loop(struct nio_thread_data *pThreadData, IOEventCallback recv_notify_callback, TaskCleanUpCallback clean_up_callback, volatile bool *continue_flag) @@ -94,7 +84,7 @@ int ioevent_loop(struct nio_thread_data *pThreadData, int result; IOEventEntry ev_notify; FastTimerEntry head; - struct fast_task_info *pTask; + struct fast_task_info *task; time_t last_check_time; int count; @@ -142,13 +132,13 @@ int ioevent_loop(struct nio_thread_data *pThreadData, count = 0; while (pThreadData->deleted_list != NULL) { - pTask = pThreadData->deleted_list; - pThreadData->deleted_list = pTask->next; + task = pThreadData->deleted_list; + pThreadData->deleted_list = task->next; - clean_up_callback(pTask); + clean_up_callback(task); count++; } - logDebug("cleanup task count: %d", count); + //logInfo("cleanup task count: %d", count); } if (g_current_time - last_check_time > 0) @@ -170,16 +160,16 @@ int ioevent_loop(struct nio_thread_data *pThreadData, return 0; } -int ioevent_set(struct fast_task_info *pTask, struct nio_thread_data *pThread, +int ioevent_set(struct fast_task_info *task, struct nio_thread_data *pThread, int sock, short event, IOEventCallback callback, const int timeout) { int result; - pTask->thread_data = pThread; - pTask->event.fd = sock; - pTask->event.callback = callback; + task->thread_data = pThread; + task->event.fd = sock; + task->event.callback = callback; if (ioevent_attach(&pThread->ev_puller, - sock, event, pTask) < 0) + sock, event, task) < 0) { result = errno != 0 ? errno : ENOENT; logError("file: "__FILE__", line: %d, " \ @@ -189,9 +179,9 @@ int ioevent_set(struct fast_task_info *pTask, struct nio_thread_data *pThread, return result; } - pTask->event.timer.data = pTask; - pTask->event.timer.expires = g_current_time + timeout; - result = fast_timer_add(&pThread->timer, &pTask->event.timer); + task->event.timer.data = task; + task->event.timer.expires = g_current_time + timeout; + result = fast_timer_add(&pThread->timer, &task->event.timer); if (result != 0) { logError("file: "__FILE__", line: %d, " \ diff --git a/src/ioevent_loop.h b/src/ioevent_loop.h index d875eec..0eefbc5 100644 --- a/src/ioevent_loop.h +++ b/src/ioevent_loop.h @@ -17,7 +17,23 @@ int ioevent_remove(IOEventPoller *ioevent, void *data); int ioevent_set(struct fast_task_info *pTask, struct nio_thread_data *pThread, int sock, short event, IOEventCallback callback, const int timeout); -void iovent_add_to_deleted_list(struct fast_task_info *pTask); +static inline void iovent_add_to_deleted_list(struct fast_task_info *task) +{ + if (task->thread_data == NULL) + { + return; + } + + if (task->canceled) { + logError("file: "__FILE__", line: %d, " + "task %p already canceled", __LINE__, task); + return; + } + + task->canceled = true; + task->next = task->thread_data->deleted_list; + task->thread_data->deleted_list = task; +} #ifdef __cplusplus }