aboutsummaryrefslogtreecommitdiffstats
path: root/src/disptime.c
diff options
context:
space:
mode:
authorlantw44 <lantw44@gmail.com>2013-01-26 20:29:09 +0800
committerlantw44 <lantw44@gmail.com>2013-01-26 20:29:09 +0800
commitc41f897304100c89451e91acb0a47b3f07fc7b51 (patch)
tree474fb9045318b674cf01c70f087cb6efabbdf3a9 /src/disptime.c
parente5ee20baf2abee4527a01193a30ea27a33ca1e31 (diff)
downloadsctjudge-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.c20
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(&timesleep, 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;