Add scanner_dispatcher_thread and code cleanup 09/306609/10 accepted/tizen/unified/20240306.094052 accepted/tizen/unified/toolchain/20240311.065443 accepted/tizen/unified/x/20240307.010822
authorJiyong <jiyong.min@samsung.com>
Fri, 23 Feb 2024 06:03:13 +0000 (15:03 +0900)
committerJiyong <jiyong.min@samsung.com>
Thu, 29 Feb 2024 01:37:50 +0000 (10:37 +0900)
Change-Id: I30fbf5fe7ed18e4c894c642610f6bfe2e0c89b94

packaging/media-server.spec
src/server/include/media-server-db.h
src/server/include/media-server-scanner.h
src/server/include/media-server-socket.h
src/server/media-server-db.c
src/server/media-server-main.c
src/server/media-server-scanner.c
src/server/media-server-socket.c

index c0514d9..c07e491 100644 (file)
@@ -1,6 +1,6 @@
 Name:       media-server
 Summary:    A server for media content management
-Version:    0.5.3
+Version:    0.5.4
 Release:    0
 Group:      Multimedia/Service
 License:    Apache-2.0
index 7adcb9e..0096d60 100644 (file)
 #ifndef _MEDIA_SERVER_DB_H_
 #define _MEDIA_SERVER_DB_H_
 
-#include <glib.h>
-
-void ms_db_finalize(void);
-gboolean ms_db_get_thread_status(void);
-gpointer ms_db_thread(gpointer data);
+void ms_db_update_thread_start(void);
+void ms_db_update_thread_stop(void);
+void ms_db_update_thread_join(void);
 
 #endif/* _MEDIA_SERVER_DB_H_ */
index 159bbe1..5aeda62 100644 (file)
 #ifndef _MEDIA_SERVER_SCANNER_H
 #define _MEDIA_SERVER_SCANNER_H
 
+#include <stdbool.h>
+
 int ms_scanner_start(void);
 bool ms_get_scanner_status(void);
 void ms_reset_scanner_status(void);
 int ms_get_scanner_pid(void);
 void ms_cleanup_scanner(void);
 
+void ms_scanner_dispatcher_thread_start(void);
+void ms_scanner_dispatcher_thread_stop(void);
+void ms_scanner_dispatcher_thread_join(void);
+
 #endif /*_MEDIA_SERVER_SCANNER_H*/
index f66834c..68ce924 100644 (file)
@@ -23,8 +23,8 @@
 #include "media-common-types.h"
 #include "media-util-ipc.h"
 
-gboolean ms_read_socket(GIOChannel *src, GIOCondition condition, gpointer user_data);
-gboolean ms_read_db_tcp_socket(GIOChannel *src, GIOCondition condition, gpointer data);
+gboolean ms_read_scanner_dispatcher_socket_func(GIOChannel *src, GIOCondition condition, gpointer user_data);
+gboolean ms_read_db_update_socket_func(GIOChannel *src, GIOCondition condition, gpointer data);
 int ms_send_scan_request(ms_comm_msg_s *send_msg, int client_sock);
 int ms_send_storage_scan_request(const char *root_path, const char *storage_id, ms_dir_scan_type_t scan_type, uid_t uid);
 gboolean ms_receive_message_from_scanner(GIOChannel *src, GIOCondition condition, gpointer data);
index 0b4b3bc..92dd5a2 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include <unistd.h>
+#include <glib.h>
 
 #include "media-util.h"
 #include "media-common-types.h"
 #include "media-server-socket.h"
 #include "media-server-db.h"
 
-static GMainLoop *g_db_mainloop = NULL;
-static guint g_db_source_id;
-static bool db_thread_ready = false;
+static GThread *g_db_update_thread;
+static GMainLoop *g_db_update_mainloop;
+static guint g_db_update_source_id;
 
-void ms_db_finalize(void)
-{
-       if (g_main_loop_is_running(g_db_mainloop)) {
-               g_source_destroy(g_main_context_find_source_by_id(g_main_context_get_thread_default(), g_db_source_id));
-               g_main_loop_quit(g_db_mainloop);
-       }
-}
-
-gboolean ms_db_get_thread_status(void)
-{
-       return db_thread_ready;
-}
-
-gpointer ms_db_thread(gpointer data)
+static gpointer __ms_db_update_thread_func(gpointer data)
 {
        int sockfd = -1;
-       int ret = MS_MEDIA_ERR_NONE;
+       GMainContext *context = NULL;
        GSource *source = NULL;
        GIOChannel *channel = NULL;
-       GMainContext *context = NULL;
 
-       /* Create TCP Socket*/
-       ret = ms_ipc_create_server_socket(MS_DB_UPDATE_PORT, &sockfd);
-       MS_DBG_RETVM_IF(ret != MS_MEDIA_ERR_NONE, NULL, "Failed to create socket");
+       if (ms_ipc_create_server_socket(MS_DB_UPDATE_PORT, &sockfd) != MS_MEDIA_ERR_NONE) {
+               MS_DBG_ERR("Failed to create socket");
+               return NULL;
+       }
 
        if (ms_cynara_enable_credentials_passing(sockfd) != MS_MEDIA_ERR_NONE) {
                close(sockfd);
@@ -62,8 +50,7 @@ gpointer ms_db_thread(gpointer data)
        }
 
        context = g_main_context_new();
-       /*Init main loop*/
-       g_db_mainloop = g_main_loop_new(context, FALSE);
+       g_db_update_mainloop = g_main_loop_new(context, FALSE);
        g_main_context_push_thread_default(context);
 
        /* Create new channel to watch UDP socket */
@@ -72,19 +59,41 @@ gpointer ms_db_thread(gpointer data)
        g_io_channel_unref(channel);
 
        /* Set callback to be called when socket is readable */
-       g_source_set_callback(source, (GSourceFunc)ms_read_db_tcp_socket, NULL, NULL);
-       g_db_source_id = g_source_attach(source, context);
+       g_source_set_callback(source, (GSourceFunc)ms_read_db_update_socket_func, NULL, NULL);
+       g_db_update_source_id = g_source_attach(source, context);
        g_source_unref(source);
 
-       MS_DBG_INFO("Media Server DB thread is running");
-       db_thread_ready = true;
+       MS_DBG_INFO("Media Server db update is running");
+       g_main_loop_run(g_db_update_mainloop);
+       MS_DBG_INFO("Media Server db update is shutting down");
 
-       g_main_loop_run(g_db_mainloop);
-
-       MS_DBG_INFO("Media Server DB thread is shutting down");
-       db_thread_ready = false;
        close(sockfd);
-       g_main_loop_unref(g_db_mainloop);
+       g_main_loop_unref(g_db_update_mainloop);
 
        return NULL;
 }
+
+void ms_db_update_thread_start(void)
+{
+       g_db_update_thread = g_thread_new("db_update_thread", __ms_db_update_thread_func, NULL);
+
+       MS_DBG_INFO("wait db update thread start");
+       while (!g_main_loop_is_running(g_db_update_mainloop))
+               usleep(10000);
+       MS_DBG_INFO("db update thread ready");
+}
+
+void ms_db_update_thread_stop(void)
+{
+       if (!g_main_loop_is_running(g_db_update_mainloop))
+               return;
+
+       g_source_destroy(g_main_context_find_source_by_id(g_main_context_get_thread_default(),
+               g_db_update_source_id));
+       g_main_loop_quit(g_db_update_mainloop);
+}
+
+void ms_db_update_thread_join(void)
+{
+       g_thread_join(g_db_update_thread);
+}
\ No newline at end of file
index 07cdc85..3a3766a 100644 (file)
@@ -51,7 +51,6 @@ extern GMutex scanner_mutex;
 GMainLoop *mainloop = NULL;
 bool power_off; /*If this is true, poweroff notification received*/
 
-static guint main_source_id;
 
 static void __ms_check_mediadb(void);
 static void __ms_update_storage_status(void);
@@ -133,10 +132,8 @@ static void __power_off_cb(void *data)
        MS_DBG_ERR("POWER OFF");
        power_off = true;
 
-       /*Quit DB Thread*/
-       ms_db_finalize();
-
-       g_source_remove(main_source_id);
+       ms_scanner_dispatcher_thread_stop();
+       ms_db_update_thread_stop();
 
        ms_sys_unset_device_block_event_cb();
        ms_sys_unset_poweroff_cb();
@@ -176,13 +173,10 @@ static void __ms_free_global_variable(void)
 
 int main(int argc, char **argv)
 {
-       GThread *db_thread = NULL;
-       GIOChannel *channel = NULL;
        power_off = false;
 #ifdef _USE_TVPD_MODE
        int ret = 0;
 #endif
-       int sockfd = -1;
 
        resource_pid_t stResource = {};
        stResource.pid = getpid();
@@ -240,36 +234,12 @@ int main(int argc, char **argv)
        /*prepare socket*/
        g_mkdir_with_parents(tzplatform_mkpath(TZ_SYS_RUN, "media-server"), 0777);
 
-       if (ms_ipc_create_server_socket(MS_SCANNER_PORT, &sockfd) != MS_MEDIA_ERR_NONE) {
-               MS_DBG_ERR("Failed to create socket");
-               resource_clear_cpu_boosting(stResource);
-               return -1;
-       }
-
-       if (ms_cynara_enable_credentials_passing(sockfd) != MS_MEDIA_ERR_NONE)
-               MS_DBG_ERR("Failed to setup credential passing");
+       ms_db_update_thread_start();
+       ms_scanner_dispatcher_thread_start();
 
-       channel = g_io_channel_unix_new(sockfd);
-       g_io_channel_set_close_on_unref(channel, TRUE);
-       main_source_id = g_io_add_watch(channel, G_IO_IN, ms_read_socket, NULL);
-       g_io_channel_unref(channel);
-
-       /* recevie event from other modules */
        __ms_add_event_receiver();
-
        __ms_add_signal_handler();
 
-       /*create each threads*/
-       db_thread = g_thread_new("db_thread", ms_db_thread, NULL);
-
-       /*clear previous data of sdcard on media database and check db status for updating*/
-       MS_DBG_INFO("wait db thread start");
-       while (!ms_db_get_thread_status()) {
-               usleep(10000);
-       }
-       MS_DBG_INFO("db thread ready");
-
-       /* update media DB */
        __ms_check_mediadb();
 
        /*Active flush */
@@ -280,14 +250,14 @@ int main(int argc, char **argv)
        if (!ms_config_set_int(MS_SERVER_STATUS, 1))
                MS_DBG_ERR("Fail to change sever status");
 
-       /*Set VIP Process*/
        ms_set_vip_process();
 #endif
        resource_clear_cpu_boosting(stResource);
 
        g_main_loop_run(mainloop);
 
-       g_thread_join(db_thread);
+       ms_db_update_thread_join();
+       ms_scanner_dispatcher_thread_join();
 
        ms_cynara_finish();
 #ifdef _USE_TVPD_MODE
index 3b98bda..23bd5b0 100644 (file)
@@ -52,6 +52,9 @@ static guint timeout_id;
 static guint receive_id;
 static int child_pid;
 
+static GThread *g_scanner_dispatcher_thread;
+static GMainLoop *g_scanner_dispatcher_mainloop;
+static guint g_scanner_dispatcher_source_id;
 
 static int __ms_get_remained_task(void)
 {
@@ -262,3 +265,71 @@ int ms_get_scanner_pid(void)
 {
        return child_pid;
 }
+
+static gpointer __ms_scanner_dispatcher_thread_func(gpointer data)
+{
+       int sockfd = -1;
+       GMainContext *context = NULL;
+       GSource *source = NULL;
+       GIOChannel *channel = NULL;
+
+       if (ms_ipc_create_server_socket(MS_SCANNER_PORT, &sockfd) != MS_MEDIA_ERR_NONE) {
+               MS_DBG_ERR("Failed to create socket");
+               return NULL;
+       }
+
+       if (ms_cynara_enable_credentials_passing(sockfd) != MS_MEDIA_ERR_NONE) {
+               close(sockfd);
+               MS_DBG_ERR("Failed to set up credentials passing");
+               return NULL;
+       }
+
+       context = g_main_context_new();
+       g_scanner_dispatcher_mainloop = g_main_loop_new(context, FALSE);
+       g_main_context_push_thread_default(context);
+
+       /* Create new channel to watch UDP socket */
+       channel = g_io_channel_unix_new(sockfd);
+       source = g_io_create_watch(channel, G_IO_IN);
+       g_io_channel_unref(channel);
+
+       /* Set callback to be called when socket is readable */
+       g_source_set_callback(source, (GSourceFunc)ms_read_scanner_dispatcher_socket_func, NULL, NULL);
+       g_scanner_dispatcher_source_id = g_source_attach(source, context);
+       g_source_unref(source);
+
+       MS_DBG_INFO("Media Server scanner dispatcher is running");
+       g_main_loop_run(g_scanner_dispatcher_mainloop);
+       MS_DBG_INFO("Media Server scanner dispatcher is shutting down");
+
+       close(sockfd);
+       g_main_loop_unref(g_scanner_dispatcher_mainloop);
+
+       return NULL;
+}
+
+void ms_scanner_dispatcher_thread_start(void)
+{
+       g_scanner_dispatcher_thread = g_thread_new("scanner_dispatcher_thread",
+               __ms_scanner_dispatcher_thread_func, NULL);
+
+       MS_DBG_INFO("wait scanner dispatcher thread start");
+       while (!g_main_loop_is_running(g_scanner_dispatcher_mainloop))
+               usleep(10000);
+       MS_DBG_INFO("scanner dispatcher thread ready");
+}
+
+void ms_scanner_dispatcher_thread_stop(void)
+{
+       if (!g_main_loop_is_running(g_scanner_dispatcher_mainloop))
+               return;
+
+       g_source_destroy(g_main_context_find_source_by_id(g_main_context_get_thread_default(),
+               g_scanner_dispatcher_source_id));
+       g_main_loop_quit(g_scanner_dispatcher_mainloop);
+}
+
+void ms_scanner_dispatcher_thread_join(void)
+{
+       g_thread_join(g_scanner_dispatcher_thread);
+}
index 6dabb52..9d43eb1 100644 (file)
@@ -190,7 +190,7 @@ static void __ms_recovery_media_db(uid_t uid)
 
 }
 
-gboolean ms_read_socket(GIOChannel *src, GIOCondition condition, gpointer user_data)
+gboolean ms_read_scanner_dispatcher_socket_func(GIOChannel *src, GIOCondition condition, gpointer user_data)
 {
        ms_comm_msg_s recv_msg;
        ms_comm_msg_s res_msg;
@@ -363,7 +363,7 @@ int ms_send_storage_scan_request(const char *root_path, const char *storage_id,
        return ms_send_scan_request(&scan_msg, -1);
 }
 
-gboolean ms_read_db_tcp_socket(GIOChannel *src, GIOCondition condition, gpointer data)
+gboolean ms_read_db_update_socket_func(GIOChannel *src, GIOCondition condition, gpointer data)
 {
        int sock = -1;
        int client_sock = -1;