123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #include <assert.h>
- #include <errno.h>
- #include <pthread.h>
- #include <time.h>
- #include "posix-timer.h"
- int
- timer_delete (
- timer_t timerid)
- {
- struct timer_node *timer;
- int retval = -1;
- pthread_mutex_lock (&__timer_mutex);
- timer = timer_id2ptr (timerid);
- if (! timer_valid (timer))
-
- __set_errno (EINVAL);
- else
- {
- if (timer->armed && timer->thread != NULL)
- {
- struct thread_node *thread = timer->thread;
- assert (thread != NULL);
-
- pthread_cleanup_push (__timer_mutex_cancel_handler, &__timer_mutex);
-
- while (thread->current_timer == timer)
- pthread_cond_wait (&thread->cond, &__timer_mutex);
- pthread_cleanup_pop (0);
- }
-
- timer->inuse = TIMER_DELETED;
- list_unlink_ip (&timer->links);
- timer_delref (timer);
- retval = 0;
- }
- pthread_mutex_unlock (&__timer_mutex);
- return retval;
- }
|