diff options
| -rw-r--r-- | src/time/timer_create.c | 33 | ||||
| -rw-r--r-- | src/time/timer_delete.c | 5 | ||||
| -rw-r--r-- | src/time/timer_getoverrun.c | 3 | ||||
| -rw-r--r-- | src/time/timer_gettime.c | 3 | ||||
| -rw-r--r-- | src/time/timer_settime.c | 3 | 
5 files changed, 19 insertions, 28 deletions
| diff --git a/src/time/timer_create.c b/src/time/timer_create.c index e35293cc..a0ee845c 100644 --- a/src/time/timer_create.c +++ b/src/time/timer_create.c @@ -52,40 +52,35 @@ static void *start(void *arg)  int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)  { -	struct sigevent sev = {  -		.sigev_notify = SIGEV_SIGNAL, -		.sigev_signo = SIGALRM -	};  	pthread_t td;  	pthread_attr_t attr;  	int r;  	struct start_args args; -	timer_t t; -	struct ksigevent ksev; +	struct ksigevent ksev, *ksevp=0;  	int timerid; -	if (evp) sev = *evp; - -	switch (sev.sigev_notify) { +	switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {  	case SIGEV_NONE:  	case SIGEV_SIGNAL: -		ksev.sigev_value = evp ? sev.sigev_value -			: (union sigval){.sival_ptr=t}; -		ksev.sigev_signo = sev.sigev_signo; -		ksev.sigev_notify = sev.sigev_notify; -		ksev.sigev_tid = 0; -		if (syscall(SYS_timer_create, clk, &ksev, &timerid) < 0) +		if (evp) { +			ksev.sigev_value = evp->sigev_value; +			ksev.sigev_signo = evp->sigev_signo; +			ksev.sigev_notify = evp->sigev_notify; +			ksev.sigev_tid = 0; +			ksevp = &ksev; +		} +		if (syscall(SYS_timer_create, clk, ksevp, &timerid) < 0)  			return -1; -		*res = (void *)(2*timerid+1); +		*res = (void *)timerid;  		break;  	case SIGEV_THREAD: -		if (sev.sigev_notify_attributes) -			attr = *sev.sigev_notify_attributes; +		if (evp->sigev_notify_attributes) +			attr = *evp->sigev_notify_attributes;  		else  			pthread_attr_init(&attr);  		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);  		pthread_barrier_init(&args.b, 0, 2); -		args.sev = &sev; +		args.sev = evp;  		r = pthread_create(&td, &attr, start, &args);  		if (r) {  			errno = r; diff --git a/src/time/timer_delete.c b/src/time/timer_delete.c index 7c82b183..f05b27d5 100644 --- a/src/time/timer_delete.c +++ b/src/time/timer_delete.c @@ -3,7 +3,6 @@  int timer_delete(timer_t t)  { -	if ((uintptr_t)t & 1) -		return __syscall(SYS_timer_delete, ((unsigned long)t / 2)); -	return pthread_cancel(t); +	if ((uintptr_t)t >= 0x100000) return pthread_cancel(t); +	return __syscall(SYS_timer_delete, (long)t);  } diff --git a/src/time/timer_getoverrun.c b/src/time/timer_getoverrun.c index fa7715bb..8a86833d 100644 --- a/src/time/timer_getoverrun.c +++ b/src/time/timer_getoverrun.c @@ -3,7 +3,6 @@  int timer_getoverrun(timer_t t)  { -	if ((uintptr_t)t & 1) t = (void *)((unsigned long)t / 2); -	else t = ((pthread_t)t)->result; +	if ((uintptr_t)t >= 0x100000) t = ((pthread_t)t)->result;  	return syscall(SYS_timer_getoverrun, (long)t);  } diff --git a/src/time/timer_gettime.c b/src/time/timer_gettime.c index 2320873e..5a858218 100644 --- a/src/time/timer_gettime.c +++ b/src/time/timer_gettime.c @@ -3,7 +3,6 @@  int timer_gettime(timer_t t, struct itimerspec *val)  { -	if ((uintptr_t)t & 1) t = (void *)((unsigned long)t / 2); -	else t = ((pthread_t)t)->result; +	if ((uintptr_t)t >= 0x100000) t = ((pthread_t)t)->result;  	return syscall(SYS_timer_gettime, (long)t, val);  } diff --git a/src/time/timer_settime.c b/src/time/timer_settime.c index 00708f0e..c400d45c 100644 --- a/src/time/timer_settime.c +++ b/src/time/timer_settime.c @@ -3,7 +3,6 @@  int timer_settime(timer_t t, int flags, const struct itimerspec *val, struct itimerspec *old)  { -	if ((uintptr_t)t & 1) t = (void *)((unsigned long)t / 2); -	else t = ((pthread_t)t)->result; +	if ((uintptr_t)t >= 0x100000) t = ((pthread_t)t)->result;  	return syscall(SYS_timer_settime, (long)t, flags, val, old);  } | 
