12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #include <assert.h>
- #include <errno.h>
- #include <pthread.h>
- #include <time.h>
- #include "posix-timer.h"
- int
- timer_delete (timerid)
- 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;
- }
|