From 4528968008277b21486f0d78998754da2af0b05a Mon Sep 17 00:00:00 2001 From: Jiyong Date: Fri, 23 Feb 2024 15:03:13 +0900 Subject: [PATCH] Add scanner_dispatcher_thread and code cleanup Change-Id: I30fbf5fe7ed18e4c894c642610f6bfe2e0c89b94 --- packaging/media-server.spec | 2 +- src/server/include/media-server-db.h | 8 ++-- src/server/include/media-server-scanner.h | 6 +++ src/server/include/media-server-socket.h | 4 +- src/server/media-server-db.c | 75 +++++++++++++++++-------------- src/server/media-server-main.c | 42 +++-------------- src/server/media-server-scanner.c | 71 +++++++++++++++++++++++++++++ src/server/media-server-socket.c | 4 +- 8 files changed, 133 insertions(+), 79 deletions(-) diff --git a/packaging/media-server.spec b/packaging/media-server.spec index c0514d9..c07e491 100644 --- a/packaging/media-server.spec +++ b/packaging/media-server.spec @@ -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 diff --git a/src/server/include/media-server-db.h b/src/server/include/media-server-db.h index 7adcb9e..0096d60 100644 --- a/src/server/include/media-server-db.h +++ b/src/server/include/media-server-db.h @@ -20,10 +20,8 @@ #ifndef _MEDIA_SERVER_DB_H_ #define _MEDIA_SERVER_DB_H_ -#include - -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_ */ diff --git a/src/server/include/media-server-scanner.h b/src/server/include/media-server-scanner.h index 159bbe1..5aeda62 100644 --- a/src/server/include/media-server-scanner.h +++ b/src/server/include/media-server-scanner.h @@ -20,10 +20,16 @@ #ifndef _MEDIA_SERVER_SCANNER_H #define _MEDIA_SERVER_SCANNER_H +#include + 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*/ diff --git a/src/server/include/media-server-socket.h b/src/server/include/media-server-socket.h index f66834c..68ce924 100644 --- a/src/server/include/media-server-socket.h +++ b/src/server/include/media-server-socket.h @@ -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); diff --git a/src/server/media-server-db.c b/src/server/media-server-db.c index 0b4b3bc..92dd5a2 100644 --- a/src/server/media-server-db.c +++ b/src/server/media-server-db.c @@ -18,6 +18,7 @@ */ #include +#include #include "media-util.h" #include "media-common-types.h" @@ -26,34 +27,21 @@ #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 diff --git a/src/server/media-server-main.c b/src/server/media-server-main.c index 07cdc85..3a3766a 100644 --- a/src/server/media-server-main.c +++ b/src/server/media-server-main.c @@ -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 diff --git a/src/server/media-server-scanner.c b/src/server/media-server-scanner.c index 3b98bda..23bd5b0 100644 --- a/src/server/media-server-scanner.c +++ b/src/server/media-server-scanner.c @@ -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); +} diff --git a/src/server/media-server-socket.c b/src/server/media-server-socket.c index 6dabb52..9d43eb1 100644 --- a/src/server/media-server-socket.c +++ b/src/server/media-server-socket.c @@ -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; -- 2.7.4