Mercurial > repos > rhope
diff cbackend_c.rhope @ 140:c14698c512f1
Untested addition of Pause/Resume
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 20 Nov 2010 20:03:25 +0000 |
parents | a68e6828d896 |
children | f2cb85c53ced |
line wrap: on
line diff
--- a/cbackend_c.rhope Fri Nov 19 04:04:14 2010 -0500 +++ b/cbackend_c.rhope Sat Nov 20 20:03:25 2010 +0000 @@ -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"], + [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"], [program]Functions >>]] - ]Append["\tEND\n} funcids;\n\n"] + ]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"], + [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"], [program]Functions >>]] - ]Append["\tEndEntry\n\n"] + ]Append["\tEndEntry\n\tEndThreadEntry\n\n"] } Not Native[func:out] @@ -1633,14 +1633,17 @@ struct timeval time; #endif uint16_t resume,idx, vcparam_offset, last_vcparam; - context * ct; + context *ct,*temp_ct; void *tmp; calldata * cdata, *temp_cdata, *my_cdata; DispatchVar FuncDef(Build) FuncDef(BlueprintSP_Of) FuncDef(ID) - FuncDef(BlueprintSP_FromSP_ID)\n"] + FuncDef(BlueprintSP_FromSP_ID) + FuncDef(Pause) + FuncDef(Resume) + FuncDef(CallSP_Async)\n"] ]Append[Fold[Local Pointers[?], "", [program]Functions >>]] ]Append[" ct = new_context(); @@ -1702,6 +1705,89 @@ } EndFunc(BlueprintSP_FromSP_ID) +DISPATCH + +FuncNoLocals(Pause, NumParams 1) + Param(0, TYPE_WORKER) + + ct->resume_cdata = my_cdata; + ct->resumeable = 1; + temp_ct = ct; + 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) + release_ref(my_cdata->params[0]); + DISPATCH + ValCallPostlude(1, Pause) + for(idx = 0; idx < cdata->num_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) +DISPATCH + +FuncNoLocals(Resume, NumParams 2) + Param(0, TYPE_CONTEXT) + + temp_ct = ((t_Context *)my_cdata->params[0])->ct; + release_ref(my_cdata->params[0]); + if(temp_ct->resumeable && temp_ct->resume_cdata) + { + temp_ct->resumeable = 0; + 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)) + { + ct->resume_cdata = my_cdata; + temp_ct->runafter = ct; + ct = temp_ct; + cdata = ct->resume_cdata; + ct->resume_cdata = NULL; + } + } 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) DISPATCH\n"] ]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Native[?]]]] ]Append[" @@ -1711,9 +1797,34 @@ free_context(ct); return cdata->num_params; +DO_END_THREAD: + for(idx = 0; idx < cdata->num_params; ++idx) + { release_ref(cdata->params[idx]); } + if(ct->runafter) + { + temp_ct = ct; + ct = ct->runafter; + free_context(temp_ct); + cdata = ct->resume_cdata; + func = cdata->func; + DISPATCH + } + free_context(ct); + if(ct = get_cqueue()) + { + cdata = ct->resume_cdata; + if(ct->start_func >= 0) + func = ct->start_func; + else + func = cdata->func; + DISPATCH + } +NOTHING_TO_DO: + return 0; + _exception: puts(\"Exception! Trace follows:\"); - while(cdata && cdata->func != END) + while(cdata && cdata->func < END) { printf(\"%d\\n\", cdata->func); cdata = cdata->lastframe;