1
0
mirror of https://github.com/fumiama/simple-dict.git synced 2026-06-05 02:00:25 +08:00

fix: sigsegv

This commit is contained in:
源文雨
2022-07-02 19:26:24 +08:00
committed by GitHub
parent 5f2bc0db6d
commit 424e5ef484

View File

@@ -557,7 +557,6 @@ static void handle_segv(int signo) {
static void accept_timer(void *p) { static void accept_timer(void *p) {
thread_timer_t *timer = timer_pointer_of(p); thread_timer_t *timer = timer_pointer_of(p);
uint32_t index = timer->index; uint32_t index = timer->index;
pthread_t thread = timer->thread;
sigset_t mask; sigset_t mask;
sigemptyset(&mask); sigemptyset(&mask);
@@ -565,13 +564,16 @@ static void accept_timer(void *p) {
pthread_sigmask(SIG_BLOCK, &mask, NULL); pthread_sigmask(SIG_BLOCK, &mask, NULL);
sleep(MAXWAITSEC / 4); sleep(MAXWAITSEC / 4);
while(!pthread_kill(thread, 0)) { while(timer->thread && !pthread_kill(timer->thread, 0)) {
if(is_dict_opening) touch_timer(p); if(is_dict_opening) touch_timer(p);
time_t waitsec = time(NULL) - timer->touch; time_t waitsec = time(NULL) - timer->touch;
printf("Wait sec: %u, max: %u\n", (unsigned int)waitsec, MAXWAITSEC); printf("Wait sec: %u, max: %u\n", (unsigned int)waitsec, MAXWAITSEC);
if(waitsec > MAXWAITSEC) { if(waitsec > MAXWAITSEC) {
pthread_kill(thread, SIGQUIT); pthread_t thread = timer->thread;
puts("Kill thread"); if(thread) {
pthread_kill(thread, SIGQUIT);
puts("Kill thread");
}
break; break;
} }
sleep(MAXWAITSEC / 4); sleep(MAXWAITSEC / 4);
@@ -584,14 +586,14 @@ static void cleanup_thread(thread_timer_t* timer) {
sigaddset(&mask, SIGPIPE); // 防止处理嵌套 sigaddset(&mask, SIGPIPE); // 防止处理嵌套
pthread_sigmask(SIG_BLOCK, &mask, NULL); pthread_sigmask(SIG_BLOCK, &mask, NULL);
puts("Start cleaning"); puts("Start cleaning");
timer->thread = 0;
setdicts[timer->index].data[0] = 0;
if(timer->accept_fd) { if(timer->accept_fd) {
close(timer->accept_fd); close(timer->accept_fd);
timer->accept_fd = 0; timer->accept_fd = 0;
puts("Close accept"); puts("Close accept");
} }
close_dict(timer->index); close_dict(timer->index);
timer->thread = 0;
setdicts[timer->index].data[0] = 0;
puts("Finish cleaning"); puts("Finish cleaning");
} }