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); }
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); }
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); }
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])); }
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])); }
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); }