Пример #1
0
/*-----------------------------------------------------------
 *  Name: 	LL_ClearFn()
 *  Created:	Wed Aug 31 01:31:06 1994
 *  Author: 	Jonathan DeKock   <dekock@winter>
 *  DESCR:  	removes every item from the list,
 *              but leaves attributes intact.
 */
void LL_ClearFn(LINKED_LIST *ll, LL_DestroyProc destroy)
{
   DATA_PTR data;

   while ((data = LL_GetHead(ll))) { 
      LL_RemoveFn(ll, data, destroy);
   }
}
Пример #2
0
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);
}
Пример #3
0
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);
}