Mercurial > hg > Members > innparusu > slides
view 2016/2016_10_04/slide.md @ 20:3d6b9e5ae730
Update
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 25 Oct 2016 19:50:03 +0900 |
parents | |
children |
line wrap: on
line source
title: Gears OS author: Tatsuki IHA profile: lang: Japanese code-engine: coderay # 研究目的 - 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて 信頼性が高い並列処理を行う Gears OS を開発している - Gears OS では Task を Code Gear と実行するときに必要な Input Data Gear と出力するための Output Data Gear の組で表現される。 Input Data Gear/Output Data Gear によって依存関係が決定し、それにそって並列実行を行う # 今週やってたこと - red black Tree の stack_push, pop の取り除き - コーディングルールを確認 # rbTree - staskに積まれるnodeを ``traverse->nodeStack`` に格納する - nodeStack は element なので next をもつ ``` struct Traverse { enum Code next; enum Code rotateNext; struct Node* current; // reading node of original tree struct Node* newNode; // writing node of new tree struct Element* nodeStack; int result; } traverse; ``` # rbTree ``` __code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, struct Element* element) { *newNode = *oldNode; element->next = traverse->nodeStack; element->data = (union Data* )newNode; traverse->nodeStack = element; // goto replaceNode1(struct Traverse* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, +struct Node* newnewNode, int result) goto meta(context, Replace1); } __code replaceNode_stub(struct Context* context) { struct Allocate* allocate = &context->data[Allocate]->allocate; allocate->size = sizeof(struct Element); allocator(context); struct Element* element = &context->data[context->dataNum]->element; goto replaceNode(context, &context->data[Traverse]->traverse, context->data[Traverse]->traverse.current, context->data[Traverse]->traverse.newNode, element); } ``` ``` __code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, int result) { *newNode = *oldNode; stack_push(context->node_stack, &newNode); if (result == EQ) { newNode->value = context->data[Node]->node.value; // go to stack clear stack_pop(context->code_stack, &context->next); goto meta(context, context->next); } else if (result == GT) { traverse->current = oldNode->right; newNode->right = context->heap; // allocator(context,struct Node) } else { traverse->current = oldNode->left; newNode->left = context->heap; } allocator(context); if (traverse->current) { compare(context, traverse, traverse->current->key, context->data[Node]->node.key); goto meta(context, Replace); } goto meta(context, Insert); } __code replaceNode_stub(struct Context* context) { goto replaceNode(context, &context->data[Traverse]->traverse, context->data[Traverse]->traverse.current, &context->data[context->dataNum]->node, // new Node context->data[Traverse]->traverse.result); } ``` # いろいろ - 引数 - ``__code code1(struct Node* +node)`` みたいに新しく allocate するものは+ を付ける - stack と queue の api が欲しい - Stack interface & Queue interface を用意してそこに operatorの csの番号を持たせる(popとかpushに) - データ構造の生成時に interface の cs の番号を送ることで データ構造が持つ型によって実行する CS を変える - とりあえず保留にしとこう - allocate - allocate はやっぱり CS であるべきだよね - allocate で作ったものをどう参照するか - DS - enum DataType を union Data の要素につける