#include "aul_watchdog.h"
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
+#define AUL_CTOR __attribute__ ((constructor))
+#define AUL_DTOR __attribute__ ((destructor))
typedef struct client_channel_s {
int fd;
subapp_handler subapp;
data_control_provider_handler dcp;
GList* clients;
+ GRecMutex init_mutex;
GRecMutex mutex;
} launch_context;
static launch_context __context;
+AUL_CTOR static void __aul_constructor(void)
+{
+ g_rec_mutex_init(&__context.init_mutex);
+}
+
+AUL_DTOR static void __aul_destructor(void)
+{
+ if (g_rec_mutex_trylock(&__context.init_mutex))
+ g_rec_mutex_unlock(&__context.init_mutex);
+
+ g_rec_mutex_clear(&__context.init_mutex);
+}
+
static void __destroy_client_channel(gpointer data)
{
client_channel_t *channel = data;
static void __finalize_context(void)
{
- if (!__context.initialized)
+ g_rec_mutex_init(&__context.init_mutex);
+ if (!__context.initialized) {
+ g_rec_mutex_unlock(&__context.init_mutex);
return;
+ }
if (__context.worker) {
aul_worker_destroy(__context.worker);
g_rec_mutex_clear(&__context.mutex);
__context.initialized = false;
+ g_rec_mutex_unlock(&__context.init_mutex);
}
static int __initialize_context(void)
API int aul_launch_init(aul_handler_fn callback, void *user_data)
{
+ int ret;
+
+ g_rec_mutex_lock(&__context.init_mutex);
if (callback) {
__context.aul.callback = callback;
__context.aul.user_data = user_data;
}
- return __initialize_context();
+ ret = __initialize_context();
+ g_rec_mutex_unlock(&__context.init_mutex);
+
+ return ret;
}
API int aul_launch_fini(void)