Ignore:
Timestamp:
Jul 23, 2017, 2:29:40 PM (7 years ago)
Author:
coas-nagasima
Message:

SVNプロパティを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rubycfg_asp/trunk/asp_dcre/kernel/time_event.c

    • Property svn:mime-type changed from text/x-csrc to text/x-csrc; charset=UTF-8
    r313 r315  
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
    11  *  上記著作権è€
    12 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    13  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
    14  *  変・再é
    15 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    16  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    17  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
    18  *      スコード中に含まれていること.
    19  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    20  *      用できる形で再é
    21 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    22 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    23  *      è€
    24 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    25  *      の無保証規定を掲載すること.
    26  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    27  *      用できない形で再é
    28 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    29  *      と.
    30  *    (a) 再é
    31 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    32 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    33  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
    34  *    (b) 再é
    35 å¸ƒã®å½¢æ
    36 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    37  *        報告すること.
    38  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    39  *      害からも,上記著作権è€
    40 ãŠã‚ˆã³TOPPERSプロジェクトをå
    41 è²¬ã™ã‚‹ã“と.
    42  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
    43  *      由に基づく請求からも,上記著作権è€
    44 ãŠã‚ˆã³TOPPERSプロジェクトを
    45  *      å
    46 è²¬ã™ã‚‹ã“と.
     11 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     12 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     13 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     14 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     15 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     16 *      スコード中に含まれていること.
     17 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     18 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     19 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     20 *      の無保証規定を掲載すること.
     21 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     22 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     23 *      と.
     24 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     25 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     26 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     27 *        報告すること.
     28 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     29 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     30 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     31 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     32 *      免責すること.
    4733 *
    48  *  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
    49 ãŠ
    50  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    51  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
    52  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    53  *  の責任を負わない.
     34 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     35 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     36 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     37 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     38 *  の責任を負わない.
    5439 *
    5540 *  $Id$
     
    5742
    5843/*
    59  *              タイムイベント管理モジュール
     44 *              タイムイベント管理モジュール
    6045 */
    6146
     
    6449
    6550/*
    66  *  タイムイベントヒープ操作マクロ
    67  */
    68 #define PARENT(index)           ((index) >> 1)          /* 親ノードを求める */
    69 #define LCHILD(index)           ((index) << 1)          /* 左の子ノードを求める */
     51 *  タイムイベントヒープ操作マクロ
     52 */
     53#define PARENT(index)           ((index) >> 1)          /* 親ノードを求める */
     54#define LCHILD(index)           ((index) << 1)          /* 左の子ノードを求める */
    7055#define TMEVT_NODE(index)       (tmevt_heap[(index) - 1])
    7156
    7257/*
    73  *  イベント発生時刻比較マクロ
    74  *
    75  *  イベント発生時刻は,min_timeからの相対値で比較する.すなわち,
    76  *  min_timeを最小値(最も近い時刻),mit_time-1が最大値(最も遠い時刻)
    77  *  とみなして比較する.
     58 *  イベント発生時刻比較マクロ
     59 *
     60 *  イベント発生時刻は,min_timeからの相対値で比較する.すなわち,
     61 *  min_timeを最小値(最も近い時刻),mit_time-1が最大値(最も遠い時刻)
     62 *  とみなして比較する.
    7863 */
    7964#define EVTTIM_LT(t1, t2) (((t1) - min_time) < ((t2) - min_time))
     
    8368
    8469/*
    85  *  現在のシステム時刻(単位: 1ミリ秒)
    86  *
    87  *  厳密には,前のタイムティックのシステム時刻.
     70 *  現在のシステム時刻(単位: 1ミリ秒)
     71 *
     72 *  厳密には,前のタイムティックのシステム時刻.
    8873 */
    8974EVTTIM  current_time;
    9075
    9176/*
    92  *  タイムイベントヒープ中で有効な最小のシステム時刻(単位: 1ミリ秒)
     77 *  タイムイベントヒープ中で有効な最小のシステム時刻(単位: 1ミリ秒)
    9378 */
    9479EVTTIM  min_time;
    9580
    9681/*
    97  *  次のタイムティックのシステム時刻(単位: 1ミリ秒)
     82 *  次のタイムティックのシステム時刻(単位: 1ミリ秒)
    9883 */
    9984EVTTIM  next_time;
    10085
    10186/*
    102  *  システム時刻積算用変数(単位: 1/TIC_DENOミリ秒)
     87 *  システム時刻積算用変数(単位: 1/TIC_DENOミリ秒)
    10388 */
    10489#if TIC_DENO != 1U
     
    10792
    10893/*
    109  *  タイムイベントヒープの最後の使用領域のインデックス
     94 *  タイムイベントヒープの最後の使用領域のインデックス
    11095 */
    11196uint_t  last_index;
    11297
    11398/*
    114  *  タイマモジュールの初期化
     99 *  タイマモジュールの初期化
    115100 */
    116101void
     
    129114
    130115/*
    131  *  タイムイベントの挿å
    132 ¥ä½ç½®ã‚’上向きに探索
    133  *
    134  *  時刻timeに発生するタイムイベントを挿å
    135 ¥ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’空けるために,
    136  *  ヒープの上に向かって空ノードを移動させる.移動前の空ノードの位置を
    137  *  indexに渡すと,移動後の空ノードの位置(すなわち挿å
    138 ¥ä½ç½®ï¼‰ã‚’返す.
     116 *  タイムイベントの挿入位置を上向きに探索
     117 *
     118 *  時刻timeに発生するタイムイベントを挿入するノードを空けるために,
     119 *  ヒープの上に向かって空ノードを移動させる.移動前の空ノードの位置を
     120 *  indexに渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す.
    139121 */
    140122#ifdef TOPPERS_tmeup
     
    147129        while (index > 1) {
    148130                /*
    149                  *  親ノードのイベント発生時刻の方が早い(または同じ)ならば,
    150                  *  indexが挿å
    151 ¥ä½ç½®ãªã®ã§ãƒ«ãƒ¼ãƒ—を抜ける.
     131                 *  親ノードのイベント発生時刻の方が早い(または同じ)ならば,
     132                 *  indexが挿入位置なのでループを抜ける.
    152133                 */
    153134                parent = PARENT(index);
     
    157138
    158139                /*
    159                  *  親ノードをindexの位置に移動させる.
     140                 *  親ノードをindexの位置に移動させる.
    160141                 */
    161142                TMEVT_NODE(index) = TMEVT_NODE(parent);
     
    163144
    164145                /*
    165                  *  indexを親ノードの位置に更新.
     146                 *  indexを親ノードの位置に更新.
    166147                 */
    167148                index = parent;
     
    173154
    174155/*
    175  *  タイムイベントの挿å
    176 ¥ä½ç½®ã‚’下向きに探索
    177  *
    178  *  時刻timeに発生するタイムイベントを挿å
    179 ¥ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’空けるために,
    180  *  ヒープの下に向かって空ノードを移動させる.移動前の空ノードの位置を
    181  *  indexに渡すと,移動後の空ノードの位置(すなわち挿å
    182 ¥ä½ç½®ï¼‰ã‚’返す.
     156 *  タイムイベントの挿入位置を下向きに探索
     157 *
     158 *  時刻timeに発生するタイムイベントを挿入するノードを空けるために,
     159 *  ヒープの下に向かって空ノードを移動させる.移動前の空ノードの位置を
     160 *  indexに渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す.
    183161 */
    184162#ifdef TOPPERS_tmedown
     
    191169        while ((child = LCHILD(index)) <= last_index) {
    192170                /*
    193                  *  左右の子ノードのイベント発生時刻を比較し,早い方の子ノード
    194                  *  の位置をchildに設定する.以下の子ノードは,ここで選ばれた方
    195                  *  の子ノードのこと.
     171                 *  左右の子ノードのイベント発生時刻を比較し,早い方の子ノード
     172                 *  の位置をchildに設定する.以下の子ノードは,ここで選ばれた方
     173                 *  の子ノードのこと.
    196174                 */
    197175                if (child + 1 <= last_index
     
    202180
    203181                /*
    204                  *  子ノードのイベント発生時刻の方がé
    205 ã„(または同じ)ならば,
    206                  *  indexが挿å
    207 ¥ä½ç½®ãªã®ã§ãƒ«ãƒ¼ãƒ—を抜ける.
     182                 *  子ノードのイベント発生時刻の方が遅い(または同じ)ならば,
     183                 *  indexが挿入位置なのでループを抜ける.
    208184                 */
    209185                if (EVTTIM_LE(time, TMEVT_NODE(child).time)) {
     
    212188
    213189                /*
    214                  *  子ノードをindexの位置に移動させる.
     190                 *  子ノードをindexの位置に移動させる.
    215191                 */
    216192                TMEVT_NODE(index) = TMEVT_NODE(child);
     
    218194
    219195                /*
    220                  *  indexを子ノードの位置に更新.
     196                 *  indexを子ノードの位置に更新.
    221197                 */
    222198                index = child;
     
    228204
    229205/*
    230  *  タイムイベントヒープへの登録
    231  *
    232  *  p_tmevtbで指定したタイムイベントブロックを,timeで指定した時間が経
    233  *  過後にイベントが発生するように,タイムイベントヒープに登録する.
     206 *  タイムイベントヒープへの登録
     207 *
     208 *  p_tmevtbで指定したタイムイベントブロックを,timeで指定した時間が経
     209 *  過後にイベントが発生するように,タイムイベントヒープに登録する.
    234210 */
    235211#ifdef TOPPERS_tmeins
     
    241217
    242218        /*
    243          *  last_indexをインクリメントし,そこから上に挿å
    244 ¥ä½ç½®ã‚’探す.
     219         *  last_indexをインクリメントし,そこから上に挿入位置を探す.
    245220         */
    246221        index = tmevt_up(++last_index, time);
    247222
    248223        /*
    249          *  タイムイベントをindexの位置に挿å
    250 ¥ã™ã‚‹ï¼Ž
     224         *  タイムイベントをindexの位置に挿入する.
    251225         */
    252226        TMEVT_NODE(index).time = time;
     
    258232
    259233/*
    260  *  タイムイベントヒープからの削除
     234 *  タイムイベントヒープからの削除
    261235 */
    262236#ifdef TOPPERS_tmedel
     
    270244
    271245        /*
    272          *  削除によりタイムイベントヒープが空になる場合は何もしない.
     246         *  削除によりタイムイベントヒープが空になる場合は何もしない.
    273247         */
    274248        if (--last_index == 0) {
     
    277251
    278252        /*
    279          *  削除したノードの位置に最後のノード(last_index+1の位置のノード)
    280          *  を挿å
    281 ¥ã—,それを適切な位置へ移動させる.実際には,最後のノード
    282          *  を実際に挿å
    283 ¥ã™ã‚‹ã®ã§ã¯ãªãï¼Œå‰Šé™¤ã—たノードの位置が空ノードにな
    284          *  るので,最後のノードを挿å
    285 ¥ã™ã¹ãä½ç½®ã¸å‘けて空ノードを移動させ
    286          *  る.
    287          *  最後のノードのイベント発生時刻が,削除したノードの親ノードのイ
    288          *  ベント発生時刻より前の場合には,上に向かって挿å
    289 ¥ä½ç½®ã‚’探す.そ
    290          *  うでない場合には,下に向かって探す.
     253         *  削除したノードの位置に最後のノード(last_index+1の位置のノード)
     254         *  を挿入し,それを適切な位置へ移動させる.実際には,最後のノード
     255         *  を実際に挿入するのではなく,削除したノードの位置が空ノードにな
     256         *  るので,最後のノードを挿入すべき位置へ向けて空ノードを移動させ
     257         *  る.
     258         *  最後のノードのイベント発生時刻が,削除したノードの親ノードのイ
     259         *  ベント発生時刻より前の場合には,上に向かって挿入位置を探す.そ
     260         *  うでない場合には,下に向かって探す.
    291261         */
    292262        if (index > 1 && EVTTIM_LT(event_time,
    293263                                                                TMEVT_NODE(parent = PARENT(index)).time)) {
    294264                /*
    295                  *  親ノードをindexの位置に移動させる.
     265                 *  親ノードをindexの位置に移動させる.
    296266                 */
    297267                TMEVT_NODE(index) = TMEVT_NODE(parent);
     
    299269
    300270                /*
    301                  *  削除したノードの親ノードから上に向かって挿å
    302 ¥ä½ç½®ã‚’探す.
     271                 *  削除したノードの親ノードから上に向かって挿入位置を探す.
    303272                 */
    304273                index = tmevt_up(parent, event_time);
     
    306275        else {
    307276                /*
    308                  *  削除したノードから下に向かって挿å
    309 ¥ä½ç½®ã‚’探す.
     277                 *  削除したノードから下に向かって挿入位置を探す.
    310278                 */
    311279                index = tmevt_down(index, event_time);
     
    313281
    314282        /*
    315          *  最後のノードをindexの位置に挿å
    316 ¥ã™ã‚‹ï¼Ž
     283         *  最後のノードをindexの位置に挿入する.
    317284         */
    318285        TMEVT_NODE(index) = TMEVT_NODE(last_index + 1);
     
    323290
    324291/*
    325  *  タイムイベントヒープのå
    326 ˆé ­ã®ãƒŽãƒ¼ãƒ‰ã®å‰Šé™¤
     292 *  タイムイベントヒープの先頭のノードの削除
    327293 */
    328294Inline void
     
    333299
    334300        /*
    335          *  削除によりタイムイベントヒープが空になる場合は何もしない.
     301         *  削除によりタイムイベントヒープが空になる場合は何もしない.
    336302         */
    337303        if (--last_index == 0) {
     
    340306
    341307        /*
    342          *  ルートノードに最後のノード(last_index + 1 の位置のノード)を
    343          *  挿å
    344 ¥ã—,それを適切な位置へ移動させる.実際には,最後のノードを
    345          *  実際に挿å
    346 ¥ã™ã‚‹ã®ã§ã¯ãªãï¼Œãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ãŒç©ºãƒŽãƒ¼ãƒ‰ã«ãªã‚‹ã®ã§ï¼Œæœ€
    347          *  後のノードを挿å
    348 ¥ã™ã¹ãä½ç½®ã¸å‘けて空ノードを移動させる.
     308         *  ルートノードに最後のノード(last_index + 1 の位置のノード)を
     309         *  挿入し,それを適切な位置へ移動させる.実際には,最後のノードを
     310         *  実際に挿入するのではなく,ルートノードが空ノードになるので,最
     311         *  後のノードを挿入すべき位置へ向けて空ノードを移動させる.
    349312         */
    350313        index = tmevt_down(1, event_time);
    351314
    352315        /*
    353          *  最後のノードをindexの位置に挿å
    354 ¥ã™ã‚‹ï¼Ž
     316         *  最後のノードをindexの位置に挿入する.
    355317         */
    356318        TMEVT_NODE(index) = TMEVT_NODE(last_index + 1);
     
    359321
    360322/*
    361  *  タイムイベントまでの残り時間の計算
     323 *  タイムイベントまでの残り時間の計算
    362324 */
    363325#ifdef TOPPERS_tmeltim
     
    371333        if (EVTTIM_LE(time, next_time)) {
    372334                /*
    373                  *  次のタイムティックで処理される場合には0を返す.
     335                 *  次のタイムティックで処理される場合には0を返す.
    374336                 */
    375337                return(0U);
     
    383345
    384346/*
    385  *  タイムティックの供給
     347 *  タイムティックの供給
    386348 */
    387349#ifdef TOPPERS_sigtim
     
    398360
    399361        /*
    400          *  current_timeを更新する.
     362         *  current_timeを更新する.
    401363         */
    402364        current_time = next_time;
    403365
    404366        /*
    405          *  next_time,next_subtimeを更新する.
     367         *  next_time,next_subtimeを更新する.
    406368         */
    407369#if TIC_DENO == 1U
     
    417379
    418380        /*
    419          *  current_timeよりイベント発生時刻の早い(または同じ)タイムイベ
    420          *  ントを,タイムイベントヒープから削除し,コールバック関数を呼び
    421          *  出す.
     381         *  current_timeよりイベント発生時刻の早い(または同じ)タイムイベ
     382         *  ントを,タイムイベントヒープから削除し,コールバック関数を呼び
     383         *  出す.
    422384         */
    423385        while (last_index > 0 && EVTTIM_LE(TMEVT_NODE(1).time, current_time)) {
     
    428390
    429391        /*
    430          *  min_timeを更新する.
     392         *  min_timeを更新する.
    431393         */
    432394        min_time = current_time;
Note: See TracChangeset for help on using the changeset viewer.