# HG changeset patch # User anatofuz # Date 1588748176 -32400 # Node ID a91592fafeb19b7303191c2762371ee2114f7337 # Parent 228d350be33ed79ff7c24421b66a8b48b6725aab ... diff -r 228d350be33e -r a91592fafeb1 paper/anatofuz-sigos.md --- 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の書き換え diff -r 228d350be33e -r a91592fafeb1 paper/anatofuz-sigos.pdf Binary file paper/anatofuz-sigos.pdf has changed diff -r 228d350be33e -r a91592fafeb1 paper/anatofuz-sigos.tex --- 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の書き換え}