Removed the thread to reduce the media-scanner's memory usage.
Change-Id: I15640affc9047d746327377c78f1ab5fc7a2ad6b
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
MS_MSG_DB_UPDATE = 0, /**< Media DB Update */
MS_MSG_DIRECTORY_SCANNING, /**< Recursive Directory Scan and Media DB Update*/
MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE,/**< Non recursive Directory Scan and Media DB Update*/
- MS_MSG_BULK_INSERT, /**< Request bulk insert */
MS_MSG_STORAGE_ALL,
MS_MSG_STORAGE_PARTIAL,
MS_MSG_STORAGE_INVALID,
MS_MSG_SCANNER_READY, /**< Ready from media scanner */
MS_MSG_SCANNER_RESULT, /**< Result of directory scanning */
- MS_MSG_SCANNER_BULK_RESULT, /**< Request bulk insert */
MS_MSG_DIRECTORY_SCANNING_CANCEL, /**< Request cancel directory scan*/
MS_MSG_STORAGE_SCANNER_COMPLETE, /**< Storage Scanner complete */
MS_MSG_DIRECTORY_SCANNER_COMPLETE, /**< Directory Scanner complete */
} media_request_result_s;
typedef void (*scan_complete_cb)(media_request_result_s *, void *);
-typedef void (*insert_complete_cb)(media_request_result_s *, void *);
int media_directory_scanning_async(const char *directory_path,
const char *storage_id,
int media_directory_scanning_cancel(const char *directory_path, uid_t uid);
-int media_files_register(const char *list_path, insert_complete_cb user_callback, void *user_data, uid_t uid);
-
/**
* @}
*/
case MS_MSG_SCANNER_RESULT:
req_result.request_type = MEDIA_DIRECTORY_SCAN;
break;
- case MS_MSG_SCANNER_BULK_RESULT:
- req_result.request_type = MEDIA_FILES_REGISTER;
- break;
case MS_MSG_SCANNER_COMPLETE:
req_result.request_type = MEDIA_REQUEST_SCAN_COMPLETE;
break;
{
return __media_db_request_update_cancel(MS_MSG_DIRECTORY_SCANNING_CANCEL, directory_path);
}
-
-int media_files_register(const char *list_path, insert_complete_cb user_callback, void *user_data, uid_t uid)
-{
- return __media_db_request_update_async(MS_MSG_BULK_INSERT, NULL, list_path, user_callback, user_data, uid);
-}
Name: media-server
Summary: A server for media content management
-Version: 0.6.17
+Version: 0.6.18
Release: 0
Group: Multimedia/Service
License: Apache-2.0
#define MS_SAFE_FREE(src) { if (src) {free(src); src = NULL; } }
bool ms_is_valid_symlink(const char *path);
-int ms_verify_all_parent_dirs(const char *full_path, uid_t uid);
int ms_check_scan_ignore(char *path, uid_t uid);
int ms_set_power_mode(ms_db_status_type_t status);
void ms_trim_dir_path(char *dir_path);
#include "media-common-system.h"
#include "media-common-utils.h"
-int ms_verify_all_parent_dirs(const char *full_path, uid_t uid)
-{
- int ret = MS_MEDIA_ERR_NONE;
- char *dir_path = NULL;
- char *next = NULL;
- int next_pos = 1;
-
- while ((next = strstr(full_path + next_pos, "/"))) {
- next_pos = (next - full_path);
- dir_path = g_strndup(full_path, next_pos);
- next_pos++;
-
- ret = ms_check_scan_ignore(dir_path, uid);
- g_free(dir_path);
- if (ret != MS_MEDIA_ERR_NONE)
- break;
- }
-
- return ret;
-}
-
int ms_set_power_mode(ms_db_status_type_t status)
{
int res = MS_MEDIA_ERR_NONE;
typedef enum {
MS_SCAN_STORAGE = 0,
MS_SCAN_DIRECTORY = 1,
- MS_SCAN_REGISTER = 2,
MS_SCAN_MAX,
} ms_scan_type_e;
gpointer msc_directory_scan_thread(gpointer data);
-gpointer msc_register_thread(gpointer data);
gpointer msc_storage_scan_thread(gpointer data);
int msc_set_cancel_scan_item(const char *path, int pid);
GAsyncQueue *storage_queue2;
static GAsyncQueue *scan_queue2;
-static GAsyncQueue *reg_queue2;
static GMutex scan_req_mutex2;
static GMutex blocked_mutex2;
static GMutex storage_scan_mutex2;
return NULL;
}
-static int __msc_make_file_list(const char *file_path, char ***path_list)
-{
- char *buf = NULL;
- GError *err = NULL;
-
- if (!g_file_get_contents(file_path, &buf, NULL, &err)) {
- MS_DBG_ERR("g_file_get_contents failed [%s]", err->message);
- g_error_free(err);
- return MS_MEDIA_ERR_INTERNAL;
- }
-
- *path_list = g_strsplit(buf, "\n", -1);
- g_free(buf);
-
- return MS_MEDIA_ERR_NONE;
-}
-
-static int __msc_batch_insert(int pid, const char *request_path, uid_t uid)
-{
- int ret = MS_MEDIA_ERR_NONE;
- sqlite3 *handle = NULL;
- char storage_id[MS_UUID_SIZE] = {0,};
- int i = 0;
- char **path_list = NULL;
-
- MS_DBG_FENTER();
-
- ret = __msc_make_file_list(request_path, &path_list);
- MS_DBG_RETV_IF(ret != MS_MEDIA_ERR_NONE, ret);
-
- ret = ms_connect_db(&handle, uid);
- if (ret != MS_MEDIA_ERR_NONE) {
- g_strfreev(path_list);
- return MS_MEDIA_ERR_DB_INTERNAL;
- }
-
- ms_register_start(true, pid);
-
- for (i = 0; path_list[i][0] != '\0'; i++) {
- ret = ms_verify_all_parent_dirs(path_list[i], uid);
- if (ret != MS_MEDIA_ERR_NONE) {
- MS_DBG_SERR("Invalid path : %s", path_list[i]);
- continue;
- }
-
- memset(storage_id, 0x0, MS_UUID_SIZE);
- if (ms_get_storage_id(handle, path_list[i], storage_id, uid) != MS_MEDIA_ERR_NONE) {
- MS_DBG_ERR("There is no storage id in media db");
- continue;
- }
-
- ret = ms_insert_item_batch(handle, storage_id, path_list[i], uid);
-
- if (_msc_is_power_off()) {
- ret = MS_MEDIA_ERR_SCANNER_FORCE_STOP;
- break;
- }
- }
-
- ms_register_end(uid);
- ms_disconnect_db(handle);
-
- g_strfreev(path_list);
-
- MS_DBG_FLEAVE();
-
- return ret;
-}
-
-gpointer msc_register_thread(gpointer data)
-{
- int ret = MS_MEDIA_ERR_NONE;
- ms_comm_msg_s *register_data = NULL;
-
- while (1) {
- register_data = g_async_queue_pop(reg_queue2);
-
- if (register_data->pid == POWEROFF) {
- MS_DBG_ERR("power off");
- g_free(register_data);
- return NULL;
- }
-
- if (register_data->msg_type == MS_MSG_BULK_INSERT) {
- MS_DBG_SLOG("BULK REGISTER START [%.*s]", MAX_MSG_SIZE, register_data->msg);
- ret = __msc_batch_insert(register_data->pid, register_data->msg, register_data->uid);
- MS_DBG_WARN("BULK REGISTER END [%d]", ret);
- } else {
- MS_DBG_ERR("invalid message type [%d]", register_data->msg_type);
- ret = MS_MEDIA_ERR_INVALID_PARAMETER;
- }
-
- /*Active flush */
- malloc_trim(0);
-
- msc_send_result(ret, register_data);
- g_free(register_data);
- } /*thread while*/
-
- return NULL;
-}
-
int msc_set_cancel_scan_item(const char* cancel_path, int pid)
{
int ret = -1;
void msc_init_scanner(void)
{
if (!scan_queue2) scan_queue2 = g_async_queue_new();
- if (!reg_queue2) reg_queue2 = g_async_queue_new();
if (!storage_queue2) storage_queue2 = g_async_queue_new();
}
void msc_deinit_scanner(void)
{
if (scan_queue2) g_async_queue_unref(scan_queue2);
- if (reg_queue2) g_async_queue_unref(reg_queue2);
if (storage_queue2) g_async_queue_unref(storage_queue2);
}
case MS_SCAN_DIRECTORY:
g_async_queue_push(scan_queue2, recv_msg);
break;
- case MS_SCAN_REGISTER:
- g_async_queue_push(reg_queue2, recv_msg);
- break;
default:
MS_DBG_ERR("invalid parameter");
ret = MS_MEDIA_ERR_INVALID_PARAMETER;
msc_push_scan_request(MS_SCAN_DIRECTORY, data);
}
- if (reg_queue2) {
- data = g_new0(ms_comm_msg_s, 1);
-
- data->pid = POWEROFF;
- msc_push_scan_request(MS_SCAN_REGISTER, data);
- }
-
if (storage_queue2) {
data = g_new0(ms_comm_msg_s, 1);
MS_DBG_SLOG("receive msg from [%d][%d] M[%.*s] S[%.*s]", recv_msg->pid, recv_msg->msg_type, MAX_MSG_SIZE, recv_msg->msg, MS_UUID_SIZE, recv_msg->storage_id);
switch (recv_msg->msg_type) {
- case MS_MSG_BULK_INSERT:
- msc_push_scan_request(MS_SCAN_REGISTER, recv_msg);
- break;
case MS_MSG_DIRECTORY_SCANNING:
case MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE:
msc_push_scan_request(MS_SCAN_DIRECTORY, recv_msg);
else if (res_data->msg_type == MS_MSG_EXTRACTOR_COMPLETE)
send_msg.msg_type = MS_MSG_EXTRACTOR_COMPLETE;
else
- send_msg.msg_type = MS_MSG_SCANNER_BULK_RESULT;
+ send_msg.msg_type = MS_MSG_SCANNER_RESULT;
send_msg.pid = res_data->pid;
send_msg.result = result;
g_strlcpy(send_msg.msg, res_data->msg, sizeof(send_msg.msg));
{
GThread *storage_scan_thread = NULL;
GThread *scan_thread = NULL;
- GThread *register_thread = NULL;
GThread *storage_extract_thread = NULL;
GThread *folder_extract_thread = NULL;
GIOChannel *channel = NULL;
/*create each threads*/
storage_scan_thread = g_thread_new("storage_scan_thread", msc_storage_scan_thread, NULL);
scan_thread = g_thread_new("scanner_thread", msc_directory_scan_thread, NULL);
- register_thread = g_thread_new("register_thread", msc_register_thread, NULL);
storage_extract_thread = g_thread_new("storage_extract_thread", msc_storage_extract_thread, NULL);
folder_extract_thread = g_thread_new("folder_extract_thread", msc_folder_extract_thread, NULL);
__msc_remove_event_receiver();
g_thread_join(scan_thread);
- g_thread_join(register_thread);
g_thread_join(storage_scan_thread);
g_thread_join(storage_extract_thread);
g_thread_join(folder_extract_thread);
typedef enum {
MS_SCAN_STORAGE = 0,
MS_SCAN_DIRECTORY = 1,
- MS_SCAN_REGISTER = 2,
MS_SCAN_MAX,
} ms_scan_type_e;
gpointer msc_directory_scan_thread(gpointer data);
-gpointer msc_register_thread(gpointer data);
gpointer msc_storage_scan_thread(gpointer data);
void msc_init_scanner(void);
void msc_deinit_scanner(void);
static bool power_off;
static GAsyncQueue * storage_queue;
static GAsyncQueue *scan_queue;
-static GAsyncQueue *reg_queue;
static bool __msc_is_power_off(void)
{
return NULL;
}
-static int __msc_make_file_list(const char *file_path, char ***path_list)
-{
- char *buf = NULL;
- GError *err = NULL;
-
- if (!g_file_get_contents(file_path, &buf, NULL, &err)) {
- MS_DBG_ERR("g_file_get_contents failed [%s]", err->message);
- g_error_free(err);
- return MS_MEDIA_ERR_INTERNAL;
- }
-
- *path_list = g_strsplit(buf, "\n", -1);
- g_free(buf);
-
- return MS_MEDIA_ERR_NONE;
-}
-
-static int __msc_batch_insert(int pid, const char *request_path, uid_t uid)
-{
- int ret = MS_MEDIA_ERR_NONE;
- sqlite3 *handle = NULL;
- char storage_id[MS_UUID_SIZE] = {0,};
- int i = 0;
- char **path_list = NULL;
-
- MS_DBG_FENTER();
-
- ret = __msc_make_file_list(request_path, &path_list);
- MS_DBG_RETV_IF(ret != MS_MEDIA_ERR_NONE, ret);
-
- ret = ms_connect_db(&handle, uid);
- if (ret != MS_MEDIA_ERR_NONE) {
- g_strfreev(path_list);
- return MS_MEDIA_ERR_DB_INTERNAL;
- }
-
- ms_register_start(true, pid);
-
- for (i = 0; path_list[i][0] != '\0'; i++) {
- ret = ms_verify_all_parent_dirs(path_list[i], uid);
- if (ret != MS_MEDIA_ERR_NONE) {
- MS_DBG_SERR("Invalid path : %s", path_list[i]);
- continue;
- }
-
- memset(storage_id, 0x0, MS_UUID_SIZE);
- if (ms_get_storage_id(handle, path_list[i], storage_id, uid) != MS_MEDIA_ERR_NONE) {
- MS_DBG_ERR("There is no storage id in media db");
- continue;
- }
-
- ret = ms_insert_item_batch(handle, storage_id, path_list[i], uid);
-
- if (__msc_is_power_off()) {
- ret = MS_MEDIA_ERR_SCANNER_FORCE_STOP;
- break;
- }
- }
-
- ms_register_end(uid);
- ms_disconnect_db(handle);
-
- g_strfreev(path_list);
-
- MS_DBG_FLEAVE();
-
- return ret;
-}
-
-gpointer msc_register_thread(gpointer data)
-{
- int ret = MS_MEDIA_ERR_NONE;
- ms_comm_msg_s *register_data = NULL;
-
- while (1) {
- register_data = g_async_queue_pop(reg_queue);
-
- if (register_data->pid == POWEROFF) {
- MS_DBG_ERR("power off");
- g_free(register_data);
- return NULL;
- }
-
- if (register_data->msg_type == MS_MSG_BULK_INSERT) {
- MS_DBG_SLOG("BULK REGISTER START [%.*s]", MAX_MSG_SIZE, register_data->msg);
- ret = __msc_batch_insert(register_data->pid, register_data->msg, register_data->uid);
- MS_DBG_WARN("BULK REGISTER END [%d]", ret);
- } else {
- MS_DBG_ERR("invalid message type [%d]", register_data->msg_type);
- ret = MS_MEDIA_ERR_INVALID_PARAMETER;
- }
-
- /*Active flush */
- malloc_trim(0);
-
- msc_send_result(ret, register_data);
- g_free(register_data);
- } /*thread while*/
-
- return NULL;
-}
-
void msc_init_scanner(void)
{
if (!scan_queue) scan_queue = g_async_queue_new();
- if (!reg_queue) reg_queue = g_async_queue_new();
if (!storage_queue) storage_queue = g_async_queue_new();
}
void msc_deinit_scanner(void)
{
if (scan_queue) g_async_queue_unref(scan_queue);
- if (reg_queue) g_async_queue_unref(reg_queue);
if (storage_queue) g_async_queue_unref(storage_queue);
}
case MS_SCAN_DIRECTORY:
g_async_queue_push(scan_queue, recv_msg);
break;
- case MS_SCAN_REGISTER:
- g_async_queue_push(reg_queue, recv_msg);
- break;
default:
MS_DBG_ERR("invalid parameter");
ret = MS_MEDIA_ERR_INVALID_PARAMETER;
msc_push_scan_request(MS_SCAN_DIRECTORY, data);
}
- if (reg_queue) {
- /*notify to register thread*/
- data = g_new0(ms_comm_msg_s, 1);
-
- data->pid = POWEROFF;
- msc_push_scan_request(MS_SCAN_REGISTER, data);
- }
-
if (storage_queue) {
/*notify to register thread*/
data = g_new0(ms_comm_msg_s, 1);
MS_DBG_SLOG("receive msg from [%d][%d] M[%.*s] S[%.*s]", recv_msg->pid, recv_msg->msg_type, MAX_MSG_SIZE, recv_msg->msg, MS_UUID_SIZE, recv_msg->storage_id);
switch (recv_msg->msg_type) {
- case MS_MSG_BULK_INSERT:
- msc_push_scan_request(MS_SCAN_REGISTER, recv_msg);
- break;
case MS_MSG_DIRECTORY_SCANNING:
case MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE:
msc_push_scan_request(MS_SCAN_DIRECTORY, recv_msg);
MS_DBG_RETVM_IF(fd < 0, MS_MEDIA_ERR_INTERNAL, "fifo open failed");
memset(&send_msg, 0x0, sizeof(ms_comm_msg_s));
- send_msg.msg_type = MS_MSG_SCANNER_BULK_RESULT;
+ send_msg.msg_type = MS_MSG_SCANNER_RESULT;
send_msg.pid = res_data->pid;
send_msg.result = result;
send_msg.uid = res_data->uid;
{
GThread *storage_scan_thread = NULL;
GThread *scan_thread = NULL;
- GThread *register_thread = NULL;
GIOChannel *channel = NULL;
int err = -1;
int fd = -1;
/*create each threads*/
storage_scan_thread = g_thread_new("storage_scan_thread", msc_storage_scan_thread, NULL);
scan_thread = g_thread_new("scanner_thread", msc_directory_scan_thread, NULL);
- register_thread = g_thread_new("register_thread", msc_register_thread, NULL);
MS_DBG_INFO("SCANNER is ready");
msc_send_ready();
ms_sys_unset_poweroff_cb();
g_thread_join(scan_thread);
- g_thread_join(register_thread);
g_thread_join(storage_scan_thread);
msc_deinit_scanner();
#define MS_MAIN_TIMEOUT_SEC 300
#define BOOT_CHECK_FILE tzplatform_mkpath(TZ_SYS_TMP, "media_server_boot")
-#define SELECT_VALID_STORAGES "SELECT storage_id, storage_path FROM storage WHERE validity=1"
extern GMainLoop *mainloop;
sqlite3 *db_handle = NULL;
sqlite3_stmt *sql_stmt = NULL;
ms_block_info_s *block_info = NULL;
+ const char *q = "SELECT storage_id, storage_path FROM storage WHERE validity=1;";
ret = ms_connect_db(&db_handle, ms_sys_get_uid());
if (ret != MS_MEDIA_ERR_NONE) {
return;
}
- ret = sqlite3_prepare_v2(db_handle, SELECT_VALID_STORAGES, strlen(SELECT_VALID_STORAGES), &sql_stmt, NULL);
+ ret = sqlite3_prepare_v2(db_handle, q, strlen(q), &sql_stmt, NULL);
if (SQLITE_OK != ret) {
MS_DBG_ERR("prepare error [%s]", sqlite3_errmsg(db_handle));
ms_disconnect_db(db_handle);
/* register file request media server inserts the meta data of one file into media db */
switch (recv_msg.msg_type) {
case MS_MSG_DIRECTORY_SCANNING:
- case MS_MSG_BULK_INSERT:
case MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE:
ret = ms_send_scan_request(&recv_msg, client_sock);
if (ret != MS_MEDIA_ERR_NONE)
case MS_MSG_DIRECTORY_SCANNING_NON_RECURSIVE:
res_msg.msg_type = MS_MSG_SCANNER_RESULT;
break;
- case MS_MSG_BULK_INSERT:
- res_msg.msg_type = MS_MSG_SCANNER_BULK_RESULT;
- break;
case MS_MSG_MEDIA_DB_MALFORMED:
res_msg.msg_type = MS_MSG_MEDIA_DB_MALFORMED;
break;
switch (recv_msg.msg_type) {
case MS_MSG_SCANNER_RESULT:
- case MS_MSG_SCANNER_BULK_RESULT:
case MS_MSG_EXTRACTOR_COMPLETE:
MS_DBG_WARN("DB UPDATING IS DONE[%d]", recv_msg.msg_type);
__ms_dec_request_count();