diff --git a/stdlib/future.krak b/stdlib/future.krak index 74761b1..b105553 100644 --- a/stdlib/future.krak +++ b/stdlib/future.krak @@ -1,15 +1,18 @@ +import mem:* -__if_comp__ __C__ simple_passthrough(::"-pthread") """ +__if_comp__ __C__ simple_passthrough(::"-pthread") +""" #include """ -fun pthread_create(thrd : *ulong, strt_routine : fun() : void) : int { +fun pthread_create(thrd : *ulong, strt_routine : fun(*void) : *void, input : *void) : int { __if_comp__ __C__ { - simple_passthrough(thrd,strt_routine::) """ + simple_passthrough(thrd,strt_routine,input::) """ pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - int ret = pthread_create((pthread_t*)thrd, &attr, strt_routine.func, strt_routine.data); + //int ret = pthread_create((pthread_t*)thrd, &attr, strt_routine.func, strt_routine.data); + int ret = pthread_create((pthread_t*)thrd, &attr, strt_routine.func, input); pthread_attr_destroy(&attr); return ret; """ @@ -27,7 +30,8 @@ fun pthread_join(thrd : *ulong) : int { } fun pthread_exit() : *void { - __if_comp__ __C__ { simple_passthrough """ + __if_comp__ __C__ { simple_passthrough + """ pthread_exit(NULL); """ } @@ -40,25 +44,35 @@ fun future(in : fun() : T ) : future { return out } +obj func_res { var func : *void; var result : *void; } + obj future { var result : T var status : int var psy : fun() : T - var wrapper : fun() : void + var wrapper : fun(*void) : * void; var thread : ulong fun construct(in : fun() : T) : *future { status = 0 psy = in - wrapper = fun() : void{ - result = psy() - pthread_exit() + wrapper = fun(in : *void) : *void { + var triple = (in) cast *func_res; + var func = (triple->func) cast *fun() : T; + var res : *T = (triple->result) cast *T; + (*res) = (*func)(); + pthread_exit(); + delete(in); + return null(); } return this } fun run() { - status = pthread_create(&thread,wrapper) + var in = new(); + in->result = (&result) cast *void; + in->func = (&psy) cast *void; + status = pthread_create(&thread,wrapper,(in) cast *void) } fun get_status():int { diff --git a/tests/test_future.expected_results b/tests/test_future.expected_results index 6ed1e56..caf20d4 100644 --- a/tests/test_future.expected_results +++ b/tests/test_future.expected_results @@ -1,4 +1,3 @@ Thread 0 Started! -0 -FINISHED THREAD 0 Threads have finished +All Done! diff --git a/tests/test_future.krak b/tests/test_future.krak index f437d63..c03fce9 100644 --- a/tests/test_future.krak +++ b/tests/test_future.krak @@ -22,7 +22,6 @@ fun main() : int { println("Threads have finished") - pthread_exit() println("All Done!") return 0