OSDN Git Service

871dd079262f7e40b8bb5e204effab62dc2ac1d3
[hos/hos-v4a.git] / kernel / source / object / mtx / kadd_mtx.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  kadd_mtx.c
5  * @brief %jp{ミューテックスをTCBに接続}%en{}
6  *
7  * Copyright (C) 1998-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #include "core/core.h"
14 #include "object/mtxobj.h"
15
16
17 /** %jp{タスクにミューテックスを接続} */
18 void _kernel_add_mtx(_KERNEL_T_MTXHDL mtxhdl, _KERNEL_T_TSKHDL tskhdl)
19 {
20         _KERNEL_T_MTXCB_PTR             mtxcb;
21         _KERNEL_T_TCB_PTR               tcb;
22         _KERNEL_T_MTXHDL                mtxhdl_head;
23         
24         mtxcb = _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl);
25         tcb   = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
26
27         _KERNEL_MTX_SET_TSKHDL(mtxcb, tskhdl);
28
29         
30         mtxhdl_head = _KERNEL_TSK_GET_MTXHDL(tcb);
31         if ( mtxhdl_head == _KERNEL_MTXHDL_NULL )
32         {
33                 /* %jp{最初の1つを接続} */
34                 _KERNEL_TSK_SET_MTXHDL(tcb, mtxhdl);
35                 _KERNEL_MTX_SET_NEXT(mtxcb, mtxhdl);
36                 _KERNEL_MTX_SET_NEXT(mtxcb, mtxhdl);
37         }
38         else
39         {
40                 _KERNEL_T_MTXHDL        mtxhdl_next;
41                 _KERNEL_T_MTXHDL        mtxhdl_prev;
42                 _KERNEL_T_MTXCB_PTR     mtxcb_next;
43                 _KERNEL_T_MTXCB_PTR     mtxcb_prev;
44
45                 /* %jp{接続の先頭/末尾を取得} */
46                 mtxhdl_next = mtxhdl_head;
47                 mtxcb_next  = _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl_next);
48                 mtxhdl_prev = _KERNEL_MTX_GET_PREV(mtxcb_next);
49                 mtxcb_prev  = _KERNEL_MTX_MTXHDL2MTXCB(mtxhdl_prev);
50
51                 /* %jp{末尾に接続} */
52                 _KERNEL_MTX_SET_PREV(mtxcb_next, mtxhdl);
53                 _KERNEL_MTX_SET_NEXT(mtxcb_prev, mtxhdl);
54                 _KERNEL_MTX_SET_NEXT(mtxcb, mtxhdl_next);
55                 _KERNEL_MTX_SET_PREV(mtxcb, mtxhdl_prev);
56         }
57 }
58
59
60 /* end of file */