4 * Copyright (C) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
7 * DoHyung Hong <don.hong@samsung.com>
8 * SeokYeon Hwang <syeon.hwang@samsung.com>
9 * Hyunjun Son <hj79.son@samsung.com>
10 * SangJin Kim <sangjin3.kim@samsung.com>
11 * MunKyu Im <munkyu.im@samsung.com>
12 * KiTae Kim <kt920.kim@samsung.com>
13 * JinHyung Jo <jinhyung.jo@samsung.com>
14 * SungMin Ha <sungmin82.ha@samsung.com>
15 * JiHye Kim <jihye1128.kim@samsung.com>
16 * GiWoong Kim <giwoong.kim@samsung.com>
17 * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
18 * DongKyun Yun <dk77.yun@samsung.com>
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License
22 * as published by the Free Software Foundation; either version 2
23 * of the License, or (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
39 #include "emulsignal.h"
46 //DEFAULT_DEBUG_CHANNEL(tizen);
47 MULTI_DEBUG_CHANNEL(tizen, emulsignal);
49 static sigset_t cur_sigset, old_sigset;
50 extern void emul_kill_all_process(void);
53 * @brief destroy window
58 static int destroy_window(void)
60 /* 1. check event injector */
61 GtkWidget *win = NULL;
63 if (UISTATE.is_ei_run == TRUE) {
64 win = get_window(EVENT_INJECTOR_ID);
65 gtk_widget_destroy(win);
66 TRACE( "event injector destroy\n");
69 /* 2. check event manager */
71 if (UISTATE.is_em_run == TRUE) {
72 win = get_window(EVENT_MANAGER_ID);
73 gtk_widget_destroy(win);
74 TRACE( "event manager destroy\n");
77 /* 4. check screen shot */
79 if(UISTATE.is_screenshot_run == TRUE) {
80 win = get_window(SCREEN_SHOT_ID);
81 gtk_widget_destroy(win);
82 TRACE( "screen shot destroy\n");
90 * @brief destroy emulator
93 void destroy_emulator(void)
95 /* 1. terminal closed */
97 emul_kill_all_process();
99 /* 2. window destroy */
103 /* 3. save configuration conf, main_x, main_y */
105 set_config_type(SYSTEMINFO.virtual_target_info_file, EMULATOR_GROUP, MAIN_X_KEY, configuration.main_x);
106 set_config_type(SYSTEMINFO.virtual_target_info_file, EMULATOR_GROUP, MAIN_Y_KEY, configuration.main_y);
108 INFO( "Emulator Stop: set config type\n");
110 /* 4. remove shared memory */
113 int shmid = shmget((key_t)tizen_base_port, 64, 0);
114 if(shmctl(shmid, IPC_RMID, 0) == -1)
115 ERR( "fail to remove shared memory\n");
117 INFO( "succedd to remove shared memory\n");
120 port_in_use = g_strdup_printf("%d", tizen_base_port);
121 HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, TRUE, port_in_use);
123 CloseHandle(hMapFile);
131 * @brief handle signal
133 * @param signo: singnal number
137 void sig_handler (int signo)
140 sigset_t sigset, oldset;
144 TRACE("signo %d happens\n", signo);
149 if ((pid = waitpid(-1, &status, 0)) > 0) {
150 INFO( "child %d stop with signal %d\n", pid, signo);
153 else if ((pid == -1) && (errno == EINTR)) {
154 INFO( "pid == -1 or errno EINTR \n");
157 INFO( "pid = %d errono = %d\n",pid, errno );
166 sigfillset (&sigset);
167 if (sigprocmask (SIG_BLOCK, &sigset, &oldset) < 0)
169 TRACE("sigprocmask %d error \n", signo);
171 /* wait for any child process to change state */
175 if ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
176 INFO( "child %d stop with signal %d\n", pid, signo);
177 } else if ((pid == -1) && (errno == EINTR)) {
178 INFO( "pid == -1 or errno EINTR \n");
181 INFO( "pid = %d errono = %d\n",pid, errno );
186 if (sigprocmask (SIG_SETMASK, &oldset, NULL) < 0)
187 TRACE( "sigprocmask error \n");
189 INFO( "child(%d) die %d\n", pid, signo);
198 sigfillset (&sigset);
200 if (sigprocmask (SIG_BLOCK, &sigset, &oldset) < 0) {
201 ERR( "sigprocmask %d error \n", signo);
205 if (sigprocmask (SIG_SETMASK, &oldset, NULL) < 0) {
206 ERR( "sigprocmask error \n");
220 * @brief block signal
222 * @return success 0, fail -1
229 sigfillset (&cur_sigset);
231 if (sigprocmask (SIG_BLOCK, &cur_sigset, &old_sigset) < 0) {
232 ERR( "sigprocmask error \n");
241 * @brief unblock signal
243 * @return success 0, fail -1
249 sigfillset (&cur_sigset);
251 if (sigprocmask (SIG_SETMASK, &old_sigset, NULL) < 0) {
252 ERR( "sigprocmask error \n");
259 * @brief regist signal
261 * @return success 0, fail -1
265 int register_sig_handler()
268 signal (SIGTERM, sig_handler);
269 signal (SIGHUP, sig_handler);
270 signal (SIGQUIT, sig_handler);
271 signal (SIGINT, sig_handler);
272 signal (SIGCHLD, sig_handler);
274 TRACE( "resist sig handler\n");