changeset 40:a91592fafeb1

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 06 May 2020 15:56:16 +0900
parents 228d350be33e
children 7bba4d91db3b
files paper/anatofuz-sigos.md paper/anatofuz-sigos.pdf paper/anatofuz-sigos.tex
diffstat 3 files changed, 48 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/paper/anatofuz-sigos.md	Wed May 06 13:34:53 2020 +0900
+++ b/paper/anatofuz-sigos.md	Wed May 06 15:56:16 2020 +0900
@@ -222,6 +222,30 @@
 }
 ```
 
+Code\ref{src:allocinode_loopcheck}ではループ条件の成立を`if`文で確認し、ループ処理に移行する場合は `allocinode_loop`へ遷移する。
+ループ条件が満たされなかった場合は、 コンテキストから`panic`に関するCodeGearの集合を取り出し、 集合中の`panic` CodeGearへと遷移する。
+オリジナルの処理では、 ループ中に`dip->type == 0`が満たされた場合は関数から`return`文により関数から復帰する。
+CodeGearではCode\ref{src:alloc_loop}内で、 状態が分けられる。
+この先の継続は、 復帰用のCodeGearかループの先頭である`allocinode_loopcheck`に再帰的に遷移するかになる。
+
+``` lab:src:alloc_loop, cap:ループ中に復帰するかどうかの確認をするCodeGear
+__code allocinode_loop(struct fs_impl* fs_impl, uint inum, uint dev, short type, struct superblock* sb, struct buf* bp, struct dinode* dip, __code next(...)){
+    bp = bread(dev, IBLOCK(inum));
+    dip = (struct dinode*) bp->data + inum % IPB;
+    if(dip->type = 0){
+        goto allocinode_loopexit(fs_impl, inum, dev, sb, bp, dip, next(...));
+    }
+
+    brelse(bp);
+    inum++;
+    goto allocinode_loopcheck(fs_impl, inum, dev, type, sb, bp, dip, next(...));
+}
+```
+ 
+この継続の分析方法の利点として、 既存のコードのBasic Block単位でCodeGearに変換可能であるため機械的にCodeGearへの変更が可能となる。
+既存の関数上のアルゴリズムや処理に殆ど変更がなく変更可能であるために、 CodeGearで細分化して表現することは容易となる。
+しかし従来のxv6の関数呼び出しを元にしたAPIの中でCodeGearに分割しているために、 API内の処理の細分化は可能であるがAPIをつかった処理をCodeGearで適した形で表現できていない。
+
 
 # CbCを用いた部分的なxv6の書き換え
 
Binary file paper/anatofuz-sigos.pdf has changed
--- a/paper/anatofuz-sigos.tex	Wed May 06 13:34:53 2020 +0900
+++ b/paper/anatofuz-sigos.tex	Wed May 06 15:56:16 2020 +0900
@@ -328,6 +328,30 @@
 }
 \end{lstlisting}
 
+Code\ref{src:allocinode_loopcheck}ではループ条件の成立を\texttt{if}文で確認し、ループ処理に移行する場合は \texttt{allocinode\_loop}へ遷移する。
+ループ条件が満たされなかった場合は、 コンテキストから\texttt{panic}に関するCodeGearの集合を取り出し、 集合中の\texttt{panic} CodeGearへと遷移する。
+オリジナルの処理では、 ループ中に\texttt{dip->type == 0}が満たされた場合は関数から\texttt{return}文により関数から復帰する。
+CodeGearではCode\ref{src:alloc_loop}内で、 状態が分けられる。
+この先の継続は、 復帰用のCodeGearかループの先頭である\texttt{allocinode\_loopcheck}に再帰的に遷移するかになる。
+
+\begin{lstlisting}[frame=lrbt,label=src:alloc_loop,caption={ループ中に復帰するかどうかの確認をするCodeGear}]
+__code allocinode_loop(struct fs_impl* fs_impl, uint inum, uint dev, short type, struct superblock* sb, struct buf* bp, struct dinode* dip, __code next(...)){
+    bp = bread(dev, IBLOCK(inum));
+    dip = (struct dinode*) bp->data + inum % IPB;
+    if(dip->type = 0){
+        goto allocinode_loopexit(fs_impl, inum, dev, sb, bp, dip, next(...));
+    }
+
+    brelse(bp);
+    inum++;
+    goto allocinode_loopcheck(fs_impl, inum, dev, type, sb, bp, dip, next(...));
+}
+\end{lstlisting}
+ 
+この継続の分析方法の利点として、 既存のコードのBasic Block単位でCodeGearに変換可能であるため機械的にCodeGearへの変更が可能となる。
+既存の関数上のアルゴリズムや処理に殆ど変更がなく変更可能であるために、 CodeGearで細分化して表現することは容易となる。
+しかし従来のxv6の関数呼び出しを元にしたAPIの中でCodeGearに分割しているために、 API内の処理の細分化は可能であるがAPIをつかった処理をCodeGearで適した形で表現できていない。
+
 
 \section{CbCを用いた部分的なxv6の書き換え}