예제 #1
0
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();
}
예제 #2
0
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]);
  }
}
예제 #3
0
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);
}
예제 #4
0
파일: lockmgr.c 프로젝트: Cy-4AH/showtime
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();
}
예제 #5
0
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();

}