mirror of
https://github.com/fumiama/simple-dict.git
synced 2026-06-07 11:10:24 +08:00
add timer threadpool
This commit is contained in:
@@ -10,29 +10,29 @@ ELSE()
|
||||
add_definitions("-DCPUBIT32")
|
||||
ENDIF()
|
||||
|
||||
if($ENV{DICTKEYSZ})
|
||||
if(DEFINED ENV{DICTKEYSZ})
|
||||
message("custom dict key size: $ENV{DICTKEYSZ}")
|
||||
add_definitions("-DDICTKEYSZ=$ENV{DICTKEYSZ}")
|
||||
add_definitions(-DDICTKEYSZ=$ENV{DICTKEYSZ})
|
||||
endif()
|
||||
if($ENV{DICTDATSZ})
|
||||
if(DEFINED ENV{DICTDATSZ})
|
||||
message("custom dict data size: $ENV{DICTDATSZ}")
|
||||
add_definitions("-DDICTDATSZ=$ENV{DICTDATSZ}")
|
||||
add_definitions(-DDICTDATSZ=$ENV{DICTDATSZ})
|
||||
endif()
|
||||
if($ENV{CRYPTO_SUMTABLE})
|
||||
if(DEFINED ENV{CRYPTO_SUMTABLE})
|
||||
message("custom suntable: $ENV{CRYPTO_SUMTABLE}")
|
||||
add_definitions("-DCRYPTO_SUMTABLE=$ENV{CRYPTO_SUMTABLE}")
|
||||
add_definitions(-DCRYPTO_SUMTABLE=$ENV{CRYPTO_SUMTABLE})
|
||||
endif()
|
||||
if($ENV{THREADCNT})
|
||||
if(DEFINED ENV{THREADCNT})
|
||||
message("custom suntable: $ENV{THREADCNT}")
|
||||
add_definitions("-DTHREADCNT=$ENV{THREADCNT}")
|
||||
add_definitions(-DTHREADCNT=$ENV{THREADCNT})
|
||||
endif()
|
||||
if($ENV{MAXWAITSEC})
|
||||
if(DEFINED ENV{MAXWAITSEC})
|
||||
message("custom suntable: $ENV{MAXWAITSEC}")
|
||||
add_definitions("-DMAXWAITSEC=$ENV{MAXWAITSEC}")
|
||||
add_definitions(-DMAXWAITSEC=$ENV{MAXWAITSEC})
|
||||
endif()
|
||||
if($ENV{DICTPOOLBIT})
|
||||
if(DEFINED ENV{DICTPOOLBIT})
|
||||
message("custom suntable: $ENV{DICTPOOLBIT}")
|
||||
add_definitions("-DDICTPOOLBIT=$ENV{DICTPOOLBIT}")
|
||||
add_definitions(-DDICTPOOLBIT=$ENV{DICTPOOLBIT})
|
||||
endif()
|
||||
|
||||
include_directories("/usr/local/include")
|
||||
|
||||
47
server.c
47
server.c
@@ -42,6 +42,8 @@ struct thread_timer_t {
|
||||
pthread_cond_t c;
|
||||
pthread_mutex_t mc;
|
||||
pthread_rwlock_t mb;
|
||||
pthread_cond_t tc;
|
||||
pthread_mutex_t tmc;
|
||||
uint8_t isbusy;
|
||||
uint8_t buf[CMDPACKET_LEN_MAX];
|
||||
};
|
||||
@@ -576,7 +578,13 @@ static void accept_timer(void *p) {
|
||||
pthread_rwlock_rdlock(&timer->mb);
|
||||
uint8_t isbusy = timer->isbusy;
|
||||
pthread_rwlock_unlock(&timer->mb);
|
||||
if(!isbusy) break;
|
||||
if(!isbusy) {
|
||||
pthread_mutex_lock(&timer->tmc);
|
||||
puts("Timer sleep");
|
||||
pthread_cond_wait(&timer->tc, &timer->tmc);
|
||||
pthread_mutex_unlock(&timer->tmc);
|
||||
puts("Timer woke up");
|
||||
}
|
||||
if(is_dict_opening) touch_timer(p);
|
||||
time_t waitsec = time(NULL) - timer->touch;
|
||||
printf("Wait sec: %u, max: %u\n", (unsigned int)waitsec, MAXWAITSEC);
|
||||
@@ -609,6 +617,8 @@ static void cleanup_thread(thread_timer_t* timer) {
|
||||
pthread_cond_destroy(&timer->c);
|
||||
pthread_mutex_destroy(&timer->mc);
|
||||
pthread_rwlock_destroy(&timer->mb);
|
||||
pthread_cond_destroy(&timer->tc);
|
||||
pthread_mutex_destroy(&timer->tmc);
|
||||
setdicts[timer->index].data[0] = 0;
|
||||
puts("Finish cleaning");
|
||||
}
|
||||
@@ -630,20 +640,18 @@ static void handle_accept(void *p) {
|
||||
pthread_cond_init(&timer_pointer_of(p)->c, NULL);
|
||||
pthread_mutex_init(&timer_pointer_of(p)->mc, NULL);
|
||||
pthread_rwlock_init(&timer_pointer_of(p)->mb, NULL);
|
||||
pthread_cond_init(&timer_pointer_of(p)->tc, NULL);
|
||||
pthread_mutex_init(&timer_pointer_of(p)->tmc, NULL);
|
||||
pthread_cleanup_push((void*)&cleanup_thread, p);
|
||||
puts("Handling accept...");
|
||||
pthread_t thread;
|
||||
if (pthread_create(&thread, &attr, (void *)&accept_timer, p)) {
|
||||
perror("Error creating timer thread");
|
||||
//cleanup_thread(timer_pointer_of(p));
|
||||
pthread_rwlock_unlock(&timer_pointer_of(p)->mb);
|
||||
return;
|
||||
}
|
||||
while(1) {
|
||||
puts("Handling accept...");
|
||||
pthread_t thread;
|
||||
pthread_rwlock_unlock(&timer_pointer_of(p)->mb);
|
||||
pthread_rwlock_wrlock(&timer_pointer_of(p)->mb);
|
||||
timer_pointer_of(p)->isbusy = 1;
|
||||
pthread_rwlock_unlock(&timer_pointer_of(p)->mb);
|
||||
if (pthread_create(&thread, &attr, (void *)&accept_timer, p)) {
|
||||
perror("Error creating timer thread");
|
||||
//cleanup_thread(timer_pointer_of(p));
|
||||
pthread_rwlock_unlock(&timer_pointer_of(p)->mb);
|
||||
return;
|
||||
}
|
||||
puts("Creating timer thread succeeded");
|
||||
int accept_fd = timer_pointer_of(p)->accept_fd;
|
||||
uint32_t index = timer_pointer_of(p)->index;
|
||||
@@ -741,9 +749,16 @@ static void handle_accept(void *p) {
|
||||
timer_pointer_of(p)->isbusy = 0;
|
||||
pthread_mutex_lock(&timer_pointer_of(p)->mc);
|
||||
pthread_rwlock_unlock(&timer_pointer_of(p)->mb);
|
||||
puts("Set thread status to idle");
|
||||
pthread_cond_wait(&timer_pointer_of(p)->c, &timer_pointer_of(p)->mc);
|
||||
pthread_mutex_unlock(&timer_pointer_of(p)->mc);
|
||||
puts("Thread wakeup");
|
||||
if(!pthread_kill(thread, 0)) {
|
||||
pthread_mutex_lock(&timer_pointer_of(p)->tmc);
|
||||
pthread_cond_signal(&timer_pointer_of(p)->tc); // wakeup thread
|
||||
pthread_mutex_unlock(&timer_pointer_of(p)->tmc);
|
||||
puts("Wakeup timer");
|
||||
}
|
||||
}
|
||||
pthread_cleanup_pop(1);
|
||||
}
|
||||
@@ -810,6 +825,11 @@ static void accept_client(int fd) {
|
||||
timer->index = p;
|
||||
timer->touch = time(NULL);
|
||||
reset_seq(p);
|
||||
pthread_rwlock_unlock(&timer->mb);
|
||||
pthread_rwlock_wrlock(&timer->mb);
|
||||
timer->isbusy = 1;
|
||||
pthread_rwlock_unlock(&timer->mb);
|
||||
puts("Set thread status to busy");
|
||||
if(timer->thread) {
|
||||
pthread_mutex_lock(&timer->mc);
|
||||
pthread_cond_signal(&timer->c); // wakeup thread
|
||||
@@ -818,7 +838,6 @@ static void accept_client(int fd) {
|
||||
} else if (pthread_create(&timer->thread, &attr, (void *)&handle_accept, timer)) {
|
||||
perror("Error creating thread");
|
||||
cleanup_thread(timer);
|
||||
pthread_rwlock_unlock(&timer->mb);
|
||||
continue;
|
||||
} else puts("Creating thread succeeded");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user