semaphore.c

#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"
#include "semaphore.h"

ソースコードを見る。

マクロ定義

#define LOG_SIG_SEM_ENTER(semid)
#define LOG_SIG_SEM_LEAVE(ercd)
#define LOG_ISIG_SEM_ENTER(semid)
#define LOG_ISIG_SEM_LEAVE(ercd)
#define LOG_WAI_SEM_ENTER(semid)
#define LOG_WAI_SEM_LEAVE(ercd)
#define LOG_POL_SEM_ENTER(semid)
#define LOG_POL_SEM_LEAVE(ercd)
#define LOG_TWAI_SEM_ENTER(semid, tmout)
#define LOG_TWAI_SEM_LEAVE(ercd)
#define LOG_INI_SEM_ENTER(semid)
#define LOG_INI_SEM_LEAVE(ercd)
#define LOG_REF_SEM_ENTER(semid, pk_rsem)
#define LOG_REF_SEM_LEAVE(ercd, pk_rsem)
#define tnum_sem   ((uint_t)(tmax_semid - TMIN_SEMID + 1))
#define INDEX_SEM(semid)   ((uint_t)((semid) - TMIN_SEMID))
#define get_semcb(semid)   (&(semcb_table[INDEX_SEM(semid)]))

関数

void initialize_semaphore (void)
ER sig_sem (ID semid)
ER isig_sem (ID semid)
ER wai_sem (ID semid)
ER pol_sem (ID semid)
ER twai_sem (ID semid, TMO tmout)
ER ini_sem (ID semid)
ER ref_sem (ID semid, T_RSEM *pk_rsem)


マクロ定義

#define get_semcb ( semid   )     (&(semcb_table[INDEX_SEM(semid)]))

semaphore.c121 行で定義されています。

参照元 ini_sem(), isig_sem(), pol_sem(), ref_sem(), sig_sem(), twai_sem(), と wai_sem().

#define INDEX_SEM ( semid   )     ((uint_t)((semid) - TMIN_SEMID))

semaphore.c120 行で定義されています。

#define LOG_INI_SEM_ENTER ( semid   ) 

semaphore.c97 行で定義されています。

参照元 ini_sem().

#define LOG_INI_SEM_LEAVE ( ercd   ) 

semaphore.c101 行で定義されています。

参照元 ini_sem().

#define LOG_ISIG_SEM_ENTER ( semid   ) 

semaphore.c65 行で定義されています。

参照元 isig_sem().

#define LOG_ISIG_SEM_LEAVE ( ercd   ) 

semaphore.c69 行で定義されています。

参照元 isig_sem().

#define LOG_POL_SEM_ENTER ( semid   ) 

semaphore.c81 行で定義されています。

参照元 pol_sem().

#define LOG_POL_SEM_LEAVE ( ercd   ) 

semaphore.c85 行で定義されています。

参照元 pol_sem().

#define LOG_REF_SEM_ENTER ( semid,
pk_rsem   ) 

semaphore.c105 行で定義されています。

参照元 ref_sem().

#define LOG_REF_SEM_LEAVE ( ercd,
pk_rsem   ) 

semaphore.c109 行で定義されています。

参照元 ref_sem().

#define LOG_SIG_SEM_ENTER ( semid   ) 

semaphore.c57 行で定義されています。

参照元 sig_sem().

#define LOG_SIG_SEM_LEAVE ( ercd   ) 

semaphore.c61 行で定義されています。

参照元 sig_sem().

#define LOG_TWAI_SEM_ENTER ( semid,
tmout   ) 

semaphore.c89 行で定義されています。

参照元 twai_sem().

#define LOG_TWAI_SEM_LEAVE ( ercd   ) 

semaphore.c93 行で定義されています。

参照元 twai_sem().

#define LOG_WAI_SEM_ENTER ( semid   ) 

semaphore.c73 行で定義されています。

参照元 wai_sem().

#define LOG_WAI_SEM_LEAVE ( ercd   ) 

semaphore.c77 行で定義されています。

参照元 wai_sem().

#define tnum_sem   ((uint_t)(tmax_semid - TMIN_SEMID + 1))

semaphore.c115 行で定義されています。

参照元 initialize_semaphore().


関数

ER ini_sem ( ID  semid  ) 

semaphore.c344 行で定義されています。

参照先 CHECK_SEMID, CHECK_TSKCTX_UNL, dispatch, E_OK, get_semcb, init_wait_queue, semaphore_initialization_block::isemcnt, LOG_INI_SEM_ENTER, LOG_INI_SEM_LEAVE, semaphore_control_block::p_seminib, semaphore_control_block::semcnt, t_lock_cpu, t_unlock_cpu, と semaphore_control_block::wait_queue.

参照元 serial_cls_por().

00345 {
00346     SEMCB   *p_semcb;
00347     bool_t  dspreq;
00348     ER      ercd;
00349     
00350     LOG_INI_SEM_ENTER(semid);
00351     CHECK_TSKCTX_UNL();
00352     CHECK_SEMID(semid);
00353     p_semcb = get_semcb(semid);
00354 
00355     t_lock_cpu();
00356     dspreq = init_wait_queue(&(p_semcb->wait_queue));
00357     p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
00358     if (dspreq) {
00359         dispatch();
00360     }
00361     ercd = E_OK;
00362     t_unlock_cpu();
00363 
00364   error_exit:
00365     LOG_INI_SEM_LEAVE(ercd);
00366     return(ercd);
00367 }

void initialize_semaphore ( void   ) 

semaphore.c129 行で定義されています。

参照先 semaphore_initialization_block::isemcnt, semaphore_control_block::p_seminib, queue_initialize(), semcb_table, semaphore_control_block::semcnt, seminib_table, tnum_sem, と semaphore_control_block::wait_queue.

00130 {
00131     uint_t  i;
00132     SEMCB   *p_semcb;
00133 
00134     for (p_semcb = semcb_table, i = 0; i < tnum_sem; p_semcb++, i++) {
00135         queue_initialize(&(p_semcb->wait_queue));
00136         p_semcb->p_seminib = &(seminib_table[i]);
00137         p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
00138     }
00139 }

ER isig_sem ( ID  semid  ) 

semaphore.c190 行で定義されています。

参照先 CHECK_INTCTX_UNL, CHECK_SEMID, E_OK, E_QOVR, get_semcb, i_lock_cpu, i_unlock_cpu, LOG_ISIG_SEM_ENTER, LOG_ISIG_SEM_LEAVE, semaphore_initialization_block::maxsem, semaphore_control_block::p_seminib, queue_delete_next(), queue_empty(), reqflg, semaphore_control_block::semcnt, wait_complete, と semaphore_control_block::wait_queue.

参照元 sio_irdy_rcv(), と sio_irdy_snd().

00191 {
00192     SEMCB   *p_semcb;
00193     TCB     *p_tcb;
00194     ER      ercd;
00195     
00196     LOG_ISIG_SEM_ENTER(semid);
00197     CHECK_INTCTX_UNL();
00198     CHECK_SEMID(semid);
00199     p_semcb = get_semcb(semid);
00200 
00201     i_lock_cpu();
00202     if (!queue_empty(&(p_semcb->wait_queue))) {
00203         p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
00204         if (wait_complete(p_tcb)) {
00205             reqflg = true;
00206         }
00207         ercd = E_OK;
00208     }
00209     else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
00210         p_semcb->semcnt += 1;
00211         ercd = E_OK;
00212     }
00213     else {
00214         ercd = E_QOVR;
00215     }
00216     i_unlock_cpu();
00217 
00218   error_exit:
00219     LOG_ISIG_SEM_LEAVE(ercd);
00220     return(ercd);
00221 }

ER pol_sem ( ID  semid  ) 

semaphore.c268 行で定義されています。

参照先 CHECK_SEMID, CHECK_TSKCTX_UNL, E_OK, E_TMOUT, get_semcb, LOG_POL_SEM_ENTER, LOG_POL_SEM_LEAVE, semaphore_control_block::semcnt, t_lock_cpu, と t_unlock_cpu.

00269 {
00270     SEMCB   *p_semcb;
00271     ER      ercd;
00272 
00273     LOG_POL_SEM_ENTER(semid);
00274     CHECK_TSKCTX_UNL();
00275     CHECK_SEMID(semid);
00276     p_semcb = get_semcb(semid);
00277 
00278     t_lock_cpu();
00279     if (p_semcb->semcnt >= 1) {
00280         p_semcb->semcnt -= 1;
00281         ercd = E_OK;
00282     }
00283     else {
00284         ercd = E_TMOUT;
00285     }
00286     t_unlock_cpu();
00287 
00288   error_exit:
00289     LOG_POL_SEM_LEAVE(ercd);
00290     return(ercd);
00291 }

ER ref_sem ( ID  semid,
T_RSEM pk_rsem 
)

semaphore.c377 行で定義されています。

参照先 CHECK_SEMID, CHECK_TSKCTX_UNL, E_OK, get_semcb, LOG_REF_SEM_ENTER, LOG_REF_SEM_LEAVE, semaphore_control_block::semcnt, t_rsem::semcnt, t_lock_cpu, t_unlock_cpu, semaphore_control_block::wait_queue, wait_tskid(), と t_rsem::wtskid.

00378 {
00379     SEMCB   *p_semcb;
00380     ER      ercd;
00381     
00382     LOG_REF_SEM_ENTER(semid, pk_rsem);
00383     CHECK_TSKCTX_UNL();
00384     CHECK_SEMID(semid);
00385     p_semcb = get_semcb(semid);
00386 
00387     t_lock_cpu();
00388     pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
00389     pk_rsem->semcnt = p_semcb->semcnt;
00390     ercd = E_OK;
00391     t_unlock_cpu();
00392 
00393   error_exit:
00394     LOG_REF_SEM_LEAVE(ercd, pk_rsem);
00395     return(ercd);
00396 }

ER sig_sem ( ID  semid  ) 

semaphore.c149 行で定義されています。

参照先 CHECK_SEMID, CHECK_TSKCTX_UNL, dispatch, E_OK, E_QOVR, get_semcb, LOG_SIG_SEM_ENTER, LOG_SIG_SEM_LEAVE, semaphore_initialization_block::maxsem, semaphore_control_block::p_seminib, queue_delete_next(), queue_empty(), semaphore_control_block::semcnt, t_lock_cpu, t_unlock_cpu, wait_complete, と semaphore_control_block::wait_queue.

参照元 serial_rea_dat(), と serial_wri_dat().

00150 {
00151     SEMCB   *p_semcb;
00152     TCB     *p_tcb;
00153     ER      ercd;
00154     
00155     LOG_SIG_SEM_ENTER(semid);
00156     CHECK_TSKCTX_UNL();
00157     CHECK_SEMID(semid);
00158     p_semcb = get_semcb(semid);
00159 
00160     t_lock_cpu();
00161     if (!queue_empty(&(p_semcb->wait_queue))) {
00162         p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
00163         if (wait_complete(p_tcb)) {
00164             dispatch();
00165         }
00166         ercd = E_OK;
00167     }
00168     else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
00169         p_semcb->semcnt += 1;
00170         ercd = E_OK;
00171     }
00172     else {
00173         ercd = E_QOVR;
00174     }
00175     t_unlock_cpu();
00176 
00177   error_exit:
00178     LOG_SIG_SEM_LEAVE(ercd);
00179     return(ercd);
00180 }

ER twai_sem ( ID  semid,
TMO  tmout 
)

semaphore.c301 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_SEMID, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, get_semcb, LOG_TWAI_SEM_ENTER, LOG_TWAI_SEM_LEAVE, p_runtsk, semaphore_control_block::semcnt, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_SEM, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.

00302 {
00303     SEMCB   *p_semcb;
00304     WINFO_SEM winfo_sem;
00305     TMEVTB  tmevtb;
00306     ER      ercd;
00307 
00308     LOG_TWAI_SEM_ENTER(semid, tmout);
00309     CHECK_DISPATCH();
00310     CHECK_SEMID(semid);
00311     CHECK_TMOUT(tmout);
00312     p_semcb = get_semcb(semid);
00313 
00314     t_lock_cpu();
00315     if (p_semcb->semcnt >= 1) {
00316         p_semcb->semcnt -= 1;
00317         ercd = E_OK;
00318     }
00319     else if (tmout == TMO_POL) {
00320         ercd = E_TMOUT;
00321     }
00322     else {
00323         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
00324         wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem,
00325                                                         &tmevtb, tmout);
00326         dispatch();
00327         ercd = winfo_sem.winfo.wercd;
00328     }
00329     t_unlock_cpu();
00330 
00331   error_exit:
00332     LOG_TWAI_SEM_LEAVE(ercd);
00333     return(ercd);
00334 }

ER wai_sem ( ID  semid  ) 

semaphore.c231 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_SEMID, dispatch, E_OK, get_semcb, LOG_WAI_SEM_ENTER, LOG_WAI_SEM_LEAVE, p_runtsk, semaphore_control_block::semcnt, t_lock_cpu, t_unlock_cpu, TS_WAIT_SEM, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait.

参照元 serial_rea_dat(), serial_wri_chr(), と serial_wri_dat().

00232 {
00233     SEMCB   *p_semcb;
00234     WINFO_SEM winfo_sem;
00235     ER      ercd;
00236 
00237     LOG_WAI_SEM_ENTER(semid);
00238     CHECK_DISPATCH();
00239     CHECK_SEMID(semid);
00240     p_semcb = get_semcb(semid);
00241 
00242     t_lock_cpu();
00243     if (p_semcb->semcnt >= 1) {
00244         p_semcb->semcnt -= 1;
00245         ercd = E_OK;
00246     }
00247     else {
00248         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
00249         wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
00250         dispatch();
00251         ercd = winfo_sem.winfo.wercd;
00252     }
00253     t_unlock_cpu();
00254 
00255   error_exit:
00256     LOG_WAI_SEM_LEAVE(ercd);
00257     return(ercd);
00258 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作