| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | #include <qse/si/thr.h>
 | 
					
						
							|  |  |  | #include <qse/si/sio.h>
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | #include <qse/si/os.h>
 | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | #include <qse/cmn/mem.h>
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | #include <qse/cmn/str.h>
 | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if defined(_WIN32)
 | 
					
						
							|  |  |  | #	include <windows.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | #include <locale.h>
 | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int g_stopreq = 0; | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | static qse_ntime_t sleep_interval = { 1, 0 }; | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct thr_xtn_t | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int stopreq; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | typedef struct thr_xtn_t thr_xtn_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 04:51:22 +00:00
										 |  |  | static int thr_func (qse_thr_t* thr, void* ctx) | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int i = 0; | 
					
						
							|  |  |  | 	thr_xtn_t* xtn = qse_thr_getxtn(thr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 	while (!xtn->stopreq) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		qse_printf (QSE_T("%d\n"), i); | 
					
						
							|  |  |  | 		i++; | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | 		qse_sleep (&sleep_interval); | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return i; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test1 (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	qse_thr_t* thr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	thr = qse_thr_open (QSE_MMGR_GETDFL(), QSE_SIZEOF(thr_xtn_t)); | 
					
						
							|  |  |  | 	if (!thr) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		qse_printf (QSE_T("cannot open thread\n")); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	qse_thr_setstacksize (thr, 64000); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-27 05:58:20 +00:00
										 |  |  | 	if (qse_thr_start(thr, thr_func, QSE_NULL, QSE_THR_SIGNALS_BLOCKED) <= -1) | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		qse_printf (QSE_T("cannot start thread\n")); | 
					
						
							|  |  |  | 		qse_thr_close (thr); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (!g_stopreq) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (qse_thr_getstate(thr) == QSE_THR_TERMINATED) break; | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | 		qse_sleep (&sleep_interval); | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (g_stopreq)  | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		/*qse_thr_stop (thr);*/ | 
					
						
							|  |  |  | 		thr_xtn_t* xtn = qse_thr_getxtn(thr); | 
					
						
							|  |  |  | 		xtn->stopreq = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	qse_thr_join (thr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	qse_printf (QSE_T("thread ended with retcode %d\n"), qse_thr_getretcode(thr)); | 
					
						
							|  |  |  | 	qse_thr_close (thr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void handle_sigint (int sig, siginfo_t* siginfo, void* ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	g_stopreq = 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void set_signal (int sig, void(*handler)(int, siginfo_t*, void*)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct sigaction sa; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | 	memset (&sa, 0, sizeof(sa)); | 
					
						
							|  |  |  | 	/*sa.sa_handler = handler;*/ | 
					
						
							|  |  |  | 	sa.sa_flags = SA_SIGINFO; | 
					
						
							|  |  |  | 	sa.sa_sigaction = handler; | 
					
						
							|  |  |  | 	sigemptyset (&sa.sa_mask); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | 	sigaction (sig, &sa, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | static void set_signal_to_default (int sig) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct sigaction sa; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | 	memset (&sa, 0, sizeof(sa)); | 
					
						
							|  |  |  | 	sa.sa_handler = SIG_DFL; | 
					
						
							|  |  |  | 	sa.sa_flags = 0; | 
					
						
							|  |  |  | 	sigemptyset (&sa.sa_mask); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | 	sigaction (sig, &sa, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | int main () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if defined(_WIN32)
 | 
					
						
							|  |  |  |  	char locale[100]; | 
					
						
							|  |  |  | 	UINT codepage = GetConsoleOutputCP(); | 
					
						
							|  |  |  | 	if (codepage == CP_UTF8) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-09-10 14:15:28 +00:00
										 |  |  | 		/*SetConsoleOutputCP (CP_UTF8);*/ | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 		qse_setdflcmgrbyid (QSE_CMGR_UTF8); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-09-04 15:07:42 +00:00
										 |  |  | 		qse_mbsxfmt (locale, QSE_COUNTOF(locale), ".%u", (unsigned int)codepage); | 
					
						
							| 
									
										
										
										
											2018-01-26 10:03:58 +00:00
										 |  |  | 		setlocale (LC_ALL, locale); | 
					
						
							|  |  |  | 		/*qse_setdflcmgrbyid (QSE_CMGR_SLMB);*/ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	setlocale (LC_ALL, ""); | 
					
						
							|  |  |  | 	/*qse_setdflcmgrbyid (QSE_CMGR_SLMB);*/ | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set_signal (SIGINT, handle_sigint); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	qse_open_stdsios (); | 
					
						
							|  |  |  | 	test1(); | 
					
						
							|  |  |  | 	qse_close_stdsios (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set_signal_to_default (SIGINT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } |