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
#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_ */
#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*/
#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);
*/
#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);
}
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 */
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
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);
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();
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();
/*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 */
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
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)
{
{
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);
+}
}
-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;
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;