static GMutex scan_req_mutex;
typedef struct media_callback_data {
- GSource *source;
+ //GSource *source;
scan_complete_cb user_callback;
void *user_data;
char *sock_path;
GIOChannel *src;
media_callback_data *cb_data;
int pid;
+ guint source_id;
char *req_path;
} media_scan_data;
int recv_msg_size = 0;
media_scan_data *req_data = NULL;
bool flag = false;
+ guint source_id = 0;
sockfd = g_io_channel_unix_get_fd(src);
if (sockfd < 0) {
MSAPI_DBG("pid[%d] result[%d] request_type[%d]", req_result.pid, req_result.result, req_result.request_type);
- source = ((media_callback_data *)data)->source;
+ //source = ((media_callback_data *)data)->source;
user_callback = ((media_callback_data *)data)->user_callback;
user_data = ((media_callback_data *)data)->user_data;
sock_path = ((media_callback_data *)data)->sock_path;
g_io_channel_shutdown(src, FALSE, NULL);
g_io_channel_unref(src);
- g_source_destroy(source);
+ /* DF180202-00756 source was destroyed, this pointer url may be reused by others, cause Bus error */
+ source_id = req_data->source_id;
+ g_source_destroy(g_main_context_find_source_by_id(g_main_context_default(), source_id));
+
close(sockfd);
if (sock_path != NULL) {
MSAPI_DBG("delete path :%s", sock_path);
return TRUE;
}
-static int _add_request(const char * req_path, media_callback_data *cb_data, GIOChannel *channel)
+static int _add_request(const char * req_path, media_callback_data *cb_data, GIOChannel *channel, guint source_id)
{
media_scan_data *req_data = NULL;
req_data->cb_data = cb_data;
req_data->req_path = strdup(req_path);
req_data->src = channel;
+ req_data->source_id = source_id;
g_array_append_val(req_list, req_data);
void *user_data = NULL;
GSource *source = NULL;
GIOChannel *src = NULL;
+ guint source_id = 0;
media_request_result_s req_result;
/*NEED MUTEX*/
req_result.request_type = MEDIA_FILES_REGISTER;
src = req_data->src;
+ source_id = req_data->source_id;
cb_data = req_data->cb_data;
- source = ((media_callback_data *)cb_data)->source;
+ //source = ((media_callback_data *)cb_data)->source;
sock_path = ((media_callback_data *)cb_data)->sock_path;
user_callback = ((media_callback_data *)cb_data)->user_callback;
user_data = ((media_callback_data *)cb_data)->user_data;
g_io_channel_shutdown(src, FALSE, NULL);
g_io_channel_unref(src);
- g_source_destroy(source);
+ /* DF180202-00756 source was destroyed, this pointer url may be reused by others, cause Bus error */
+ g_source_destroy(g_main_context_find_source_by_id(g_main_context_default(), source_id));
if (sock_path != NULL) {
MSAPI_DBG("delete path :%s", sock_path);
GMainContext *context = NULL;
GSource *source = NULL;
media_callback_data *cb_data;
+ guint source_id = 0;
cb_data = malloc(sizeof(media_callback_data));
MSAPI_RETVM_IF(cb_data == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY, "allocate failed");
channel = g_io_channel_unix_new(*sockfd);
source = g_io_create_watch(channel, G_IO_IN);
- cb_data->source = source;
+ //cb_data->source = source;
cb_data->user_callback = user_callback;
cb_data->user_data = user_data;
cb_data->sock_path = sock_path;
/* Set callback to be called when socket is readable */
g_source_set_callback(source, (GSourceFunc)_read_socket, cb_data, NULL);
- g_source_attach(source, context);
+ source_id = g_source_attach(source, context);
g_source_unref(source);
- return _add_request(req_path, cb_data, channel);
+ return _add_request(req_path, cb_data, channel, source_id);
}
static int __media_db_request_update_async(ms_msg_type_e msg_type, const char *storage_id, const char *request_msg, scan_complete_cb user_callback, void *user_data, uid_t uid)