changeset 29:0bd2a99a349e

backup 2021-01-22
author autobackup
date Fri, 22 Jan 2021 00:10:04 +0900
parents 36c9c8f982f0
children 34152cba1865
files Christie/for.NET.md user/anatofuz/note/2021/01/21.md
diffstat 2 files changed, 552 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/Christie/for.NET.md	Thu Jan 21 00:10:03 2021 +0900
+++ b/Christie/for.NET.md	Fri Jan 22 00:10:04 2021 +0900
@@ -34,6 +34,8 @@
 java clazz.getName() → C# `type.Name`
 java socket.getInputStream().read() → C# socket.Receive([格納する配列]) (intの長さが返る) 
 java ClassNotFoundException  → C# TypeLoadException 
+java ArrayList<E> → C# List<E>
+
 
 ---
 
@@ -341,33 +343,66 @@
 	Moniter.Pulse(lock);
 }
 ```
+---
+csprojectのStartupObjectでnamespaceを含めた書き方は  
+
+`<StartupObject>Christie_net.AttributeCheck</StartupObject>`  
+のようにドットでつなぐ 
+
+---
+フィールド変数などにつけたattributeは次のように取得できる  
+
+```c#
+public class AttributeCheck {
+    [Take] private int num = 0;
+    [Peek] public string name = "riono";
+    [PeekFrom("name")] protected string nextName = "local";
+    
+    
+    private static void Main(string[] args) {
+        AttributeCheck attributeCheck = new AttributeCheck();
+
+        foreach (var field in attributeCheck.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic 
+                                                                           | BindingFlags.DeclaredOnly | BindingFlags.Instance)) {
+            foreach (var attribute in field.GetCustomAttributes(false)) {
+                Console.WriteLine(attribute);   
+            }
+        }
+    }
+	
+//  Result
+//  Christie_net.annotation.Take
+//  Christie_net.annotation.Peek
+//  Christie_net.annotation.PeekFrom
+
+```
+BindingFlagsについては下記を参照  
+https://dobon.net/vb/dotnet/programing/typegetmembers.html  
+
 
 ---
 ## TODO
 * annotation → fin
 * daemon
-    * connection → cgm要実装
+    * connection → fin
     * ChristieDaemon → fin
-    * AcceptThread → cgm要実装
-    * IncomingTcpConnection → CodeGearManager要実装
+    * AcceptThread → fin
+    * IncomingTcpConnection → fin
     * OutboundTcpConnection → fin
     * ThreadPoolExecutors 実装
+    * Config → toporogyManager作成時に必要?
+    	* log4netかNlogのどちらかを使う
 * codegear
-    * CodeGear → InputDataGear要実装
-    * InputDataGear
-        * cgm要実装
-    * CodeGearManager 
-        * cg要実装
-        * ThreadPoolExcuter要実装
-    * CodeGearExecutor
-        * cgm要実装
-        * cg要実装
+    * CodeGear → fin
+    * InputDataGear → fin
+    * CodeGearManager → fin
+    * CodeGearExecutor → fin
 * datagear
     * command
         * Command → fin
         * CommandType → fin
         * CommandBuilder → fin
-        * TakeCommand → CodeGear要実装
+        * TakeCommand → fin
         * その他のcommand → fin
     * dg → fin
     * DataGearManager → fin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/user/anatofuz/note/2021/01/21.md	Fri Jan 22 00:10:04 2021 +0900
@@ -0,0 +1,504 @@
+```shell
+$ rg '^#' examples/DPP2 | grep -v '<' | perl -nle 'print $1 if /"(\w+\.h)"/' | sort -n  | uniq
+Atomic.h
+AtomicT.h
+Fork.h
+Phils.h
+TaskManager.h
+Worker.h
+```
+
+```text
++kajika+anatofuz$ perl generate_stub.pl --debug examples/DPP2/PhilsImpl.cbc
+[getDataGear] match 175 : #interface "Phils.h"
+[getDataGear] match 137 : typedef struct Phils <> {
+[getDataGear] match 338 :   __code putdown_lfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code putdown_rfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code thinking(Impl* phils,, __code next(...));
+[getDataGear] match 338 :   __code pickup_rfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code pickup_lfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code eating(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 315 : } Phils;
+[getCodeGear] match 393 : typedef struct Phils <> {
+[getCodeGear] match 398 :   __code putdown_lfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code putdown_rfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code thinking(Impl* phils,, __code next(...));
+[getCodeGear] match 398 :   __code pickup_rfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code pickup_lfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code eating(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code next(...);
+[getDataGear] match 175 : #interface "Fork.h"
+[getDataGear] match 137 : typedef struct Fork <> {
+[getDataGear] match 315 :   union Data* fork;
+[getDataGear] match 315 :   int id;
+[getDataGear] match 315 :   struct Phils* owner;
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 315 : } Fork;
+[getCodeGear] match 393 : typedef struct Fork <> {
+[getCodeGear] match 398 :   __code next(...);
+[getDataGear] match 175 : #interface "Worker.h"
+[getDataGear] match 137 : typedef struct Worker<>{
+[getDataGear] match 315 :     union Data* worker;
+[getDataGear] match 315 :     struct Queue* tasks;
+[getDataGear] match 315 :     struct Context* task;
+[getDataGear] match 315 :     pthread_t thread;
+[getDataGear] match 315 :     struct TaskManager* taskManager;
+[getDataGear] match 338 :     __code taskReceive(Impl* worker, struct Queue* tasks);
+[getDataGear] match 338 :     __code shutdown(Impl* worker);
+[getDataGear] match 338 :     __code next(...);
+[getDataGear] match 315 : } Worker;
+[getCodeGear] match 393 : typedef struct Worker<>{
+[getCodeGear] match 398 :     __code taskReceive(Impl* worker, struct Queue* tasks);
+[getCodeGear] match 398 :     __code shutdown(Impl* worker);
+[getCodeGear] match 398 :     __code next(...);
+[getDataGear] match 175 : #interface "AtomicT_int.h"
+[getDataGear] match 137 : typedef struct AtomicT_int <>{
+[getDataGear] match 338 :     __code checkAndSet(Impl* atomic_t,int* ptr ,int init, int newData, __code next(...), __code fail(...));
+[getDataGear] match 338 :     __code set(Impl* atomic_t,int* ptr ,int newData, __code next(...));
+[getDataGear] match 338 :     __code next(...);
+[getDataGear] match 338 :     __code fail(...);
+[getDataGear] match 315 : } AtomicT_int;
+[getCodeGear] match 393 : typedef struct AtomicT_int <>{
+[getCodeGear] match 398 :     __code checkAndSet(Impl* atomic_t,int* ptr ,int init, int newData, __code next(...), __code fail(...));
+[getCodeGear] match 398 :     __code set(Impl* atomic_t,int* ptr ,int newData, __code next(...));
+[getCodeGear] match 398 :     __code next(...);
+[getCodeGear] match 398 :     __code fail(...);
+[getDataGear] match 175 : #interface "TaskManager.h"
+[getDataGear] match 137 : typedef struct TaskManager<>{
+[getDataGear] match 338 :   __code spawn(Impl* taskManager, struct Context* task, __code next(...));
+[getDataGear] match 338 :   __code spawnTasks(Impl* taskManagerImpl, struct Element* taskList, __code next1(...));
+[getDataGear] match 338 :   __code setWaitTask(Impl* taskManagerImpl, struct Context* task, __code next(...));
+[getDataGear] match 338 :   __code shutdown(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code incrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code decrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 338 :   __code next1(...);
+[getDataGear] match 315 : } TaskManager;
+[getCodeGear] match 393 : typedef struct TaskManager<>{
+[getCodeGear] match 398 :   __code spawn(Impl* taskManager, struct Context* task, __code next(...));
+[getCodeGear] match 398 :   __code spawnTasks(Impl* taskManagerImpl, struct Element* taskList, __code next1(...));
+[getCodeGear] match 398 :   __code setWaitTask(Impl* taskManagerImpl, struct Context* task, __code next(...));
+[getCodeGear] match 398 :   __code shutdown(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code incrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code decrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code next(...);
+[getCodeGear] match 398 :   __code next1(...);
+[getDataGear] match 153 : Phils* createPhilsImpl(struct Context* context, int id, AtomicT_int* right, AtomicT_int* left) {
+[getDataGear] match 206 : __code putdown_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 206 : __code putdown_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 206 : __code thinking_PhilsImpl(struct PhilsImpl* phils, struct Fork* fork, __code next(...)) {
+[getDataGear] match 206 : __code pickup_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 206 : __code pickup_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 206 : __code eating_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 668 : #include "../../../context.h"
+[generateDataGear] match 797 : #include <stdio.h>
+[generateDataGear] match 663 : #interface "Phils.h"
+[generateDataGear] match 663 : #interface "Fork.h"
+[generateDataGear] match 663 : #interface "Worker.h"
+[generateDataGear] match 663 : #interface "AtomicT_int.h"
+[generateDataGear] match 663 : #interface "TaskManager.h"
+[generateDataGear] match 797 :
+[generateDataGear] match 797 :
+[generateDataGear] match 797 : // ----
+[generateDataGear] match 797 : // typedef struct PhilsImpl <Self, Isa> impl Phils {
+[generateDataGear] match 797 : //   __code next(...);
+[generateDataGear] match 797 : //   atomic Leftfork;
+[generateDataGear] match 797 : //   atomic Rightfork;
+[generateDataGear] match 797 : //   int self;
+[generateDataGear] match 797 : // } PhilsImpl;
+[generateDataGear] match 797 : // ----
+[generateDataGear] match 797 :
+[generateDataGear] match 797 : Phils* createPhilsImpl(struct Context* context, int id, AtomicT_int* right, AtomicT_int* left) {
+[generateDataGear] match 797 :     struct Phils* phils  = new Phils();
+[generateDataGear] match 797 :     struct PhilsImpl* phils_impl = new PhilsImpl();
+[generateDataGear] match 797 :     phils->phils = (union Data*)phils_impl;
+[generateDataGear] match 797 :     phils_impl->Leftfork = left;
+[generateDataGear] match 797 :     phils_impl->Rightfork = right;
+[generateDataGear] match 797 :     phils_impl->self = 0;
+[generateDataGear] match 797 :     phils->putdown_lfork = C_putdown_lfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->putdown_rfork = C_putdown_rfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->eating = C_eating_PhilsImpl;
+[generateDataGear] match 797 :     phils->pickup_rfork = C_pickup_rfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->pickup_lfork = C_pickup_lfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->thinking = C_thinking_PhilsImpl;
+[generateDataGear] match 797 :     return phils;
+[generateDataGear] match 797 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code putdown_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1051 :     goto phils->Leftfork->set(-1, putdown_rfork_PhilsImpl);
+[generateDataGear] match 1051 :
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code putdown_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1051 :     goto phils->Rightfork->set(-1, putdown_lfork_PhilsImpl);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code thinking_PhilsImpl(struct PhilsImpl* phils, struct Fork* fork, __code next(...)) {
+[generateDataGear] match 1051 :     printf("%d: thinking\n", phils->phils->id);
+[generateDataGear] match 985 :     goto pickup_lfork(phils_impl->self);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code pickup_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1051 :     goto phils->Rightfork->checkAndSet(id, -1, pickup_lfork, pickup_rfork);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code pickup_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1051 :     goto phils->Leftfork->checkAndSet(id, -1, pickup_rfork, eating);
+[generateDataGear] match 1051 :
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code eating_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1051 :     printf("%d: eating\n", phils_impl->self->id);
+[generateDataGear] match 985 :     goto putdown_rfork();
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+```
+
+```
++kajika+anatofuz$ perl generate_stub.pl --debug examples/DPP2/PhilsImpl.cbc
+[getDataGear] match 175 : #interface "Phils.h"
+[getDataGear] match 137 : typedef struct Phils <> {
+[getDataGear] match 338 :   __code putdown_lfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code putdown_rfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code thinking(Impl* phils,, __code next(...));
+[getDataGear] match 338 :   __code pickup_rfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code pickup_lfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code eating(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 315 : } Phils;
+[getCodeGear] match 393 : typedef struct Phils <> {
+[getCodeGear] match 398 :   __code putdown_lfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code putdown_rfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code thinking(Impl* phils,, __code next(...));
+[getCodeGear] match 398 :   __code pickup_rfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code pickup_lfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code eating(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code next(...);
+[getDataGear] match 175 : #interface "Fork.h"
+[getDataGear] match 137 : typedef struct Fork <> {
+[getDataGear] match 315 :   union Data* fork;
+[getDataGear] match 315 :   int id;
+[getDataGear] match 315 :   struct Phils* owner;
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 315 : } Fork;
+[getCodeGear] match 393 : typedef struct Fork <> {
+[getCodeGear] match 398 :   __code next(...);
+[getDataGear] match 175 : #interface "Worker.h"
+[getDataGear] match 137 : typedef struct Worker<>{
+[getDataGear] match 315 :     union Data* worker;
+[getDataGear] match 315 :     struct Queue* tasks;
+[getDataGear] match 315 :     struct Context* task;
+[getDataGear] match 315 :     pthread_t thread;
+[getDataGear] match 315 :     struct TaskManager* taskManager;
+[getDataGear] match 338 :     __code taskReceive(Impl* worker, struct Queue* tasks);
+[getDataGear] match 338 :     __code shutdown(Impl* worker);
+[getDataGear] match 338 :     __code next(...);
+[getDataGear] match 315 : } Worker;
+[getCodeGear] match 393 : typedef struct Worker<>{
+[getCodeGear] match 398 :     __code taskReceive(Impl* worker, struct Queue* tasks);
+[getCodeGear] match 398 :     __code shutdown(Impl* worker);
+[getCodeGear] match 398 :     __code next(...);
+[getDataGear] match 175 : #interface "AtomicT_int.h"
+[getDataGear] match 137 : typedef struct AtomicT_int <>{
+[getDataGear] match 338 :     __code checkAndSet(Impl* atomic_t_int,int* ptr ,int init, int newData, __code next(...), __code fail(...));
+[getDataGear] match 338 :     __code set(Impl* atomic_t_int,int* ptr ,int newData, __code next(...));
+[getDataGear] match 338 :     __code next(...);
+[getDataGear] match 338 :     __code fail(...);
+[getDataGear] match 315 : } AtomicT_int;
+[getCodeGear] match 393 : typedef struct AtomicT_int <>{
+[getCodeGear] match 398 :     __code checkAndSet(Impl* atomic_t_int,int* ptr ,int init, int newData, __code next(...), __code fail(...));
+[getCodeGear] match 398 :     __code set(Impl* atomic_t_int,int* ptr ,int newData, __code next(...));
+[getCodeGear] match 398 :     __code next(...);
+[getCodeGear] match 398 :     __code fail(...);
+[getDataGear] match 175 : #interface "TaskManager.h"
+[getDataGear] match 137 : typedef struct TaskManager<>{
+[getDataGear] match 338 :   __code spawn(Impl* taskManager, struct Context* task, __code next(...));
+[getDataGear] match 338 :   __code spawnTasks(Impl* taskManagerImpl, struct Element* taskList, __code next1(...));
+[getDataGear] match 338 :   __code setWaitTask(Impl* taskManagerImpl, struct Context* task, __code next(...));
+[getDataGear] match 338 :   __code shutdown(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code incrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code decrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 338 :   __code next1(...);
+[getDataGear] match 315 : } TaskManager;
+[getCodeGear] match 393 : typedef struct TaskManager<>{
+[getCodeGear] match 398 :   __code spawn(Impl* taskManager, struct Context* task, __code next(...));
+[getCodeGear] match 398 :   __code spawnTasks(Impl* taskManagerImpl, struct Element* taskList, __code next1(...));
+[getCodeGear] match 398 :   __code setWaitTask(Impl* taskManagerImpl, struct Context* task, __code next(...));
+[getCodeGear] match 398 :   __code shutdown(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code incrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code decrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code next(...);
+[getCodeGear] match 398 :   __code next1(...);
+[getDataGear] match 153 : Phils* createPhilsImpl(struct Context* context, int id, AtomicT_int* right, AtomicT_int* left) {
+[getDataGear] match 206 : __code putdown_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 240 :     struct AtomicT_int* left_fork = phils->Leftfork;
+[getDataGear] match 250 :     goto left_fork->set(&phils->self, -1, putdown_rfork_PhilsImpl);
+[getDataGear] match 206 : __code putdown_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 240 :     struct AtomicT_int* right_fork = phils->Rightfork;
+[getDataGear] match 250 :     goto right_fork->set(&phils->self, -1, putdown_lfork_PhilsImpl);
+[getDataGear] match 206 : __code thinking_PhilsImpl(struct PhilsImpl* phils, struct Fork* fork, __code next(...)) {
+[getDataGear] match 206 : __code pickup_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 240 :     struct AtomicT_int* right_fork = phils->Rightfork;
+[getDataGear] match 250 :     goto right_fork->checkAndSet(&phils->self, -1, 0, pickup_lfork, pickup_rfork);
+[getDataGear] match 206 : __code pickup_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[getDataGear] match 240 :     struct AtomicT_int* left_fork = phils->Leftfork;
+[getDataGear] match 250 :     goto left_fork->checkAndSet(&phils->self, -1, 0, pickup_rfork, eating);
+[getDataGear] match 206 : __code eating_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 668 : #include "../../../context.h"
+[generateDataGear] match 797 : #include <stdio.h>
+[generateDataGear] match 663 : #interface "Phils.h"
+[generateDataGear] match 663 : #interface "Fork.h"
+[generateDataGear] match 663 : #interface "Worker.h"
+[generateDataGear] match 663 : #interface "AtomicT_int.h"
+[generateDataGear] match 663 : #interface "TaskManager.h"
+[generateDataGear] match 797 :
+[generateDataGear] match 797 :
+[generateDataGear] match 797 : // ----
+[generateDataGear] match 797 : // typedef struct PhilsImpl <Self, Isa> impl Phils {
+[generateDataGear] match 797 : //   __code next(...);
+[generateDataGear] match 797 : //   atomic Leftfork;
+[generateDataGear] match 797 : //   atomic Rightfork;
+[generateDataGear] match 797 : //   int self;
+[generateDataGear] match 797 : // } PhilsImpl;
+[generateDataGear] match 797 : // ----
+[generateDataGear] match 797 :
+[generateDataGear] match 797 : Phils* createPhilsImpl(struct Context* context, int id, AtomicT_int* right, AtomicT_int* left) {
+[generateDataGear] match 797 :     struct Phils* phils  = new Phils();
+[generateDataGear] match 797 :     struct PhilsImpl* phils_impl = new PhilsImpl();
+[generateDataGear] match 797 :     phils->phils = (union Data*)phils_impl;
+[generateDataGear] match 797 :     phils_impl->Leftfork = left;
+[generateDataGear] match 797 :     phils_impl->Rightfork = right;
+[generateDataGear] match 797 :     phils_impl->self = id;
+[generateDataGear] match 797 :     phils->putdown_lfork = C_putdown_lfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->putdown_rfork = C_putdown_rfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->eating = C_eating_PhilsImpl;
+[generateDataGear] match 797 :     phils->pickup_rfork = C_pickup_rfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->pickup_lfork = C_pickup_lfork_PhilsImpl;
+[generateDataGear] match 797 :     phils->thinking = C_thinking_PhilsImpl;
+[generateDataGear] match 797 :     return phils;
+[generateDataGear] match 797 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code putdown_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1039 :     struct AtomicT_int* left_fork = phils->Leftfork;
+[generateDataGear] match 802 :     goto left_fork->set(&phils->self, -1, putdown_rfork_PhilsImpl);
+[generateDataGear] match 1051 :
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code putdown_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1039 :     struct AtomicT_int* right_fork = phils->Rightfork;
+[generateDataGear] match 802 :     goto right_fork->set(&phils->self, -1, putdown_lfork_PhilsImpl);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code thinking_PhilsImpl(struct PhilsImpl* phils, struct Fork* fork, __code next(...)) {
+[generateDataGear] match 1051 :     printf("%d: thinking\n", phils->self);
+[generateDataGear] match 985 :     goto pickup_lfork(phils->self);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code pickup_rfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1039 :     struct AtomicT_int* right_fork = phils->Rightfork;
+[generateDataGear] match 802 :     goto right_fork->checkAndSet(&phils->self, -1, 0, pickup_lfork, pickup_rfork);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code pickup_lfork_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1039 :     struct AtomicT_int* left_fork = phils->Leftfork;
+[generateDataGear] match 802 :     goto left_fork->checkAndSet(&phils->self, -1, 0, pickup_rfork, eating);
+[generateDataGear] match 1051 :
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code eating_PhilsImpl(struct PhilsImpl* phils, __code next(...)) {
+[generateDataGear] match 1051 :     printf("%d: eating\n", phils->self);
+[generateDataGear] match 985 :     goto putdown_rfork();
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+```
+
+
+```
++kajika+anatofuz$ perl generate_stub.pl --debug examples/DPP2/main.cbc
+[getDataGear] match 175 : #interface "TaskManager.h"
+[getDataGear] match 137 : typedef struct TaskManager<>{
+[getDataGear] match 338 :   __code spawn(Impl* taskManager, struct Context* task, __code next(...));
+[getDataGear] match 338 :   __code spawnTasks(Impl* taskManagerImpl, struct Element* taskList, __code next1(...));
+[getDataGear] match 338 :   __code setWaitTask(Impl* taskManagerImpl, struct Context* task, __code next(...));
+[getDataGear] match 338 :   __code shutdown(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code incrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code decrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 338 :   __code next1(...);
+[getDataGear] match 315 : } TaskManager;
+[getCodeGear] match 393 : typedef struct TaskManager<>{
+[getCodeGear] match 398 :   __code spawn(Impl* taskManager, struct Context* task, __code next(...));
+[getCodeGear] match 398 :   __code spawnTasks(Impl* taskManagerImpl, struct Element* taskList, __code next1(...));
+[getCodeGear] match 398 :   __code setWaitTask(Impl* taskManagerImpl, struct Context* task, __code next(...));
+[getCodeGear] match 398 :   __code shutdown(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code incrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code decrementTaskCount(Impl* taskManagerImpl, __code next(...));
+[getCodeGear] match 398 :   __code next(...);
+[getCodeGear] match 398 :   __code next1(...);
+[getDataGear] match 175 : #interface "Phils.h"
+[getDataGear] match 137 : typedef struct Phils <> {
+[getDataGear] match 338 :   __code putdown_lfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code putdown_rfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code thinking(Impl* phils,, __code next(...));
+[getDataGear] match 338 :   __code pickup_rfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code pickup_lfork(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code eating(Impl* phils, __code next(...));
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 315 : } Phils;
+[getCodeGear] match 393 : typedef struct Phils <> {
+[getCodeGear] match 398 :   __code putdown_lfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code putdown_rfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code thinking(Impl* phils,, __code next(...));
+[getCodeGear] match 398 :   __code pickup_rfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code pickup_lfork(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code eating(Impl* phils, __code next(...));
+[getCodeGear] match 398 :   __code next(...);
+[getDataGear] match 175 : #interface "Fork.h"
+[getDataGear] match 137 : typedef struct Fork <> {
+[getDataGear] match 315 :   union Data* fork;
+[getDataGear] match 315 :   int id;
+[getDataGear] match 315 :   struct Phils* owner;
+[getDataGear] match 338 :   __code next(...);
+[getDataGear] match 315 : } Fork;
+[getCodeGear] match 393 : typedef struct Fork <> {
+[getCodeGear] match 398 :   __code next(...);
+[getDataGear] match 175 : #interface "AtomicT_int.h"
+[getDataGear] match 137 : typedef struct AtomicT_int <>{
+[getDataGear] match 338 :     __code checkAndSet(Impl* atomicT_int,int* ptr ,int init, int newData, __code next(...), __code fail(...));
+[getDataGear] match 338 :     __code set(Impl* atomicT_int,int* ptr ,int newData, __code next(...));
+[getDataGear] match 338 :     __code next(...);
+[getDataGear] match 338 :     __code fail(...);
+[getDataGear] match 315 : } AtomicT_int;
+[getCodeGear] match 393 : typedef struct AtomicT_int <>{
+[getCodeGear] match 398 :     __code checkAndSet(Impl* atomicT_int,int* ptr ,int init, int newData, __code next(...), __code fail(...));
+[getCodeGear] match 398 :     __code set(Impl* atomicT_int,int* ptr ,int newData, __code next(...));
+[getCodeGear] match 398 :     __code next(...);
+[getCodeGear] match 398 :     __code fail(...);
+[getDataGear] match 206 : __code initDataGears(struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+[getDataGear] match 206 : __code code1(struct LoopCounter* loopCounter) {
+[getDataGear] match 206 : __code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+[getDataGear] match 240 :     AtomicT_int* fork0 = createAtomicT_intImpl_int(context,-1); // model checking : fork0
+[getDataGear] match 240 :     AtomicT_int* fork1 = createAtomicT_intImpl_int(context,-1); // model checking : fork1
+[getDataGear] match 240 :     AtomicT_int* fork2 = createAtomicT_intImpl_int(context,-1); // model checking : fork2
+[getDataGear] match 240 :     AtomicT_int* fork3 = createAtomicT_intImpl_int(context,-1); // model checking : fork3
+[getDataGear] match 240 :     AtomicT_int* fork4 = createAtomicT_intImpl_int(context,-1); // model checking : fork4
+[getDataGear] match 240 :     Phils* phils0 = createPhilsImpl(context,0,fork0,fork1); // model checking : phils0
+[getDataGear] match 240 :     Phils* phils1 = createPhilsImpl(context,1,fork1,fork2); // model checking : phils1
+[getDataGear] match 240 :     Phils* phils2 = createPhilsImpl(context,2,fork2,fork3); // model checking : phils2
+[getDataGear] match 240 :     Phils* phils3 = createPhilsImpl(context,3,fork3,fork4); // model checking : phils3
+[getDataGear] match 240 :     Phils* phils4 = createPhilsImpl(context,4,fork4,fork0); // model checking : phils4
+[getDataGear] match 250 :     par goto phils0->thinking(exit_code);
+[getDataGear] match 250 :     par goto phils1->thinking(exit_code);
+[getDataGear] match 250 :     par goto phils2->thinking(exit_code);
+[getDataGear] match 250 :     par goto phils3->thinking(exit_code);
+[getDataGear] match 250 :     par goto phils4->thinking(exit_code);
+[getDataGear] match 206 : __code code2(struct TaskManager* taskManager) {
+[getDataGear] match 250 :     goto taskManager->shutdown(exit_code);
+[getDataGear] match 206 : __code code2_stub(struct Context* contextt) {
+[generateDataGear] match 797 : #include <stdio.h>
+[generateDataGear] match 797 : #include <string.h>
+[generateDataGear] match 797 : #include <stdlib.h>
+[generateDataGear] match 797 : #include <unistd.h>
+[generateDataGear] match 797 :
+[generateDataGear] match 797 :
+[generateDataGear] match 668 : #include "../../../context.h"
+[generateDataGear] match 663 : #interface "TaskManager.h"
+[generateDataGear] match 663 : #interface "Phils.h"
+[generateDataGear] match 663 : #interface "Fork.h"
+[generateDataGear] match 663 : #interface "AtomicT_int.h"
+[generateDataGear] match 797 :
+[generateDataGear] match 797 : int cpu_num = 1;
+[generateDataGear] match 797 : int length = 102400;
+[generateDataGear] match 797 : int split = 8;
+[generateDataGear] match 797 : int* array_ptr;
+[generateDataGear] match 797 : int gpu_num = 0;
+[generateDataGear] match 797 : int CPU_ANY = -1;
+[generateDataGear] match 797 : int CPU_CUDA = -1;
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code initDataGears(struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+[generateDataGear] match 1051 :     // loopCounter->tree = createRedBlackTree(context);
+[generateDataGear] match 1051 :     loopCounter->i = 0;
+[generateDataGear] match 1051 :     taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0);
+[generateDataGear] match 985 :     goto code1();
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code code1(struct LoopCounter* loopCounter) {
+[generateDataGear] match 1051 :     printf("cpus:\t\t%d\n", cpu_num);
+[generateDataGear] match 1051 :     printf("gpus:\t\t%d\n", gpu_num);
+[generateDataGear] match 1051 :     printf("length:\t\t%d\n", length);
+[generateDataGear] match 1051 :     printf("length/task:\t%d\n", length/split);
+[generateDataGear] match 1051 :     /* puts("queue"); */
+[generateDataGear] match 1051 :     /* print_queue(context->data[ActiveQueue]->queue.first); */
+[generateDataGear] match 1051 :     /* puts("tree"); */
+[generateDataGear] match 1051 :     /* print_tree(context->data[Tree]->tree.root); */
+[generateDataGear] match 1051 :     /* puts("result"); */
+[generateDataGear] match 985 :     goto createTask1();
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+[generateDataGear] match 1039 :     AtomicT_int* fork0 = createAtomicT_intImpl_int(context,-1); // model checking : fork0
+[generateDataGear] match 1039 :     AtomicT_int* fork1 = createAtomicT_intImpl_int(context,-1); // model checking : fork1
+[generateDataGear] match 1039 :     AtomicT_int* fork2 = createAtomicT_intImpl_int(context,-1); // model checking : fork2
+[generateDataGear] match 1039 :     AtomicT_int* fork3 = createAtomicT_intImpl_int(context,-1); // model checking : fork3
+[generateDataGear] match 1039 :     AtomicT_int* fork4 = createAtomicT_intImpl_int(context,-1); // model checking : fork4
+[generateDataGear] match 1051 :
+[generateDataGear] match 1039 :     Phils* phils0 = createPhilsImpl(context,0,fork0,fork1); // model checking : phils0
+[generateDataGear] match 1039 :     Phils* phils1 = createPhilsImpl(context,1,fork1,fork2); // model checking : phils1
+[generateDataGear] match 1039 :     Phils* phils2 = createPhilsImpl(context,2,fork2,fork3); // model checking : phils2
+[generateDataGear] match 1039 :     Phils* phils3 = createPhilsImpl(context,3,fork3,fork4); // model checking : phils3
+[generateDataGear] match 1039 :     Phils* phils4 = createPhilsImpl(context,4,fork4,fork0); // model checking : phils4
+[generateDataGear] match 1051 :
+[generateDataGear] match 802 :     par goto phils0->thinking(exit_code);
+[generateDataGear] match 802 :     par goto phils1->thinking(exit_code);
+[generateDataGear] match 802 :     par goto phils2->thinking(exit_code);
+[generateDataGear] match 802 :     par goto phils3->thinking(exit_code);
+[generateDataGear] match 802 :     par goto phils4->thinking(exit_code);
+[generateDataGear] match 1051 :
+[generateDataGear] match 985 :     goto code2();
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code code2(struct TaskManager* taskManager) {
+[generateDataGear] match 802 :     goto taskManager->shutdown(exit_code);
+[generateDataGear] match 1048 : }
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 687 : __code code2_stub(struct Context* contextt) {
+[generateDataGear] match 1072 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 797 : void init(int argc, char** argv) {
+[generateDataGear] match 797 :     for (int i = 1; argv[i]; ++i) {
+[generateDataGear] match 797 :         if (strcmp(argv[i], "-cpu") == 0)
+[generateDataGear] match 797 :             cpu_num = (int)atoi(argv[i+1]);
+[generateDataGear] match 797 :         else if (strcmp(argv[i], "-l") == 0)
+[generateDataGear] match 797 :             length = (int)atoi(argv[i+1]);
+[generateDataGear] match 797 :         else if (strcmp(argv[i], "-s") == 0)
+[generateDataGear] match 797 :             split = (int)atoi(argv[i+1]);
+[generateDataGear] match 797 :         else if (strcmp(argv[i], "-cuda") == 0) {
+[generateDataGear] match 797 :             gpu_num = 1;
+[generateDataGear] match 797 :             CPU_CUDA = 0;
+[generateDataGear] match 797 :         }
+[generateDataGear] match 797 :     }
+[generateDataGear] match 797 : }
+[generateDataGear] match 797 :
+[generateDataGear] match 637 : int main(int argc, char** argv) {
+[generateDataGear] match 1061 :     goto initDataGears();
+[generateDataGear] match 1072 : }
+```