summaryrefslogtreecommitdiff
path: root/src/library/gc
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2010-09-10 18:46:00 +0200
committerAlexis211 <alexis211@gmail.com>2010-09-10 18:46:00 +0200
commitaba6ed4b91aff5d914be11704e34de75bfd4d003 (patch)
tree3d5cf90e9ccad09d352c6a61e90027ef552dd87f /src/library/gc
parent5fc3baaa17a6ffb34490bb8accb86f53ef3d6d15 (diff)
downloadTCE-aba6ed4b91aff5d914be11704e34de75bfd4d003.tar.gz
TCE-aba6ed4b91aff5d914be11704e34de75bfd4d003.zip
Each thread has its own stack. Added simple unit tests for kmalloc,kfree
Found a bug in heap_contract (not sure) but didn't fix it.
Diffstat (limited to 'src/library/gc')
-rw-r--r--src/library/gc/syscall.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/library/gc/syscall.c b/src/library/gc/syscall.c
index e7d77a0..b16881e 100644
--- a/src/library/gc/syscall.c
+++ b/src/library/gc/syscall.c
@@ -1,4 +1,5 @@
#include <gc/syscall.h>
+#include <gc/mem.h>
static int call(unsigned a, unsigned b, unsigned c, unsigned d, unsigned e, unsigned f) {
unsigned ret;
@@ -26,8 +27,24 @@ void printk(char* str) {
call(4, (unsigned)str, 0, 0, 0, 0);
}
+//THREAD CREATION
+struct thread_start_data {
+ void (*entry)(void*);
+ void *data;
+ void *stack;
+};
+void thread_start(void *data) {
+ struct thread_start_data *tsd = data;
+ tsd->entry(tsd->data);
+ free(tsd->stack);
+ thread_exit();
+}
void thread_new(void (*entry)(void*), void *data) {
- call(5, (unsigned)entry, (unsigned)data, 0, 0, 0);
+ struct thread_start_data *tsd = malloc(sizeof(struct thread_start_data));
+ tsd->entry = entry;
+ tsd->data = data;
+ tsd->stack = malloc(NEW_STACK_SIZE);
+ call(5, (unsigned)thread_start, (unsigned)tsd, (unsigned)(tsd->stack + NEW_STACK_SIZE), 0, 0);
}
void irq_wait(int number) {