/** * Resets a specific timer * * @param t the new timer * @param timer_type @see sip_timer_type */ void sip_trans::reset_timer(timer* t, unsigned int timer_type) { timer** tp = fetch_timer(timer_type,timers); if(*tp != NULL){ DBG("Clearing old timer of type %c\n",timer_name((*tp)->type)); wheeltimer::instance()->remove_timer(*tp); } *tp = t; if(t) wheeltimer::instance()->insert_timer(t); }
/** * Fetches a specific timer * * @param timer_type @see sip_timer_type */ trans_timer* sip_trans::get_timer(unsigned int timer_type) { return *fetch_timer(timer_type,timers); }
/** * Tells if a specific timer is set * * @param timer_type @see sip_timer_type */ bool sip_trans::is_timer_set(unsigned int timer_type) { return (*fetch_timer(timer_type,timers) != NULL); }
PyObject* semaphore_acquire(SemaphoreObject *self, PyObject *blocking, long timeout) { PyObject *res = NULL; PyObject *current = NULL; PyObject *timer = NULL; LoopObject *loop = NULL; DEBUG("self:%p timeout:%ld counter:%d", self, timeout, self->counter); if (self->counter > 0) { self->counter--; DEBUG("counter decr self:%p", self); Py_RETURN_TRUE; } else if(PyObject_Not(blocking)) { Py_RETURN_FALSE; } loop = get_event_loop(); if (loop == NULL) { return NULL; } current = greenlet_getcurrent(); Py_XDECREF(current); if (current == NULL) { return NULL; } timer = loop_set_timeout(loop, timeout, NULL); if (timer == NULL) { return NULL; } if (PySet_Add(self->waiters, current) == -1) { ((TimerObject*)timer)->cancelled = 1; return NULL; } while (self->counter <= 0) { res = loop_switch(loop); Py_XDECREF(res); if (res == NULL) { if (PyErr_ExceptionMatches(TimeoutException)) { RDEBUG("catch TimeoutException self:%p", self); if (fetch_timer() == timer) { PyErr_Clear(); res = Py_False; goto fin; } } goto fin; } } self->counter--; res = Py_True; fin: ((TimerObject*)timer)->cancelled = 1; if (PySet_Discard(self->waiters, current) == -1) { res = NULL; } Py_DECREF(timer); Py_XINCREF(res); return res; }