task_except.c

説明を見る。
00001 /*
00002  *  TOPPERS/FDMP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Function Distributed Multiprocessor Kernel
00005  *
00006  *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
00007  *                              Toyohashi Univ. of Technology, JAPAN
00008  *  Copyright (C) 2005-2006 by Embedded and Real-Time Systems Laboratory
00009  *              Graduate School of Information Science, Nagoya Univ., JAPAN
00010  * 
00011  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
00012  *  によって公表されている GNU General Public License の Version 2 に記
00013  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00014  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00015  *  利用と呼ぶ)することを無償で許諾する.
00016  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00017  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00018  *      スコード中に含まれていること.
00019  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00020  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00021  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00022  *      の無保証規定を掲載すること.
00023  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00024  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00025  *      と.
00026  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00027  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00028  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00029  *        報告すること.
00030  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00031  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00032  * 
00033  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00034  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00035  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00036  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00037  * 
00038  *  @(#) $Id: task_except.c,v 1.3 2006/03/14 04:37:54 honda Exp $
00039  */
00040 
00045 #include "fdmp_kernel.h"
00046 #include "check.h"
00047 #include "task.h"
00048 
00052 #ifdef __ras_tex
00053 
00054 SYSCALL ER
00055 ras_tex(ID tskid, TEXPTN rasptn)
00056 {
00057     TCB *tcb;
00058     ER  ercd;
00059     CCB *ccb;
00060 
00061     LOG_RAS_TEX_ENTER(tskid, rasptn);
00062     CHECK_TSKCTX_UNL();
00063     ccb = T_CHECK_CLSID_CCB(tskid);
00064     tskid = remove_clsid(tskid);
00065     CHECK_TSKID_SELF(ccb, tskid);
00066     CHECK_PAR(rasptn != 0);
00067     tcb = get_tcb_self(ccb, tskid);
00068 
00069   retry:
00070     T_ACQUIRE_LOCK(ccb->tsk_lock);
00071     if (TSTAT_DORMANT(tcb->tstat) || tcb->tinib->texrtn == NULL
00072         || (tcb == runtsk && tcb->terflg)) {
00073         ercd = E_OBJ;
00074     }
00075     else {
00076         tcb->texptn |= rasptn;
00077         if (dispatch_request(ccb->prcid)){
00078             /* 自プロセッサの場合 */
00079             if (tcb == runtsk && runtsk->enatex) {
00080                 call_texrtn();
00081             }
00082         }
00083         ercd = E_OK;
00084     }
00085     T_RELEASE_LOCK(ccb->tsk_lock);
00086 
00087   exit:
00088     LOG_RAS_TEX_LEAVE(ercd);
00089     return(ercd);
00090 }
00091 
00092 #endif /* __ras_tex */
00093 
00097 #ifdef __iras_tex
00098 
00099 SYSCALL ER
00100 iras_tex(ID tskid, TEXPTN rasptn)
00101 {
00102     TCB *tcb;
00103     ER  ercd;
00104     CCB *ccb;
00105 
00106     LOG_IRAS_TEX_ENTER(tskid, rasptn);
00107     CHECK_INTCTX_UNL();
00108     ccb = I_CHECK_CLSID_CCB(tskid);
00109     tskid = remove_clsid(tskid);
00110     CHECK_TSKID_SELF(ccb, tskid);   
00111     CHECK_PAR(rasptn != 0);
00112     tcb = get_tcb(ccb, tskid);
00113 
00114   retry:
00115     I_ACQUIRE_LOCK(ccb->tsk_lock);
00116     if (TSTAT_DORMANT(tcb->tstat) || tcb->tinib->texrtn == NULL) {
00117         ercd = E_OBJ;
00118     }
00119     else {
00120         tcb->texptn |= rasptn;
00121         if (dispatch_request(ccb->prcid)){
00122             /* 自プロセッサの場合 */
00123             if (tcb == runtsk && runtsk->enatex) {
00124                 reqflg = TRUE;
00125             }
00126         }
00127         ercd = E_OK;
00128     }
00129     I_RELEASE_LOCK(ccb->tsk_lock);
00130 
00131   exit:
00132     LOG_IRAS_TEX_LEAVE(ercd);
00133     return(ercd);
00134 }
00135 
00136 #endif /* __iras_tex */
00137 
00141 #ifdef __dis_tex
00142 
00143 SYSCALL ER
00144 dis_tex()
00145 {
00146     ER  ercd;
00147 
00148     LOG_DIS_TEX_ENTER();
00149     CHECK_TSKCTX_UNL();
00150 
00151   retry:
00152     T_ACQUIRE_LOCK(runccb->tsk_lock);
00153     if (runtsk->tinib->texrtn == NULL || runtsk->terflg) {
00154         ercd = E_OBJ;
00155     }
00156     else {
00157         runtsk->enatex = FALSE;
00158         ercd = E_OK;
00159     }
00160     T_RELEASE_LOCK(runccb->tsk_lock);
00161 
00162     exit:
00163     LOG_DIS_TEX_LEAVE(ercd);
00164     return(ercd);
00165 }
00166 
00167 #endif /* __dis_tex */
00168 
00172 #ifdef __ena_tex
00173 
00174 SYSCALL ER
00175 ena_tex()
00176 {
00177     ER  ercd;
00178 
00179     LOG_ENA_TEX_ENTER();
00180     CHECK_TSKCTX_UNL();
00181 
00182   retry:
00183     T_ACQUIRE_LOCK_AND_CHECK_RUNNABLE();
00184     if (runtsk->tinib->texrtn == NULL || runtsk->terflg) {
00185         ercd = E_OBJ;
00186     }
00187     else {
00188         runtsk->enatex = TRUE;
00189         if (runtsk->texptn != 0) {
00190             call_texrtn();
00191         }
00192         ercd = E_OK;
00193     }
00194     T_RELEASE_LOCK(runccb->tsk_lock);
00195 
00196   exit:
00197     LOG_ENA_TEX_LEAVE(ercd);
00198     return(ercd);
00199 }
00200 
00201 #endif /* __ena_tex */
00202 
00206 #ifdef __sns_tex
00207 
00208 SYSCALL BOOL
00209 sns_tex()
00210 {
00211     BOOL    state;
00212 
00213     LOG_SNS_TEX_ENTER();
00214     state = (runtsk != NULL && runtsk->enatex) ? FALSE : TRUE;
00215     LOG_SNS_TEX_LEAVE(state);
00216     return(state);
00217 }
00218 
00219 #endif /* __sns_tex */

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:13 2006 に Doxygen によって生成されました。