sched_thread.c: task can execute in a new thread

pull/5/head
yuqing 2015-10-16 10:43:02 +08:00
parent 75198e5005
commit 90ea025cb5
4 changed files with 61 additions and 2 deletions

View File

@ -1,4 +1,7 @@
Version 1.23 2015-10-16
* sched_thread.c: task can execute in a new thread
Version 1.22 2015-10-10
* export php function: fastcommon_get_first_local_ip
* add function is_private_ip

View File

@ -2,7 +2,7 @@
%define LibFastcommonDevel libfastcommon-devel
Name: libfastcommon
Version: 1.0.22
Version: 1.0.23
Release: 1%{?dist}
Summary: c common functions library extracted from my open source projects FastDFS
License: GPL

View File

@ -266,6 +266,29 @@ static int sched_check_waiting(ScheduleContext *pContext)
return 0;
}
static void *sched_call_func(void *args)
{
ScheduleEntry *pEntry;
void *func_args;
TaskFunc task_func;
int task_id;
pEntry = (ScheduleEntry *)args;
task_func = pEntry->task_func;
func_args = pEntry->func_args;
task_id = pEntry->id;
logDebug("file: "__FILE__", line: %d, " \
"thread enter, task id: %d", __LINE__, task_id);
pEntry->thread_running = true;
task_func(func_args);
logDebug("file: "__FILE__", line: %d, " \
"thread exit, task id: %d", __LINE__, task_id);
return NULL;
}
static void *sched_thread_entrance(void *args)
{
ScheduleContext *pContext;
@ -319,7 +342,34 @@ static void *sched_thread_entrance(void *args)
&& pCurrent->next_call_time <= g_current_time))
{
//fprintf(stderr, "exec task id=%d\n", pCurrent->id);
pCurrent->task_func(pCurrent->func_args);
if (!pCurrent->new_thread)
{
pCurrent->task_func(pCurrent->func_args);
}
else
{
pthread_t tid;
int result;
pCurrent->thread_running = false;
if ((result=pthread_create(&tid, NULL,
sched_call_func, pCurrent)) != 0)
{
logError("file: "__FILE__", line: %d, " \
"create thread failed, " \
"errno: %d, error info: %s", \
__LINE__, result, STRERROR(result));
}
usleep(1*1000);
for (i=1; !pCurrent->thread_running && i<100; i++)
{
logDebug("file: "__FILE__", line: %d, "
"task_id: %d, waiting thread ready, count %d",
__LINE__, pCurrent->id, i);
usleep(1*1000);
}
}
do
{
pCurrent->next_call_time += pCurrent->interval;

View File

@ -24,6 +24,10 @@ typedef struct tagScheduleEntry
int interval; //the interval for execute task, unit is second
bool new_thread; //run in a new thread
bool thread_running; //if new thread running, for internal use
TaskFunc task_func; //callback function
void *func_args; //arguments pass to callback function
@ -54,6 +58,7 @@ typedef struct
(schedule_entry).time_base.second = _second; \
(schedule_entry).interval = _interval; \
(schedule_entry).task_func = _task_func; \
(schedule_entry).new_thread = false; \
(schedule_entry).func_args = _func_args
#define INIT_SCHEDULE_ENTRY_EX(schedule_entry, _id, _time_base, \
@ -62,6 +67,7 @@ typedef struct
(schedule_entry).time_base = _time_base; \
(schedule_entry).interval = _interval; \
(schedule_entry).task_func = _task_func; \
(schedule_entry).new_thread = false; \
(schedule_entry).func_args = _func_args
#ifdef __cplusplus