#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.c の 121 行で定義されています。
参照元 ini_sem(), isig_sem(), pol_sem(), ref_sem(), sig_sem(), twai_sem(), と wai_sem().
#define INDEX_SEM | ( | semid | ) | ((uint_t)((semid) - TMIN_SEMID)) |
semaphore.c の 120 行で定義されています。
#define LOG_INI_SEM_ENTER | ( | semid | ) |
#define LOG_INI_SEM_LEAVE | ( | ercd | ) |
#define LOG_ISIG_SEM_ENTER | ( | semid | ) |
#define LOG_ISIG_SEM_LEAVE | ( | ercd | ) |
#define LOG_POL_SEM_ENTER | ( | semid | ) |
#define LOG_POL_SEM_LEAVE | ( | ercd | ) |
#define LOG_REF_SEM_ENTER | ( | semid, | |||
pk_rsem | ) |
#define LOG_REF_SEM_LEAVE | ( | ercd, | |||
pk_rsem | ) |
#define LOG_SIG_SEM_ENTER | ( | semid | ) |
#define LOG_SIG_SEM_LEAVE | ( | ercd | ) |
#define LOG_TWAI_SEM_ENTER | ( | semid, | |||
tmout | ) |
#define LOG_TWAI_SEM_LEAVE | ( | ercd | ) |
#define LOG_WAI_SEM_ENTER | ( | semid | ) |
#define LOG_WAI_SEM_LEAVE | ( | ercd | ) |
#define tnum_sem ((uint_t)(tmax_semid - TMIN_SEMID + 1)) |
semaphore.c の 344 行で定義されています。
参照先 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.c の 129 行で定義されています。
参照先 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 }
semaphore.c の 190 行で定義されています。
参照先 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 }
semaphore.c の 268 行で定義されています。
参照先 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 }
semaphore.c の 377 行で定義されています。
参照先 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 }
semaphore.c の 149 行で定義されています。
参照先 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 }
semaphore.c の 301 行で定義されています。
参照先 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 }
semaphore.c の 231 行で定義されています。
参照先 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.