#endif
#define INVALID_DEFAULT_VALUE -1
+#define MAX_S_PATH_LEN 32
+
typedef struct {
tbm_fd tfd[MUSE_NUM_FD];
intptr_t remote_pkt;
gint fd;
bool use_tsurf_pool;
+ struct timespec fd_time;
} _media_pkt_fin_data;
/*
}
if (muse_core_ipc_fd_is_valid(fin_data->fd)) {
+ struct stat stat_results = {0, };
+ char s_path[MAX_S_PATH_LEN] = {0, };
+
+ snprintf(s_path, MAX_S_PATH_LEN, "/proc/self/fd/%d", fin_data->fd);
+
+ if (lstat(s_path, &stat_results) != 0) {
+ LOGW("[fd:%d][errno:%d] lstat error", fin_data->fd, errno);
+ /* do not exit here to avoid mem leak in muse demon */
+ } else {
+ if ((fin_data->fd_time.tv_sec != stat_results.st_mtim.tv_sec) ||
+ (fin_data->fd_time.tv_nsec != stat_results.st_mtim.tv_nsec)) {
+ LOGE("[fd:%d][%d:%ld][%d:%ld] is invalid", fin_data->fd,
+ fin_data->fd_time.tv_sec, fin_data->fd_time.tv_nsec,
+ stat_results.st_mtim.tv_sec, stat_results.st_mtim.tv_nsec);
+ goto EXIT;
+ }
+ }
+
packet = fin_data->remote_pkt;
snd_msg = muse_core_msg_json_factory_new(api, MUSE_TYPE_POINTER, "packet", packet, 0);
snd_len = muse_core_ipc_send_msg(fin_data->fd, snd_msg);
muse_core_msg_json_factory_free(snd_msg);
if (snd_len <= 0)
- LOGE("fail to send msg.");
+ LOGE("[fd:%d] fail to send msg.", fin_data->fd);
+ } else {
+ LOGE("[fd:%d] is invalid.", fin_data->fd);
}
+
EXIT:
if (fin_data) {
g_free(fin_data);
uint64_t pts = 0;
int i = 0;
muse_core_msg_parse_err_e err = MUSE_MSG_PARSE_ERROR_NONE;
+ struct stat stat_results = {0, };
+ char s_path[MAX_S_PATH_LEN] = {0, };
void *jobj = muse_core_msg_json_object_new(recv_data->buffer, NULL, &err);
if (!jobj ||
}
}
- fin_data = g_new(_media_pkt_fin_data, 1);
+ fin_data = g_new0(_media_pkt_fin_data, 1);
if (!fin_data) {
LOGE("failed to alloc fin_data");
goto ERROR;
fin_data->remote_pkt = packet;
fin_data->fd = cb_info->fd;
fin_data->use_tsurf_pool = cb_info->use_tsurf_pool;
+
+ snprintf(s_path, MAX_S_PATH_LEN, "/proc/self/fd/%d", fin_data->fd);
+ if (lstat(s_path, &stat_results) != 0)
+ LOGW("[fd:%d][errno:%d] lstat error", fin_data->fd, errno);
+ else /* Keep the Time of last modified of socket */
+ fin_data->fd_time = stat_results.st_mtim;
+
ret = media_packet_create_from_tbm_surface(cb_info->pkt_fmt, tsurf, (media_packet_finalize_cb) _player_media_packet_finalize, (void *)fin_data, &pkt);
if (ret != MEDIA_PACKET_ERROR_NONE || !pkt) {
LOGE("media_packet_create_from_tbm_surface failed %d %p", ret, pkt);
g_return_if_fail(cb_info);
if (cb_info->fd > INVALID_DEFAULT_VALUE)
- muse_core_connection_close(cb_info->fd);
+ muse_core_connection_close(cb_info->fd); /* fd close and unlink symbolic path */
if (cb_info->data_fd > INVALID_DEFAULT_VALUE)
muse_core_connection_close(cb_info->data_fd);
cb_info->fd = cb_info->data_fd = INVALID_DEFAULT_VALUE;