#include <sys/stat.h>
#ifdef USE_SERVICE_APP
#include <service_app.h>
-static espp_service_s g_svc = { -1, 0, NULL };
+static espp_service_s g_svc = { NULL, NULL, -1, 0, NULL };
#else
-static espp_service_s g_svc = { false, NULL, -1, 0, NULL };
+static espp_service_s g_svc = { NULL, false, -1, 0, NULL };
static struct sigaction g_int_old_action;
static struct sigaction g_abrt_old_action;
static struct sigaction g_segv_old_action;
LOG_DEBUG_LEAVE();
}
#else
+#define NUM_OF_CLIENTS_CHECK_TIMER_SEC 10
+
+static gboolean __timer_cb(gpointer data)
+{
+ espp_service_s *svc = (espp_service_s *)data;
+ guint num_of_clients;
+
+ ASSERT(svc);
+ ASSERT(svc->fd_table);
+
+ if ((num_of_clients = g_hash_table_size(svc->fd_table)) == 0) {
+ LOG_WARNING("num of clients is 0, quit main loop to exit service...");
+ g_main_loop_quit(svc->mainloop);
+ return G_SOURCE_REMOVE;
+ }
+
+ LOG_DEBUG("num of clients[%d]", num_of_clients);
+ return G_SOURCE_CONTINUE;
+}
+
+static gpointer __loop_thread_func(gpointer data)
+{
+ espp_service_s *svc = (espp_service_s *)data;
+
+ ASSERT(svc);
+
+ g_timeout_add_seconds(NUM_OF_CLIENTS_CHECK_TIMER_SEC, __timer_cb, svc);
+
+ LOG_DEBUG("loop[%p] runs", svc->mainloop);
+ g_main_loop_run(svc->mainloop);
+
+ g_main_loop_unref(svc->mainloop);
+ svc->mainloop = NULL;
+
+ service_app_exit();
+ LOG_DEBUG("request to exit service");
+
+ return NULL;
+}
+
static bool svc_app_create_cb(void *user_data)
{
espp_service_s *svc = (espp_service_s *)user_data;
svc->fd_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, espp_service_handle_destroy_cb);
+ svc->mainloop = g_main_loop_new(NULL, FALSE);
+ svc->thread = g_thread_new("loop-thread-for-timer", __loop_thread_func, svc);
+
return true;
}
g_hash_table_destroy(svc->fd_table);
espp_service_deinit_socket(svc);
+ g_thread_join(svc->thread);
+ LOG_DEBUG("thread[%p] joined", svc->thread);
+ svc->thread = NULL;
+
LOG_WARNING("exit");
}