aboutsummaryrefslogtreecommitdiffstats
path: root/bluez/timeout-mainloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'bluez/timeout-mainloop.c')
-rw-r--r--bluez/timeout-mainloop.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/bluez/timeout-mainloop.c b/bluez/timeout-mainloop.c
new file mode 100644
index 0000000..f099312
--- /dev/null
+++ b/bluez/timeout-mainloop.c
@@ -0,0 +1,85 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2014 Intel Corporation. All rights reserved.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "mainloop.h"
+#include "util.h"
+#include "timeout.h"
+
+struct timeout_data {
+ int id;
+ timeout_func_t func;
+ timeout_destroy_func_t destroy;
+ unsigned int timeout;
+ void *user_data;
+};
+
+static void timeout_callback(int id, void *user_data)
+{
+ struct timeout_data *data = user_data;
+
+ if (data->func(data->user_data) &&
+ !mainloop_modify_timeout(data->id, data->timeout))
+ return;
+
+ mainloop_remove_timeout(data->id);
+}
+
+static void timeout_destroy(void *user_data)
+{
+ struct timeout_data *data = user_data;
+
+ if (data->destroy)
+ data->destroy(data->user_data);
+
+ free(data);
+}
+
+unsigned int timeout_add(unsigned int timeout, timeout_func_t func,
+ void *user_data, timeout_destroy_func_t destroy)
+{
+ struct timeout_data *data;
+
+ data = new0(struct timeout_data, 1);
+ if (!data)
+ return 0;
+
+ data->func = func;
+ data->user_data = user_data;
+ data->timeout = timeout;
+ data->destroy = destroy;
+
+ data->id = mainloop_add_timeout(timeout, timeout_callback, data,
+ timeout_destroy);
+ if (data->id < 0) {
+ free(data);
+ return 0;
+ }
+
+ return (unsigned int) data->id;
+}
+
+void timeout_remove(unsigned int id)
+{
+ if (!id)
+ return;
+
+ mainloop_remove_timeout((int) id);
+}