/*----------------------------------------------------------- * 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); } }
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); }
/* remove it from the list */ void delete_schedule (schedule_t *schedule) { if (schedule->flags & MRT_SCHEDULE_DELETED) return; pthread_mutex_lock (&SCHEDULE_MASTER->mutex_lock); if (SCHEDULE_MASTER->last_schedule == schedule) SCHEDULE_MASTER->last_schedule = LL_GetNext (SCHEDULE_MASTER->ll_schedules, schedule); LL_RemoveFn (SCHEDULE_MASTER->ll_schedules, schedule, 0); pthread_mutex_unlock (&SCHEDULE_MASTER->mutex_lock); #ifdef MRT_DEBUG trace (TR_THREAD, schedule->trace, "THREAD Deleted schedule for %s\n", schedule->description); #endif /* MRT_DEBUG */ schedule->flags |= MRT_SCHEDULE_DELETED; }
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); }