diff options
author | lantw44 <lantw44@gmail.com> | 2013-01-26 20:29:09 +0800 |
---|---|---|
committer | lantw44 <lantw44@gmail.com> | 2013-01-26 20:29:09 +0800 |
commit | c41f897304100c89451e91acb0a47b3f07fc7b51 (patch) | |
tree | 474fb9045318b674cf01c70f087cb6efabbdf3a9 /src/disptime.c | |
parent | e5ee20baf2abee4527a01193a30ea27a33ca1e31 (diff) | |
download | sctjudge-c41f897304100c89451e91acb0a47b3f07fc7b51.tar.gz sctjudge-c41f897304100c89451e91acb0a47b3f07fc7b51.tar.zst sctjudge-c41f897304100c89451e91acb0a47b3f07fc7b51.zip |
清除所有 pthread_cancel()
已使用 sem_timedwait 和 sem_post 取代所有以往需要 pthread_cancel 的地方
Diffstat (limited to 'src/disptime.c')
-rw-r--r-- | src/disptime.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/disptime.c b/src/disptime.c index 9711b7c..deeee68 100644 --- a/src/disptime.c +++ b/src/disptime.c @@ -15,6 +15,7 @@ void* sctjudge_displaytime(void* arg){ struct timespec timeinit, timecur, timepast; struct timespec timesleep; + struct timespec timeexpire; timesleep.tv_sec = 0; timesleep.tv_nsec = (*(long*)arg); @@ -42,11 +43,7 @@ void* sctjudge_displaytime(void* arg){ tdisplay_yes = 1; pthread_mutex_unlock(&tdisplay_mx); - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); - - sem_wait(&addthr); - pthread_testcancel(); + sem_wait(&dispthr); #ifndef HAVE_CONF_CAP enable_setuid(); @@ -65,10 +62,7 @@ void* sctjudge_displaytime(void* arg){ sprintf(statusfile, PROC_PATH"/%d/status", pidcopy); #endif - pthread_testcancel(); - - while(1){ - pthread_testcancel(); + do{ clock_gettime(CLOCK_REALTIME, &timecur); difftimespec(&timeinit, &timecur, &timepast); printf("\r%4ld.%03ld 秒", timepast.tv_sec, @@ -139,8 +133,12 @@ void* sctjudge_displaytime(void* arg){ firstrun = 0; #endif fflush(stdout); - nanosleep(×leep, NULL); - } + + clock_gettime(CLOCK_REALTIME, &timecur); + timeexpire.tv_sec = timecur.tv_sec + timesleep.tv_sec; + timeexpire.tv_nsec = timecur.tv_nsec + timesleep.tv_nsec; + checktimespec(&timeexpire); + }while(sem_timedwait(&dispthr, &timeexpire)); pthread_mutex_lock(&tdisplay_mx); tdisplay_yes = 0; |