Skip to content

Commit be5fbeb

Browse files
committed
Added __ae2f_SysThrdStckTopOper for linux.
Changes to be committed: modified: inc/ae2f/Sys/Thrd.core.h modified: src/sys/Thrd.def.cc modified: test/primal/thrdjoin.c
1 parent f605522 commit be5fbeb

3 files changed

Lines changed: 94 additions & 25 deletions

File tree

‎inc/ae2f/Sys/Thrd.core.h‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020

2121
#elif ae2f_Sys__linux(!)0
2222

23+
/**
24+
* @macro __ae2f_SysThrdStckTopOper
25+
* A macro to make top pointer.
26+
* */
27+
#ifndef __ae2f_SysThrdStckTopOper
28+
#define __ae2f_SysThrdStckTopOper(prm_ptr, prm_sz) ((prm_ptr) + (prm_sz))
29+
#endif
30+
2331
#define _GNU_SOURCE
2432
#include <sys/mman.h>
2533
#include <sys/syscall.h>
@@ -56,7 +64,7 @@ ae2f_structdef(union, _ae2f_SysThrdStckPtr_t)
5664
_ae2f_SysThrdRunnerPrm_t* ae2f_restrict m_prm;
5765
};
5866

59-
static int _ae2f_SysThrdRunner(_ae2f_SysThrdRunnerPrm_t* prm_stck) {
67+
static void _ae2f_SysThrdRunner(_ae2f_SysThrdRunnerPrm_t* prm_stck) {
6068

6169
if(prm_stck) {
6270
/** child section */

‎src/sys/Thrd.def.cc‎

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct timespec;
3030

3131
#if ae2f_Sys__linux(!)0
3232

33-
#include <stdio.h>
33+
#include <errno.h>
3434

3535
ae2f_MAC() __linux_ae2f_SysThrdMk_imp_call(
3636
ae2f_eSysThrd_t ret_stat,
@@ -41,22 +41,6 @@ ae2f_MAC() __linux_ae2f_SysThrdMk_imp_call(
4141
size_t prm_stcksz
4242
)
4343
{
44-
struct clone_args v_args;
45-
v_args.stack = ae2f_reinterpret_cast(ptrdiff_t, prm_stck);
46-
v_args.stack_size = prm_stcksz;
47-
v_args.flags = (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM);
48-
v_args.exit_signal = SIGCHLD;
49-
50-
switch(syscall(__NR_clone3, &v_args, sizeof(v_args)))
51-
{
52-
case 0:
53-
puts("terminating, and child has made by SYS_clone3");
54-
syscall(SYS_exit, 0);
55-
default:
56-
puts("syscall has doomed.");
57-
;
58-
}
59-
6044
(ret_tid) = clone(
6145
ae2f_reinterpret_cast(ae2f_SysThrdFn_t*, _ae2f_SysThrdRunner)
6246
, (prm_stcktop)
@@ -117,7 +101,7 @@ ae2f_MAC() ae2f_SysThrdMk_imp(
117101
ret_stat, (ret_thrd).m_id
118102
, prm_func
119103
, (ret_thrd).m_stck.m_prm
120-
, ((ret_thrd).m_stck.m_char + (prm_stcksz))
104+
, __ae2f_SysThrdStckTopOper(((ret_thrd).m_stck.m_char), (prm_stcksz))
121105
, prm_stcksz
122106
);
123107

@@ -246,11 +230,11 @@ ae2f_MAC() ae2f_SysThrdSleep_imp(
246230
SetLastError(ERROR_INVALID_PARAMETER);
247231
(ret_stat) = -1;
248232
} else do {
249-
DWORD ms = (DWORD)(req->tv_sec * 1000 + req->tv_nsec / 1000000);
233+
DWORD ms = (DWORD)((req)->tv_sec * 1000 + (req)->tv_nsec / 1000000);
250234
Sleep(ms);
251235
if (rem != NULL) {
252-
rem->tv_sec = 0;
253-
rem->tv_nsec = 0;
236+
(rem)->tv_sec = 0;
237+
(rem)->tv_nsec = 0;
254238
}
255239
(ret_stat) = 0;
256240
} while(0);

‎test/primal/thrdjoin.c‎

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2020
int 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

Comments
 (0)