Mercurial > repos > rhope
diff cbackend_c.rhope @ 141:f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 20 Nov 2010 17:48:22 -0500 |
parents | c14698c512f1 |
children | 7bbdc034e347 |
line wrap: on
line diff
--- a/cbackend_c.rhope Sat Nov 20 20:03:25 2010 +0000 +++ b/cbackend_c.rhope Sat Nov 20 17:48:22 2010 -0500 @@ -1509,14 +1509,14 @@ { out <- [[[[["typedef enum {\n" ]Append[Fold[_Dispatch Enum[?], - [Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tRES_1_Pause,\n\tFUNC_Resume,\n\tFUNC_CallSP_Async,\n"], + [Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tRES_1_Pause,\n\tFUNC_Resume,\n"], [program]Functions >>]] ]Append["\tEND,\n\tEND_THREAD\n} funcids;\n\n"] ]Append["#define DispatchEntries \\\n"] ]Append[Fold[_Dispatch Switch[?], - [Fold[_Dispatch Switch Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tDispatchEntry(Build)\\\n\tDispatchEntry(BlueprintSP_Of)\\\n\tDispatchEntry(ID)\\\n\tDispatchEntry(BlueprintSP_FromSP_ID)\\\n\tDispatchEntry(Pause)\\\n\tResumeEntry(1,Pause)\\\n\tDispatchEntry(Resume)\\\n\tDispatchEntry(CallSP_Async)\\\n"], + [Fold[_Dispatch Switch Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tDispatchEntry(Build)\\\n\tDispatchEntry(BlueprintSP_Of)\\\n\tDispatchEntry(ID)\\\n\tDispatchEntry(BlueprintSP_FromSP_ID)\\\n\tDispatchEntry(Pause)\\\n\tResumeEntry(1,Pause)\\\n\tDispatchEntry(Resume)\\\n"], [program]Functions >>]] - ]Append["\tEndEntry\n\tEndThreadEntry\n\n"] + ]Append["\tEndEntry\\\n\tEndThreadEntry\n\n"] } Not Native[func:out] @@ -1600,6 +1600,7 @@ all methods <- Fold[Field to Types[?], Fold[Method to Types[?], Dictionary[], type defs], type defs] headers <- "#include <stdio.h> #include <stdlib.h> +#include <string.h> #include \"builtin.h\" #include \"object.h\" #include \"context.h\" @@ -1640,10 +1641,7 @@ FuncDef(Build) FuncDef(BlueprintSP_Of) FuncDef(ID) - FuncDef(BlueprintSP_FromSP_ID) - FuncDef(Pause) - FuncDef(Resume) - FuncDef(CallSP_Async)\n"] + FuncDef(BlueprintSP_FromSP_ID)\n"] ]Append[Fold[Local Pointers[?], "", [program]Functions >>]] ]Append[" ct = new_context(); @@ -1716,26 +1714,19 @@ ct = new_context(); VCPrepCall(my_cdata->params[0], 1) VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct)) - ValCall(my_cdata->params[0], 1, 1, Pause) + ValCallNoLocals(my_cdata->params[0], 1, 1, Pause) release_ref(my_cdata->params[0]); DISPATCH - ValCallPostlude(1, Pause) + ValCallNoLocalsPostlude(1, Pause) for(idx = 0; idx < cdata->num_params; ++idx) - { - release_ref(cdata->params[idx]); - } + if(cdata->params[idx]) + { release_ref(cdata->params[idx]); } free_context(ct); ct = get_cqueue(); if (!ct) goto NOTHING_TO_DO; cdata = ct->resume_cdata; - ct->resume_data = NULL; - if(ct->start_func >= 0) - { - func = ct->start_func; - ct->start_func = -1; - DISPATCH - } -EndFuncNoLocals(Pause) + ct->resume_cdata = NULL; +EndFuncNoLocals DISPATCH FuncNoLocals(Resume, NumParams 2) @@ -1746,7 +1737,7 @@ if(temp_ct->resumeable && temp_ct->resume_cdata) { temp_ct->resumeable = 0; - temp_ct->resume_cdata->params[0] = add_ref(my_cdata-params[1]); + temp_ct->resume_cdata->params[0] = add_ref(my_cdata->params[1]); my_cdata->params[0] = my_cdata->params[1]; my_cdata->params[1] = NULL; if(!put_cqueue(temp_ct)) @@ -1760,34 +1751,7 @@ } else { my_cdata->params[0] = NULL; } -EndFuncNoLocals(Resume) -DISPATCH - -FuncNoLocals(CallSP_Async, NumParams 1) - Param(0, TYPE_WORKER) - - temp_ct = new_context(); - cdata = alloc_cdata(temp_ct, NULL, ((t_Worker *)my_cdata->params[0])->payload.Size); - cdata->func = END_THREAD; - for(idx = 0; idx < ((t_Worker *)my_cdata->params[0])->payload.Size; ++idx) - { - cdata->params[idx] = add_ref(((object **)(((t_Worker *)my_cdata->params[0])+1))[idx]); - } - temp_ct->start_func = ((t_Worker *)my_cdata->params[0])->payload.Index; - temp_ct->resume_cdata = cdata; - if(put_cqueue(temp_ct)) - { - cdata = my_cdata; - } else { - ct->resume_cdata = my_cdata; - temp_ct->runafter = ct; - ct = temp_ct; - ct->resume_cdata = NULL; - func = ct->start_func; - ct->start_func = -1; - DISPATCH - } -EndFuncNoLocals(CallSP_Async) +EndFuncNoLocals DISPATCH\n"] ]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Native[?]]]] ]Append[" @@ -1813,10 +1777,7 @@ if(ct = get_cqueue()) { cdata = ct->resume_cdata; - if(ct->start_func >= 0) - func = ct->start_func; - else - func = cdata->func; + func = cdata->func; DISPATCH } NOTHING_TO_DO: