4 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: YoungHun Kim <yh8004.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include "muse_server_private.h"
24 static gboolean _ms_watchdog_timer_cb(gpointer data);
25 static gpointer _ms_watchdog_thread(gpointer data);
27 static gboolean _ms_watchdog_timer_cb(gpointer data)
29 ms_watchdog_t *watchdog = (ms_watchdog_t *)data;
31 muse_return_val_if_fail(watchdog, FALSE);
33 g_mutex_lock(&watchdog->lock);
34 g_cond_signal(&watchdog->cond);
35 g_mutex_unlock(&watchdog->lock);
40 static gpointer _ms_watchdog_thread(gpointer data)
42 ms_watchdog_t *watchdog = (ms_watchdog_t *)data;
45 char err_msg[MUSE_MSG_LEN_MAX] = {'\0',};
47 muse_return_val_if_fail(watchdog, NULL);
49 LOGW("watchdog start : %p", watchdog);
51 while (watchdog->run) {
52 g_mutex_lock(&watchdog->lock);
54 end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND * MS_WATCHDOG_CHECK_PERIOD;
55 if (g_cond_wait_until(&watchdog->cond, &watchdog->lock, end_time)) {
59 LOGW("[%d / %d] timeout", try_count, MS_WATCHDOG_CHECK_COUNT);
62 if (try_count >= MS_WATCHDOG_CHECK_COUNT) {
63 snprintf(err_msg, sizeof(err_msg), "NO RESPONSE OF MAINLOOP");
65 g_mutex_unlock(&watchdog->lock);
66 ms_terminate(SIGABRT);
69 g_mutex_unlock(&watchdog->lock);
77 int ms_watchdog_init(ms_watchdog_t *watchdog)
79 muse_return_val_if_fail(watchdog, MM_ERROR_INVALID_ARGUMENT);
81 g_mutex_init(&watchdog->lock);
82 g_cond_init(&watchdog->cond);
88 int ms_watchdog_deinit(ms_watchdog_t *watchdog)
90 muse_return_val_if_fail(watchdog, MM_ERROR_INVALID_ARGUMENT);
92 g_mutex_clear(&watchdog->lock);
93 g_cond_clear(&watchdog->cond);
98 gboolean ms_watchdog_attach(ms_watchdog_t *watchdog)
100 muse_return_val_if_fail(watchdog, FALSE);
102 watchdog->thread = g_thread_try_new("muse_watchdog",
106 if (watchdog->thread) {
107 watchdog->timer_id = g_timeout_add_seconds(MS_WATCHDOG_TIMER_PERIOD,
108 _ms_watchdog_timer_cb,
116 int ms_watchdog_detach(ms_watchdog_t *watchdog)
118 gboolean rm_success = FALSE;
120 muse_return_val_if_fail(watchdog, MM_ERROR_INVALID_ARGUMENT);
122 g_mutex_lock(&watchdog->lock);
123 watchdog->run = FALSE;
124 g_cond_signal(&watchdog->cond);
125 g_mutex_unlock(&watchdog->lock);
127 LOGW("join watchdog thread - start");
129 g_thread_join(watchdog->thread);
130 watchdog->thread = NULL;
132 LOGW("join watchdog thread - done");
134 rm_success = g_source_remove(watchdog->timer_id);
136 LOGE("Failed to remove %d", watchdog->timer_id);
137 return MM_ERROR_UNKNOWN;
140 return MM_ERROR_NONE;