@@ -14,27 +14,104 @@ ae2f_SysThrdRes_t AThreadNotifier(ae2f_SysThrdPrm_t prm) {
1414 _ae2f_SysThrdSleep_imp (done , & req , & rem );
1515
1616 printf ("Thread child is ending\n" );
17- return 3 ;
17+ return ae2f_reinterpret_cast ( ae2f_SysThrdRes_t , 3 ) ;
1818}
1919
2020int main () {
2121 ae2f_eSysThrd_t ret_stat = 0 ;
2222 ae2f_SysThrd ret_thrd ;
23- ret_thrd .m_id = -1 ;
2423
2524 ae2f_SysThrdRes_t ret_rtn ;
2625
2726 ret_rtn = 0 ;
2827
2928 puts ("Thread main is starting" );
3029
30+ #if 1
3131 _ae2f_SysThrdMk_imp (
3232 ret_stat
3333 , ret_thrd
3434 , AThreadNotifier
3535 , NULL
36- , 1024 * 1024
36+ , 1024 * 1024 * 4
3737 );
38+ #else
39+ {
40+ (ret_thrd ).m_stck .m_void = mmap (
41+ ((void * )0 )
42+ , ((ret_thrd ).m_stcksz = ( (1024 * 1024 * 4 ) + sizeof (_ae2f_SysThrdRunnerPrm_t ) + sizeof (void * ) ) )
43+ , 0x1 | 0x2 , 0x02 | 0x20000 | 0x20
44+ , -1
45+ , 0
46+ );
47+ if (((void * ) -1 ) == (ret_thrd ).m_stck .m_void || !(ret_thrd ).m_stck .m_void ) {
48+ (ret_stat ) = ae2f_eSysThrdMemOut ;
49+ (ret_thrd ).m_stck .m_void = ((void * )0 );
50+ } else {
51+ (ret_thrd ).m_stck .m_prm -> m_arg = (((void * )0 ));
52+ (ret_thrd ).m_stck .m_prm -> m_fn = (AThreadNotifier );
53+ (ret_thrd ).m_stck .m_prm -> m_stcksz = (ret_thrd ).m_stcksz ;
54+ {
55+ pid_t v_child = -1 , v_parent = -1 ;
56+ int v_pidfd = -1 ;
57+ struct clone_args v_args ;
58+ v_args .stack = ((__u64 )((ret_thrd ).m_stck .m_prm ));
59+ v_args .tls = ((ptrdiff_t )((ret_thrd ).m_stck .m_prm )) & 0 ;
60+ v_args .stack_size = (1024 * 1024 * 4 );
61+ v_args .flags = CLONE_VM ;
62+ v_args .exit_signal = SIGCHLD ;
63+ v_args .child_tid = ((__u64 )(& v_child )) & 0 ;
64+ v_args .pidfd = ((__u64 )(& v_pidfd )) & 0 ;
65+ v_args .parent_tid = ((__u64 )(& v_parent )) & 0 ;
66+ switch (((ret_thrd ).m_id ) = syscall (435 , & v_args , 64 )) {
67+ case 0 :
68+ puts ("Z" );
69+ // syscall(60, 0);
70+ break ;
71+ default :
72+ sleep (1 );
73+ puts ("Hello? This is parent" );
74+ // syscall(60, 0);
75+ break ;
76+ case -1 :
77+ puts ("syscall has doomed." );
78+ printf ("%d\n" , (* __errno_location ()));
79+ printf ("%d\n" , ((ret_thrd ).m_id ));
80+ syscall (60 , 0 ); ;
81+ }
82+
83+ puts ("good" );
84+ syscall (60 , 0 );
85+
86+ ((ret_thrd ).m_id ) = clone (
87+ ((ae2f_SysThrdFn_t * )(_ae2f_SysThrdRunner ))
88+ , (((ret_thrd ).m_stck .m_char ))
89+ , (0x00000100 | 0x00000200 | 0x00000400 | 0x00000800 | 0x00010000 | 0x00040000 )
90+ , ((ret_thrd ).m_stck .m_prm )
91+ );
92+
93+ if (((ret_thrd ).m_id ) == -1 ) {
94+ (ret_stat ) = ae2f_eSysThrdErr ;
95+ } else if (((ret_thrd ).m_id ) == 0 ) {
96+ syscall (60 , 0 );
97+ } else {
98+ (ret_stat ) = ae2f_eSysThrdSuccess ;
99+ }
100+ };
101+
102+ if (ret_stat != ae2f_eSysThrdSuccess ) {
103+ munmap (
104+ (ret_thrd ).m_stck .m_void
105+ , (ret_thrd ).m_stcksz
106+ );
107+
108+ (ret_thrd ).m_stck .m_void = ((void * )0 );
109+ }
110+ }
111+ }
112+
113+ #endif
114+
38115#if ae2f_Sys__linux (!)0
39116
40117 puts ("This is an information specificly for linux." );
0 commit comments