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: