Mercurial > repos > rhope
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 |