# HG changeset patch
# User autobackup
# Date 1611241804 -32400
# Node ID 0bd2a99a349e8e5ce57245773ad0bc9e6f41a841
# Parent 36c9c8f982f054f03fb77e5d4178171e81fab7d8
backup 2021-01-22
diff -r 36c9c8f982f0 -r 0bd2a99a349e Christie/for.NET.md
--- 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を含めた書き方は
+
+`Christie_net.AttributeCheck`
+のようにドットでつなぐ
+
+---
+フィールド変数などにつけた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
diff -r 36c9c8f982f0 -r 0bd2a99a349e user/anatofuz/note/2021/01/21.md
--- /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
+[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 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
+[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 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
+[generateDataGear] match 797 : #include
+[generateDataGear] match 797 : #include
+[generateDataGear] match 797 : #include
+[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 : }
+```