From e0fd2e01c35afdc24c1b6e994d38ac36334f89d6 Mon Sep 17 00:00:00 2001 From: Marcus Godwin Date: Sun, 5 Jul 2015 01:27:43 -0400 Subject: [PATCH] Added futures to kraken!!! Added a templated future class that wraps the pthread library to allow multithreaded development. --- stdlib/future.krak | 79 ++++++++++++++++++++++++++++++ tests/test_future.expected_results | 4 ++ tests/test_future.krak | 29 +++++++++++ 3 files changed, 112 insertions(+) create mode 100644 stdlib/future.krak create mode 100644 tests/test_future.expected_results create mode 100644 tests/test_future.krak diff --git a/stdlib/future.krak b/stdlib/future.krak new file mode 100644 index 0000000..8e3323e --- /dev/null +++ b/stdlib/future.krak @@ -0,0 +1,79 @@ +import io:* + +__if_comp__ __C__ simple_passthrough(::"-pthread") """ +#include +""" + +def pthread_t float + +fun pthread_create(thrd : *pthread_t, strt_routine : fun() : void) : int { + __if_comp__ __C__ { + simple_passthrough(thrd,strt_routine::) """ + 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); + pthread_attr_destroy(&attr); + return ret; + """ + } + return 0 +} + +fun pthread_join(thrd : *pthread_t) : int { + __if_comp__ __C__ { simple_passthrough(thrd::) """ + pthread_t thread = *((pthread_t*)thrd); + return pthread_join(thread, NULL); + """ + } + return 0 +} + +fun pthread_exit() : *void { + __if_comp__ __C__ { simple_passthrough """ + pthread_exit(NULL); + """ + } +} + + + +fun future(in : fun() : T ) : future { + var out.construct(in) : future + return out +} + +obj future { + var result : T + var status : int + var psy : fun() : T + var wrapper : fun() : void + var thread : pthread_t + + fun construct(in : fun() : T) : *future { + status = 0 + psy = in + wrapper = fun() : void{ + result = psy() + println(status) + pthread_exit() + } + return this + } + + fun run() { + status = pthread_create(&thread,wrapper) + } + + fun get_status() { + return status + } + + fun finish() : T { + pthread_join(&thread) + print("FINISHED THREAD ") + print(result) + print("\n") + return result + } +} diff --git a/tests/test_future.expected_results b/tests/test_future.expected_results new file mode 100644 index 0000000..6ed1e56 --- /dev/null +++ b/tests/test_future.expected_results @@ -0,0 +1,4 @@ +Thread 0 Started! +0 +FINISHED THREAD 0 +Threads have finished diff --git a/tests/test_future.krak b/tests/test_future.krak new file mode 100644 index 0000000..f437d63 --- /dev/null +++ b/tests/test_future.krak @@ -0,0 +1,29 @@ +import future:* +import io:* + + +fun main() : int { + var a = 0 + var c = fun() : int { + var b = a + print("Thread ") + print(b) + println(" Started!") + var x : int = 0 + for(var i = 1; i < 100; i++;) { + x++ + } + return b + } + + var gadget1.construct(c) : future + gadget1.run() + gadget1.finish() + + println("Threads have finished") + + pthread_exit() + println("All Done!") + + return 0 +}