int mp_lockmgr(void *ptr, lockmgr_op_t op) { media_pipe_t *mp = ptr; switch(op) { case LOCKMGR_UNLOCK: hts_mutex_unlock(&mp->mp_mutex); return 0; case LOCKMGR_LOCK: hts_mutex_lock(&mp->mp_mutex); return 0; case LOCKMGR_TRY: return hts_mutex_trylock(&mp->mp_mutex); case LOCKMGR_RETAIN: atomic_inc(&mp->mp_refcount); return 0; case LOCKMGR_RELEASE: mp_release(mp); return 0; } abort(); }
static void ifv_autoclose(callout_t *c, void *aux) { if(hts_mutex_trylock(&image_from_video_mutex[1])) { callout_arm(&thumb_flush_callout, ifv_autoclose, NULL, 5); } else { TRACE(TRACE_DEBUG, "Thumb", "Closing movie for thumb sources"); ifv_close(); hts_mutex_unlock(&image_from_video_mutex[1]); } }
void prop_courier_poll_with_alarm(prop_courier_t *pc, int maxtime) { prop_notify_t *n, *next; if(!hts_mutex_trylock(&prop_mutex)) { TAILQ_MERGE(&pc->pc_dispatch_queue, &pc->pc_queue_exp, hpn_link); TAILQ_MERGE(&pc->pc_dispatch_queue, &pc->pc_queue_nor, hpn_link); for(n = TAILQ_FIRST(&pc->pc_free_queue); n != NULL; n = next) { next = TAILQ_NEXT(n, hpn_link); prop_sub_ref_dec_locked(n->hpn_sub); pool_put(notify_pool, n); } TAILQ_INIT(&pc->pc_free_queue); hts_mutex_unlock(&prop_mutex); } if(TAILQ_FIRST(&pc->pc_dispatch_queue) == NULL) return; alarm_fired = 0; struct itimerval it; it.it_value.tv_sec = 0; it.it_value.tv_usec = maxtime; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &it, NULL); while((n = TAILQ_FIRST(&pc->pc_dispatch_queue)) != NULL && !alarm_fired) { prop_dispatch_one(n, PROP_LOCK_LOCK); TAILQ_REMOVE(&pc->pc_dispatch_queue, n, hpn_link); TAILQ_INSERT_TAIL(&pc->pc_free_queue, n, hpn_link); } it.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &it, NULL); }
int lockmgr_handler(void *ptr, lockmgr_op_t op) { lockmgr_t *lm = ptr; switch(op) { case LOCKMGR_UNLOCK: hts_mutex_unlock(&lm->lm_mutex); return 0; case LOCKMGR_LOCK: hts_mutex_lock(&lm->lm_mutex); return 0; case LOCKMGR_TRY: return hts_mutex_trylock(&lm->lm_mutex); case LOCKMGR_RETAIN: atomic_inc(&lm->lm_refcount); return 0; case LOCKMGR_RELEASE: lm->lm_release(ptr); return 0; } abort(); }
static int htsmsg_store_lockmgr(void *ptr, lockmgr_op_t op) { loaded_msg_t *lm = ptr; switch(op) { case LOCKMGR_UNLOCK: hts_mutex_unlock(&loaded_msg_mutex); return 0; case LOCKMGR_LOCK: hts_mutex_lock(&loaded_msg_mutex); return 0; case LOCKMGR_TRY: return hts_mutex_trylock(&loaded_msg_mutex); case LOCKMGR_RETAIN: atomic_inc(&lm->lm_refcount); return 0; case LOCKMGR_RELEASE: loaded_msg_release(lm); return 0; } abort(); }