comparison 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
comparison
equal deleted inserted replaced
140:c14698c512f1 141:f2cb85c53ced
1507 1507
1508 Dispatch@C Program[program,all methods:out] 1508 Dispatch@C Program[program,all methods:out]
1509 { 1509 {
1510 out <- [[[[["typedef enum {\n" 1510 out <- [[[[["typedef enum {\n"
1511 ]Append[Fold[_Dispatch Enum[?], 1511 ]Append[Fold[_Dispatch Enum[?],
1512 [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"], 1512 [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"],
1513 [program]Functions >>]] 1513 [program]Functions >>]]
1514 ]Append["\tEND,\n\tEND_THREAD\n} funcids;\n\n"] 1514 ]Append["\tEND,\n\tEND_THREAD\n} funcids;\n\n"]
1515 ]Append["#define DispatchEntries \\\n"] 1515 ]Append["#define DispatchEntries \\\n"]
1516 ]Append[Fold[_Dispatch Switch[?], 1516 ]Append[Fold[_Dispatch Switch[?],
1517 [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"], 1517 [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"],
1518 [program]Functions >>]] 1518 [program]Functions >>]]
1519 ]Append["\tEndEntry\n\tEndThreadEntry\n\n"] 1519 ]Append["\tEndEntry\\\n\tEndThreadEntry\n\n"]
1520 } 1520 }
1521 1521
1522 Not Native[func:out] 1522 Not Native[func:out]
1523 { 1523 {
1524 If[[[func]Convention >>] = ["rhope"]] 1524 If[[[func]Convention >>] = ["rhope"]]
1598 type defs <- [[program]Type Registry >>]Definitions >> 1598 type defs <- [[program]Type Registry >>]Definitions >>
1599 constants <- Fold[Combine Consts[?], Dictionary[], [program]Functions >>] 1599 constants <- Fold[Combine Consts[?], Dictionary[], [program]Functions >>]
1600 all methods <- Fold[Field to Types[?], Fold[Method to Types[?], Dictionary[], type defs], type defs] 1600 all methods <- Fold[Field to Types[?], Fold[Method to Types[?], Dictionary[], type defs], type defs]
1601 headers <- "#include <stdio.h> 1601 headers <- "#include <stdio.h>
1602 #include <stdlib.h> 1602 #include <stdlib.h>
1603 #include <string.h>
1603 #include \"builtin.h\" 1604 #include \"builtin.h\"
1604 #include \"object.h\" 1605 #include \"object.h\"
1605 #include \"context.h\" 1606 #include \"context.h\"
1606 #include \"func.h\" 1607 #include \"func.h\"
1607 #include \"integer.h\" 1608 #include \"integer.h\"
1638 calldata * cdata, *temp_cdata, *my_cdata; 1639 calldata * cdata, *temp_cdata, *my_cdata;
1639 DispatchVar 1640 DispatchVar
1640 FuncDef(Build) 1641 FuncDef(Build)
1641 FuncDef(BlueprintSP_Of) 1642 FuncDef(BlueprintSP_Of)
1642 FuncDef(ID) 1643 FuncDef(ID)
1643 FuncDef(BlueprintSP_FromSP_ID) 1644 FuncDef(BlueprintSP_FromSP_ID)\n"]
1644 FuncDef(Pause)
1645 FuncDef(Resume)
1646 FuncDef(CallSP_Async)\n"]
1647 ]Append[Fold[Local Pointers[?], "", [program]Functions >>]] 1645 ]Append[Fold[Local Pointers[?], "", [program]Functions >>]]
1648 ]Append[" 1646 ]Append["
1649 ct = new_context(); 1647 ct = new_context();
1650 cdata = alloc_cdata(ct, NULL, callspace); 1648 cdata = alloc_cdata(ct, NULL, callspace);
1651 cdata->num_params = numparams; 1649 cdata->num_params = numparams;
1714 ct->resumeable = 1; 1712 ct->resumeable = 1;
1715 temp_ct = ct; 1713 temp_ct = ct;
1716 ct = new_context(); 1714 ct = new_context();
1717 VCPrepCall(my_cdata->params[0], 1) 1715 VCPrepCall(my_cdata->params[0], 1)
1718 VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct)) 1716 VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct))
1719 ValCall(my_cdata->params[0], 1, 1, Pause) 1717 ValCallNoLocals(my_cdata->params[0], 1, 1, Pause)
1720 release_ref(my_cdata->params[0]); 1718 release_ref(my_cdata->params[0]);
1721 DISPATCH 1719 DISPATCH
1722 ValCallPostlude(1, Pause) 1720 ValCallNoLocalsPostlude(1, Pause)
1723 for(idx = 0; idx < cdata->num_params; ++idx) 1721 for(idx = 0; idx < cdata->num_params; ++idx)
1724 { 1722 if(cdata->params[idx])
1725 release_ref(cdata->params[idx]); 1723 { release_ref(cdata->params[idx]); }
1726 }
1727 free_context(ct); 1724 free_context(ct);
1728 ct = get_cqueue(); 1725 ct = get_cqueue();
1729 if (!ct) goto NOTHING_TO_DO; 1726 if (!ct) goto NOTHING_TO_DO;
1730 cdata = ct->resume_cdata; 1727 cdata = ct->resume_cdata;
1731 ct->resume_data = NULL; 1728 ct->resume_cdata = NULL;
1732 if(ct->start_func >= 0) 1729 EndFuncNoLocals
1733 {
1734 func = ct->start_func;
1735 ct->start_func = -1;
1736 DISPATCH
1737 }
1738 EndFuncNoLocals(Pause)
1739 DISPATCH 1730 DISPATCH
1740 1731
1741 FuncNoLocals(Resume, NumParams 2) 1732 FuncNoLocals(Resume, NumParams 2)
1742 Param(0, TYPE_CONTEXT) 1733 Param(0, TYPE_CONTEXT)
1743 1734
1744 temp_ct = ((t_Context *)my_cdata->params[0])->ct; 1735 temp_ct = ((t_Context *)my_cdata->params[0])->ct;
1745 release_ref(my_cdata->params[0]); 1736 release_ref(my_cdata->params[0]);
1746 if(temp_ct->resumeable && temp_ct->resume_cdata) 1737 if(temp_ct->resumeable && temp_ct->resume_cdata)
1747 { 1738 {
1748 temp_ct->resumeable = 0; 1739 temp_ct->resumeable = 0;
1749 temp_ct->resume_cdata->params[0] = add_ref(my_cdata-params[1]); 1740 temp_ct->resume_cdata->params[0] = add_ref(my_cdata->params[1]);
1750 my_cdata->params[0] = my_cdata->params[1]; 1741 my_cdata->params[0] = my_cdata->params[1];
1751 my_cdata->params[1] = NULL; 1742 my_cdata->params[1] = NULL;
1752 if(!put_cqueue(temp_ct)) 1743 if(!put_cqueue(temp_ct))
1753 { 1744 {
1754 ct->resume_cdata = my_cdata; 1745 ct->resume_cdata = my_cdata;
1758 ct->resume_cdata = NULL; 1749 ct->resume_cdata = NULL;
1759 } 1750 }
1760 } else { 1751 } else {
1761 my_cdata->params[0] = NULL; 1752 my_cdata->params[0] = NULL;
1762 } 1753 }
1763 EndFuncNoLocals(Resume) 1754 EndFuncNoLocals
1764 DISPATCH
1765
1766 FuncNoLocals(CallSP_Async, NumParams 1)
1767 Param(0, TYPE_WORKER)
1768
1769 temp_ct = new_context();
1770 cdata = alloc_cdata(temp_ct, NULL, ((t_Worker *)my_cdata->params[0])->payload.Size);
1771 cdata->func = END_THREAD;
1772 for(idx = 0; idx < ((t_Worker *)my_cdata->params[0])->payload.Size; ++idx)
1773 {
1774 cdata->params[idx] = add_ref(((object **)(((t_Worker *)my_cdata->params[0])+1))[idx]);
1775 }
1776 temp_ct->start_func = ((t_Worker *)my_cdata->params[0])->payload.Index;
1777 temp_ct->resume_cdata = cdata;
1778 if(put_cqueue(temp_ct))
1779 {
1780 cdata = my_cdata;
1781 } else {
1782 ct->resume_cdata = my_cdata;
1783 temp_ct->runafter = ct;
1784 ct = temp_ct;
1785 ct->resume_cdata = NULL;
1786 func = ct->start_func;
1787 ct->start_func = -1;
1788 DISPATCH
1789 }
1790 EndFuncNoLocals(CallSP_Async)
1791 DISPATCH\n"] 1755 DISPATCH\n"]
1792 ]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Native[?]]]] 1756 ]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Native[?]]]]
1793 ]Append[" 1757 ]Append["
1794 DO_END: 1758 DO_END:
1795 for(idx = 0; idx < cdata->num_params; ++idx) 1759 for(idx = 0; idx < cdata->num_params; ++idx)
1811 } 1775 }
1812 free_context(ct); 1776 free_context(ct);
1813 if(ct = get_cqueue()) 1777 if(ct = get_cqueue())
1814 { 1778 {
1815 cdata = ct->resume_cdata; 1779 cdata = ct->resume_cdata;
1816 if(ct->start_func >= 0) 1780 func = cdata->func;
1817 func = ct->start_func;
1818 else
1819 func = cdata->func;
1820 DISPATCH 1781 DISPATCH
1821 } 1782 }
1822 NOTHING_TO_DO: 1783 NOTHING_TO_DO:
1823 return 0; 1784 return 0;
1824 1785