Add sleep to avoid busy looping on epoll_wait 20/204620/1 accepted/tizen/unified/20190426.054051 submit/tizen/20190425.063141
authorYoungHun Kim <yh8004.kim@samsung.com>
Wed, 24 Apr 2019 23:38:33 +0000 (08:38 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Thu, 25 Apr 2019 05:39:46 +0000 (14:39 +0900)
Change-Id: I80331394be0965978bca17a9fee0d5951d46118f

packaging/mused.spec
server/include/muse_server_private.h
server/src/muse_server_connection.c

index 2e3fc16..41d5dcf 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mused
 Summary:    A multimedia daemon
-Version:    0.3.74
+Version:    0.3.75
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0 and BSD-3-Clause
index c37d77d..6734f35 100644 (file)
@@ -46,12 +46,12 @@ extern "C" {
 #endif
 
 #undef LOG_TAG
-#define LOG_TAG                                                "MUSED_SERVER"
-#define MSG_KEY_PID                                    "pid"
-#define MS_TIMEOUT_MSEC                                1000
+#define LOG_TAG                                "MUSED_SERVER"
+#define MSG_KEY_PID                    "pid"
+#define MS_TIMEOUT_SEC                 1
+#define MS_TIMEOUT_MSEC                        MS_TIMEOUT_SEC * 1000
 #define MS_RECV_TRY_COUNT_MAX          3
-
-#define MSG_DONE "DONE"
+#define MSG_DONE                       "DONE"
 
 gboolean ms_ipc_job_function(ms_workqueue_job_t *job);
 gboolean ms_ipc_data_job_function(ms_workqueue_job_t *job);
index f3ea91b..1653fdf 100644 (file)
@@ -151,6 +151,7 @@ gboolean ms_connection_get_state(ms_connection_state_e *state)
 {
        int idx, fd, ep_fd, fd_count, errsv;
        struct epoll_event *p_event;
+       struct timeval tv_c, tv_s, tv_r;
        char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
        ms_connection_t *connection = NULL;
 
@@ -163,15 +164,22 @@ gboolean ms_connection_get_state(ms_connection_state_e *state)
        ep_fd = connection->epfd;
 
        do { /* We have to execute epoll_wait again in case of error of EINTR  */
+               gettimeofday(&tv_s, NULL);
                fd_count = epoll_wait(ep_fd, connection->events, MS_EVENT_MAX, MS_TIMEOUT_MSEC);
                if (fd_count < 0) {
                        errsv = errno;
                        strerror_r(errsv, err_msg, MUSE_MSG_LEN_MAX);
                        LOGE("[%d : %d] errno : %d (%s)", ep_fd, muse_core_fd_is_valid(ep_fd), errsv, err_msg);
                }
+               gettimeofday(&tv_c, NULL);
        } while (fd_count < 0 && errsv == EINTR);
 
        if (fd_count == 0) { /* There is no muse instance during timeout, which is not error case */
+               timersub(&tv_c, &tv_s, &tv_r);
+               if (tv_r.tv_sec != MS_TIMEOUT_SEC) {
+                       LOGW("sleep (10 ms) because epoll_wait does not wait for events during timeout, which would occur high cpu usage");
+                       usleep(100000);
+               }
                return FALSE;
        } else if (fd_count < 0) { /* When an error occurs, epoll_wait() returns -1 */
                strerror_r(errno, err_msg, MUSE_MSG_LEN_MAX);