Tizen 2.1 base
[sdk/emulator/qemu.git] / tizen / src / emulsignal.c
1 /*
2  * Emulator
3  *
4  * Copyright (C) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: 
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>
19  *
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.
24  *
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.
29  *
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.
33  *
34  * Contributors:
35  * - S-Core Co., Ltd
36  *
37  */
38
39 #include "emulsignal.h"
40 #include "debug_ch.h"
41 #include "sdb.h"
42 #ifndef _WIN32
43 #include <sys/ipc.h>  
44 #include <sys/shm.h> 
45 #endif
46 //DEFAULT_DEBUG_CHANNEL(tizen);
47 MULTI_DEBUG_CHANNEL(tizen, emulsignal);
48
49 static sigset_t cur_sigset, old_sigset;
50 extern void emul_kill_all_process(void);
51
52 /**
53  * @brief    destroy window
54  * @param    widget
55  * @param    gpointer
56  * @date     Nov 20. 2008   
57  */
58 static int destroy_window(void)
59 {
60     /* 1. check event injector */
61     GtkWidget *win = NULL;
62     
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");
67     }
68
69     /* 2. check event manager */
70     
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");  
75     }
76
77     /* 4. check screen shot */
78     
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");
83     }
84
85     return 0;
86 }
87
88
89 /**
90  * @brief    destroy emulator
91  * @date     Nov 20. 2008   
92  */
93 void destroy_emulator(void)
94 {
95     /* 1. terminal closed */
96
97     emul_kill_all_process();
98
99     /* 2. window destroy */
100
101     destroy_window();
102     
103     /* 3. save configuration conf, main_x, main_y */
104
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);
107
108     INFO( "Emulator Stop: set config type\n");
109     
110     /* 4. remove shared memory */
111
112 #ifndef _WIN32
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");
116     else
117         INFO( "succedd to remove shared memory\n");
118 #else
119     char *port_in_use;
120     port_in_use = g_strdup_printf("%d", tizen_base_port);
121     HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, TRUE, port_in_use);
122     if(hMapFile)
123         CloseHandle(hMapFile);
124 #endif
125
126     return;
127 }
128
129
130 /**
131  * @brief    handle signal
132  *
133  * @param    signo: singnal number
134  * @return   None
135  * @owner    okdear.park
136  */
137 void sig_handler (int signo)
138 {
139 #ifndef _WIN32
140     sigset_t sigset, oldset;
141     //int status;
142     //pid_t pid;
143     
144     TRACE("signo %d happens\n", signo);
145     switch (signo) {        
146     case SIGCHLD:
147 #if 0               
148
149         if ((pid = waitpid(-1, &status, 0)) > 0) { 
150             INFO( "child %d stop with signal %d\n", pid, signo);
151         } 
152
153         else if ((pid == -1) && (errno == EINTR)) {
154             INFO( "pid == -1 or errno EINTR \n");
155             //continue;
156         } else {
157             INFO( "pid = %d errono = %d\n",pid, errno );
158             break;
159         }
160
161 #endif
162 #if 0
163     pid_t pid;
164     int status;
165
166     sigfillset (&sigset);
167     if (sigprocmask (SIG_BLOCK, &sigset, &oldset) < 0) 
168     
169         TRACE("sigprocmask %d error \n", signo);
170
171         /* wait for any child process to change state */
172         
173         while (1) {
174
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");
179                 continue;
180             } else {
181                 INFO( "pid = %d errono = %d\n",pid, errno );
182                 break;
183             }
184         }
185
186         if (sigprocmask (SIG_SETMASK, &oldset, NULL) < 0) 
187             TRACE( "sigprocmask error \n");
188
189         INFO( "child(%d) die %d\n", pid, signo);
190
191         return;
192 #endif
193         break;
194     case SIGHUP:
195     case SIGINT:
196     case SIGQUIT:
197     case SIGTERM:
198     sigfillset (&sigset);
199
200     if (sigprocmask (SIG_BLOCK, &sigset, &oldset) < 0) {
201         ERR( "sigprocmask %d error \n", signo);
202         exit_emulator();
203     }
204
205     if (sigprocmask (SIG_SETMASK, &oldset, NULL) < 0) {
206         ERR( "sigprocmask error \n");
207     }
208
209     exit_emulator();
210     exit(0);
211     break;
212
213     default:
214         break;
215     }
216 #endif
217 }
218
219 /**
220  * @brief    block signal 
221  *
222  * @return   success  0,  fail  -1
223  * @date     Oct 18. 2008
224  * */
225
226 int sig_block() 
227 {
228 #ifndef _WIN32
229     sigfillset (&cur_sigset);
230
231     if (sigprocmask (SIG_BLOCK, &cur_sigset, &old_sigset) < 0) {
232         ERR( "sigprocmask error \n");
233     }
234 #endif
235     return 0;
236
237 }
238
239
240 /**
241  * @brief    unblock signal 
242  *
243  * @return   success  0,  fail  -1
244  * @date     Oct 18. 2008
245  * */
246 int sig_unblock() 
247 {
248 #ifndef _WIN32
249     sigfillset (&cur_sigset);
250
251     if (sigprocmask (SIG_SETMASK, &old_sigset, NULL) < 0) {
252         ERR( "sigprocmask error \n");
253     }
254 #endif
255     return 0;
256 }
257
258 /**
259  * @brief    regist signal 
260  *
261  * @return   success  0,  fail  -1
262  * @date     Oct 18. 2008
263  * */
264
265 int register_sig_handler()
266 {
267 #ifndef _WIN32
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);
273 #endif
274     TRACE( "resist sig handler\n");
275
276     return 0;
277 }
278