Added cons.
[mozart2.git] / threads.cc
blob72b68507ebaba1a92c642d886b7fa1b9dc420d0d
1 void ThreadPool::get(VM &vm, UnstableNode &dest){
2 if(front){
3 move(dest,front->thread);
4 ThreadList* nF=front->next;
5 vm.free(front,1);
6 front=nF;
7 if(!front)back=&front;
8 }else{
9 clobber(dest);
12 void ThreadPool::schedule(VM &vm, UnstableNode &t){
13 ThreadList* l=vm.alloc<ThreadList>(1);
14 l->next=0;
15 move(l->thread,t);
16 *back=l;
17 back=&(l->next);
19 void ThreadPool::gc(GC &gc){
20 ThreadList* o=front;
21 ThreadList** n=&front;
22 while(o){
23 *n=vm.alloc<ThreadList>(1);
24 (*n)->next=0;
25 new((void*)&((*n)->thread)) UnstableNode(gc,o->thread);
26 n=&((*n)->next);
27 o=o->next;
29 back=n;
31 StackFrameHeader*& getStackTop(Node& it){
32 return ((Thread*)it.c.ptr)->topOfStack;
34 void gcIntoThread(Node& it, GC& gc, Node& dest){
35 mkThread(gc.vm, dest);
36 gc.vm.gcStack(gc, getStackTop(it), getStackTop(dest));
38 const VTable threadVT={
39 //PP_VTABLE_DEF(«vtUnimplemented»)
40 //PP_VTABLE_SET(«stackTop»,«&getStackTop»)
41 //PP_VTABLE_SET(«gcInto»,«&gcIntoThread»)
42 //PP_VTABLE_SET(«gc»,«&gcDef<&gcIntoThread>»)
43 //PP_VTABLE_PRODUCE