// Event Loop
sd_event* loop;
+ int loop_is_running;
+
+ // Events
+ struct pakfire_ctx_events {
+ sd_event_source* loop_started;
+ sd_event_source* loop_exited;
+ } events;
// Logging
struct pakfire_ctx_log {
}
static void pakfire_ctx_free(struct pakfire_ctx* ctx) {
+ // Release the events
+ if (ctx->events.loop_started)
+ sd_event_source_unref(ctx->events.loop_started);
+ if (ctx->events.loop_exited)
+ sd_event_source_unref(ctx->events.loop_exited);
+
// Release event loop
if (ctx->loop)
sd_event_unref(ctx->loop);
// Event Loop
+static int pakfire_ctx_loop_exited(sd_event_source* event, void* data);
+
+static int pakfire_ctx_loop_started(sd_event_source* event, void* data) {
+ struct pakfire_ctx* self = data;
+
+ // Log action
+ DEBUG(self, "Event loop started\n");
+
+ // The loop is now running
+ self->loop_is_running = 1;
+
+ if (self->events.loop_exited)
+ sd_event_source_unref(self->events.loop_exited);
+
+ // Register an event that get's called once we exit
+ return sd_event_add_exit(self->loop,
+ &self->events.loop_exited, pakfire_ctx_loop_exited, self);
+}
+
+static int pakfire_ctx_loop_exited(sd_event_source* event, void* data) {
+ struct pakfire_ctx* self = data;
+
+ // Log action
+ DEBUG(self, "Event loop exited\n");
+
+ // The loop is no longer running
+ self->loop_is_running = 0;
+
+ if (self->events.loop_started)
+ sd_event_source_unref(self->events.loop_started);
+
+ // Register an event that get's called once we start again
+ return sd_event_add_defer(self->loop,
+ &self->events.loop_started, pakfire_ctx_loop_started, self);
+}
+
int pakfire_ctx_loop(struct pakfire_ctx* ctx, sd_event** loop) {
int r;
r = sd_event_new(&ctx->loop);
if (r < 0)
return r;
+
+ // Register an event that gets called when the loop started
+ r = sd_event_add_defer(ctx->loop,
+ &ctx->events.loop_started, pakfire_ctx_loop_started, ctx);
+ if (r < 0)
+ return r;
}
// Return the loop
return 0;
}
+int pakfire_ctx_loop_is_running(struct pakfire_ctx* self) {
+ return self->loop_is_running;
+}
+
// cURL
CURLSH* pakfire_ctx_curl_share(struct pakfire_ctx* ctx) {