示例#1
0
文件: schedule.c 项目: deepfield/MRT
int 
schedule_wait_for_event (schedule_t *schedule)
{
   event_t *event;

   pthread_mutex_lock (&schedule->mutex_cond_lock);

   while (schedule->new_event_flag == 0) {
#ifdef MRT_DEBUG
      trace (TR_THREAD, schedule->trace, "pthread_cond_wait for a new event\n");
#endif /* MRT_DEBUG */
      pthread_cond_wait (&schedule->cond_new_event, 
			 &schedule->mutex_cond_lock);
   }

#ifdef MRT_DEBUG
   trace (TR_THREAD, schedule->trace, "Processing event queue\n");
#endif /* MRT_DEBUG */
   event = LL_GetHead (schedule->ll_events);

   if (event != NULL) {
     LL_RemoveFn (schedule->ll_events, event, NULL);
     schedule->new_event_flag --;
     schedule->lastrun = time (NULL);
   }
   else {
     trace (TR_ERROR, schedule->trace, 
	    "THREAD NULL event for %s -- strange...", 
	    schedule->description);
   }

   /* unlock -- we removed the event from the schedule quere */
   pthread_mutex_unlock (&schedule->mutex_cond_lock);

   if (event == NULL) {return (-1);}

#ifdef MRT_DEBUG
  if (event->description)
    trace (TR_THREAD, schedule->trace, 
      "THREAD Event %s now run (%d events left) for %s\n", 
      event->description, LL_GetCount (schedule->ll_events),
      schedule->description);
  else
    trace (TR_THREAD, schedule->trace, 
      "THREAD Event %x now run (%d events left) for %s\n", 
      event->call_fn, LL_GetCount (schedule->ll_events),
      schedule->description);
#endif /* MRT_DEBUG */

   schedule->is_running++;
   schedule_event_dispatch (event);
   schedule->is_running--;
  if (BIT_TEST (schedule->flags, MRT_SCHEDULE_DELETED))
    destroy_schedule (schedule);
   return (1);
}
示例#2
0
文件: schedule.c 项目: deepfield/MRT
int schedule_count (schedule_t *schedule) {
  int num;

  if (schedule == NULL) {return (-1);}
  /* obtain lock */
  pthread_mutex_lock (&schedule->mutex_cond_lock);
  num = LL_GetCount (schedule->ll_events);
  pthread_mutex_unlock (&schedule->mutex_cond_lock);

  return (num);
}
示例#3
0
文件: schedule.c 项目: deepfield/MRT
int
schedule_event3 (schedule_t *schedule, event_t *event)
{
   int n;

   /* obtain lock */
   pthread_mutex_lock (&schedule->mutex_cond_lock);

   LL_Add (schedule->ll_events, event);
   schedule->new_event_flag++;

   n = LL_GetCount (schedule->ll_events);
   if (schedule->maxnum < n)
	schedule->maxnum = n;

#ifdef HAVE_LIBPTHREAD
#ifdef MRT_DEBUG
   trace (TR_THREAD, schedule->trace, "pthread_cond_signal for a new event\n");
#endif /* MRT_DEBUG */
   pthread_cond_signal (&schedule->cond_new_event);
#endif /* HAVE_LIBPTHREAD */

#ifdef MRT_DEBUG
   if (event->description)
      trace (TR_THREAD, schedule->trace,
          "THREAD Event %s scheduled (%d events) for %s\n",
          event->description, n, schedule->description);
   else
      trace (TR_THREAD, schedule->trace,
          "THREAD Event %x scheduled (%d events) for %s\n",
          event->call_fn, n, schedule->description);
#endif /* MRT_DEBUG */

   /* release lock */
   pthread_mutex_unlock (&schedule->mutex_cond_lock);

#ifdef MRT_DEBUG
   if (n > 5000) {
      trace (TR_THREAD, schedule->trace, "THREAD Over 5000 events !!!!!!");
      trace (TR_THREAD, schedule->trace, "THREAD *** SCHEDULE OVERFLOW ***");
      return (-1);
   }
#endif /* MRT_DEBUG */
   
   return (1);
}
示例#4
0
文件: alist.c 项目: job/irrd
int
remove_access_list (int num, int permit, prefix_t *prefix, prefix_t *wildcard,
                    int exact, int refine) {
    condition_t *condition;

    if (num < 0 || num >= MAX_ALIST)
        return (-1);
    if (access_list[num] == NULL) {
        return (-1);
    }
    condition = find_access_list (num, permit, prefix, wildcard, exact, refine);
    if (condition == NULL)
        return (-1);

    Deref_Prefix (condition->prefix);
    Deref_Prefix (condition->wildcard);
    LL_Remove (access_list[num], condition);

    return (LL_GetCount (access_list[num]));
}
示例#5
0
文件: alist.c 项目: job/irrd
int
add_access_list (int num, int permit, prefix_t *prefix, prefix_t *wildcard,
                 int exact, int refine) {

    condition_t *condition = NULL;

    if (num < 0 || num >= MAX_ALIST)
        return (-1);
    if (find_access_list (num, permit, prefix, wildcard, exact, refine))
        return (0);

    if (access_list[num] == NULL) {
        access_list[num] = LL_Create (0);
    }
    condition = irrd_malloc(sizeof(condition_t));
    condition->permit = permit;
    /* expects Ref_Prefix can handle even a case of prefix == NULL */
    condition->prefix = Ref_Prefix (prefix);
    condition->wildcard = Ref_Prefix (wildcard);
    condition->exact = exact;
    condition->refine = refine;
    LL_Add (access_list[num], condition);
    return (LL_GetCount (access_list[num]));
}
示例#6
0
文件: schedule.c 项目: deepfield/MRT
int 
process_all_schedules (void)
{
  schedule_t *schedule;
  event_t *event = NULL;
  int i;
  pthread_t save;

  pthread_mutex_lock (&SCHEDULE_MASTER->mutex_lock);
  schedule = SCHEDULE_MASTER->last_schedule;
  for (i = 0; i < LL_GetCount (SCHEDULE_MASTER->ll_schedules); i++) {

    if (schedule == NULL) {
	schedule = LL_GetHead (SCHEDULE_MASTER->ll_schedules);
    }
    else {
        schedule = LL_GetNext (SCHEDULE_MASTER->ll_schedules, schedule);
        if (schedule == NULL)
	    schedule = LL_GetHead (SCHEDULE_MASTER->ll_schedules);
    }

    assert (schedule != NULL);

    if (schedule->is_running > 0 && !schedule->can_pass)
	continue;

    if (schedule->new_event_flag > 0) {
  	pthread_mutex_lock (&schedule->mutex_lock);
        event = LL_GetHead (schedule->ll_events);
        LL_RemoveFn (schedule->ll_events, event, NULL);
        schedule->new_event_flag --;
        schedule->lastrun = time (NULL);
  	pthread_mutex_unlock (&schedule->mutex_lock);
	SCHEDULE_MASTER->last_schedule = schedule;
        break;
    }
  }
  pthread_mutex_unlock (&SCHEDULE_MASTER->mutex_lock);

  if (event == NULL) {
    return (0);
  }

#ifdef MRT_DEBUG
  if (event->description)
    trace (TR_THREAD, schedule->trace, 
      "THREAD Event %s now run (%d events left) for %s\n", 
      event->description, LL_GetCount (schedule->ll_events),
      schedule->description);
  else
    trace (TR_THREAD, schedule->trace, 
      "THREAD Event %x now run (%d events left) for %s\n", 
      event->call_fn, LL_GetCount (schedule->ll_events),
      schedule->description);
#endif /* MRT_DEBUG */

  save = set_thread_id (schedule->self);
  schedule->is_running++;
  schedule_event_dispatch (event);
  schedule->is_running--;
  if (BIT_TEST (schedule->flags, MRT_SCHEDULE_DELETED))
    destroy_schedule (schedule);
  set_thread_id (save);
  return (1);
}