#include <assert.h>
#include <stdarg.h>
#include <time.h>
+#include <unistd.h>
#include <urcu.h>
#include "libknot/libknot.h"
pthread_mutex_unlock(&events->mx);
return;
}
+ events->type = type;
event_set_time(events, type, 0);
events->forced[type] = false;
pthread_mutex_unlock(&events->mx);
pthread_mutex_lock(&events->mx);
events->running = false;
+ events->type = ZONE_EVENT_INVALID;
pthread_mutex_unlock(&events->mx);
reschedule(events);
}
reschedule(events);
}
+void zone_events_schedule_blocking(zone_t *zone, zone_event_type_t type, bool user)
+{
+ if (!zone || !valid_event(type)) {
+ return;
+ }
+
+ if (user) {
+ zone_events_schedule_user(zone, type);
+ } else {
+ zone_events_schedule_now(zone, type);
+ }
+
+ time_t now = time(NULL);
+ time_t sched_time = zone_events_get_time(zone, type);
+ while ((zone->events.running && zone->events.type == type) ||
+ (sched_time > 0 && sched_time <= now)) {
+ usleep(20000);
+ sched_time = zone_events_get_time(zone, type);
+ }
+}
+
void zone_events_enqueue(zone_t *zone, zone_event_type_t type)
{
if (!zone || !valid_event(type)) {
if (!events->running && !events->frozen &&
(!events->ufrozen || !ufreeze_applies(type))) {
events->running = true;
+ events->type = type;
event_set_time(events, type, ZONE_EVENT_IMMEDIATE);
worker_pool_assign(events->pool, &events->task);
pthread_mutex_unlock(&events->mx);
typedef struct zone_events {
pthread_mutex_t mx; //!< Mutex protecting the struct.
pthread_mutex_t reschedule_lock;//!< Prevent concurrent reschedule() making mess.
+
+ zone_event_type_t type; //!< Type of running event.
bool running; //!< Some zone event is being run.
+
bool frozen; //!< Terminated, don't schedule new events.
bool ufrozen; //!< Updates to the zone temporarily frozen by user.
*/
void zone_events_schedule_user(struct zone *zone, zone_event_type_t type);
+/*!
+ * \brief Schedule new zone event as soon as possible and wait for it's
+ * completion (end of task run), with optional forced flag.
+ *
+ * \param zone Zone to schedule new event for.
+ * \param type Zone event type.
+ * \param user Forced flag indication.
+ */
+void zone_events_schedule_blocking(struct zone *zone, zone_event_type_t type, bool user);
+
/*!
* \brief Freeze all zone events and prevent new events from running.
*