OSDN Git Service

(none)
authorryuz <ryuz>
Sat, 10 Nov 2007 04:40:08 +0000 (04:40 +0000)
committerryuz <ryuz>
Sat, 10 Nov 2007 04:40:08 +0000 (04:40 +0000)
kernel/include/config/cfgknl.h
kernel/include/object/mtxobj.h
kernel/include/parser/parsknl.h
kernel/source/object/mtx/loc_mtx.c

index 171570d..d81594c 100755 (executable)
@@ -238,8 +238,8 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ
 /* Attribute */
 #define _KERNEL_CFG_MTX_TA_TFIFO               TRUE                            /**< %jp{TA_TFIFO属性に対応する} */
 #define _KERNEL_CFG_MTX_TA_TPRI                        TRUE                            /**< %jp{TA_TPRI属性に対応する} */
-#define _KERNEL_CFG_MBX_TA_INHERIT             TRUE                            /**< %jp{TA_INHERIT属性に対応する} */
-#define _KERNEL_CFG_MBX_TA_CEILING             TRUE                            /**< %jp{TA_CEILING属性に対応する} */
+#define _KERNEL_CFG_MTX_TA_INHERIT             TRUE                            /**< %jp{TA_INHERIT属性に対応する} */
+#define _KERNEL_CFG_MTX_TA_CEILING             TRUE                            /**< %jp{TA_CEILING属性に対応する} */
 
 /* Control block */
 #define _KERNEL_CFG_MTXCB_ALGORITHM            _KERNEL_MTXCB_ALG_BLKARRAY
index ef431cc..84e15e9 100755 (executable)
@@ -129,7 +129,7 @@ typedef struct _kernel_t_mtxcb
 #endif
 
 #if _KERNEL_MTXCB_CEILPRI
-       _KERNEL_MTXCB_T_CEILPRI ceilpri         KERNEL_MTXCB_TBITDEF_CEILPRI;           /**< %jp{ミューテックスの上限優先度} */
+       _KERNEL_MTXCB_T_CEILPRI ceilpri         _KERNEL_MTXCB_TBITDEF_CEILPRI;          /**< %jp{ミューテックスの上限優先度} */
 #endif
 } _KERNEL_T_MTXCB;
 
@@ -231,50 +231,51 @@ extern  _KERNEL_T_MTXCB                                   *_kernel_mtxcb_tbl[];                                                                   /**< %jp{ミューテ
 
 
 /* que */
-#define _KERNEL_MTX_GET_QUE(mtxcb)                     (&(mtxcb)->que)
+#define _KERNEL_MTX_GET_QUE(mtxcb)                             (&(mtxcb)->que)
 
 
 /* tskhdl */
 #if _KERNEL_MTXCB_TSKHDL
-#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x)       do { (mtxcb)->tskhdl = (_KERNEL_MTXCB_T_TSKHDL)(x); } while (0)
-#define _KERNEL_MTX_GET_TSKHDL(mtxcb)          ((_KERNEL_MTX_T_TSKHDL)(mtxcb)->tskhdl)
+#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x)               do { (mtxcb)->tskhdl = (_KERNEL_MTXCB_T_TSKHDL)(x); } while (0)
+#define _KERNEL_MTX_GET_TSKHDL(mtxcb)                  ((_KERNEL_MTX_T_TSKHDL)(mtxcb)->tskhdl)
 #else
-#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x)       do { } while (0)
-#define _KERNEL_MTX_GET_TSKHDL(mtxcb)          (0)
-#endif
-
-
-/* mtxatr */
-#if _KERNEL_MTXCB_MTXATR
-#define _KERNEL_MTX_SET_MTXATR(mtxcb, x)       do { (mtxcb)->mtxatr = (_KERNEL_MTXCB_T_MTXATR)(x); } while (0)
-#define _KERNEL_MTX_GET_MTXATR(mtxcb)          ((_KERNEL_MTX_T_MTXATR)(mtxcb)->mtxatr)
-#else
-#define _KERNEL_MTX_SET_MTXATR(mtxcb, x)       do { } while (0)
-#if _KERNEL_SPT_MTX_TA_TFIFO
-#define _KERNEL_MTX_GET_MTXATR(mtxcb)          (TA_TFIFO)
-#else
-#define _KERNEL_MTX_GET_MTXATR(mtxcb)          (TA_TPRI)
-#endif
+#define _KERNEL_MTX_SET_TSKHDL(mtxcb, x)               do { } while (0)
+#define _KERNEL_MTX_GET_TSKHDL(mtxcb)                  (0)
 #endif
 
 
 /* next */
 #if _KERNEL_MTXCB_NEXT
-#define _KERNEL_MTX_SET_NEXT(mtxcb, x)         do { (mtxcb)->next = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0)
-#define _KERNEL_MTX_GET_NEXT(mtxcb)                    ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->next)
+#define _KERNEL_MTX_SET_NEXT(mtxcb, x)                 do { (mtxcb)->next = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0)
+#define _KERNEL_MTX_GET_NEXT(mtxcb)                            ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->next)
 #else
-#define _KERNEL_MTX_SET_NEXT(mtxcb, x)         do { } while (0)
-#define _KERNEL_MTX_GET_NEXT(mtxcb)                    (0)
+#define _KERNEL_MTX_SET_NEXT(mtxcb, x)                 do { } while (0)
+#define _KERNEL_MTX_GET_NEXT(mtxcb)                            (0)
 #endif
 
 
 /* prev */
 #if _KERNEL_MTXCB_PREV
-#define _KERNEL_MTX_SET_PREV(mtxcb, x)         do { (mtxcb)->prev = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0)
-#define _KERNEL_MTX_GET_PREV(mtxcb)                    ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->prev)
+#define _KERNEL_MTX_SET_PREV(mtxcb, x)                 do { (mtxcb)->prev = (_KERNEL_MTXCB_T_MTXHDL)(x); } while (0)
+#define _KERNEL_MTX_GET_PREV(mtxcb)                            ((_KERNEL_MTX_T_MTXHDL)(mtxcb)->prev)
 #else
-#define _KERNEL_MTX_SET_PREV(mtxcb, x)         do { } while (0)
-#define _KERNEL_MTX_GET_PREV(mtxcb)                    (0)
+#define _KERNEL_MTX_SET_PREV(mtxcb, x)                 do { } while (0)
+#define _KERNEL_MTX_GET_PREV(mtxcb)                            (0)
+#endif
+
+
+
+/* mtxatr */
+#if _KERNEL_MTXCB_MTXATR
+#define _KERNEL_MTX_SET_MTXATR(mtxcb_ro, x)            do { (mtxcb_ro)->mtxatr = (_KERNEL_MTXCB_T_MTXATR)(x); } while (0)
+#define _KERNEL_MTX_GET_MTXATR(mtxcb_ro)               ((_KERNEL_MTX_T_MTXATR)(mtxcb_ro)->mtxatr)
+#else
+#define _KERNEL_MTX_SET_MTXATR(mtxcb_ro, x)            do { } while (0)
+#if _KERNEL_SPT_MTX_TA_CEILING
+#define _KERNEL_MTX_GET_MTXATR(mtxcb_ro)               (TA_CEILING)
+#else
+#define _KERNEL_MTX_GET_MTXATR(mtxcb_ro)               (TA_INHERIT)
+#endif
 #endif
 
 
index fd10036..ce8e447 100755 (executable)
 /* Attribute */
 #define _KERNEL_SPT_MTX_TA_TFIFO       _KERNEL_CFG_MTX_TA_TFIFO                /**< %jp{TA_TFIFO属性に対応する} */
 #define _KERNEL_SPT_MTX_TA_TPRI                _KERNEL_CFG_MTX_TA_TPRI                 /**< %jp{TA_TPRI属性に対応する} */
-#define _KERNEL_SPT_MTX_TA_INHERIT     _KERNEL_CFG_MBX_TA_INHERIT              /**< %jp{TA_INHERIT属性に対応する} */
-#define _KERNEL_SPT_MTX_TA_CEILING     _KERNEL_CFG_MBX_TA_CEILING              /**< %jp{TA_CEILING属性に対応する} */
+#define _KERNEL_SPT_MTX_TA_INHERIT     _KERNEL_CFG_MTX_TA_INHERIT              /**< %jp{TA_INHERIT属性に対応する} */
+#define _KERNEL_SPT_MTX_TA_CEILING     _KERNEL_CFG_MTX_TA_CEILING              /**< %jp{TA_CEILING属性に対応する} */
 
 /* Control block */
 #define _KERNEL_MTXCB_ALGORITHM                _KERNEL_CFG_MTXCB_ALGORITHM
index f906f3d..2f42dd6 100755 (executable)
@@ -32,12 +32,13 @@ ER loc_mtx(ID mtxid)
 /** %jp{ミューテックスのロック獲得} */
 ER loc_mtx(ID mtxid)
 {
-       _KERNEL_T_MTXCB_PTR    mtxcb;
-       _KERNEL_T_MTXCB_RO_PTR mtxcb_ro;
-       _KERNEL_T_TSKHDL       tskhdl;
-       _KERNEL_T_TCB          *tcb;
-       _KERNEL_T_TSKHDL       loc_tskhdl;
-       ER                     ercd;
+       _KERNEL_T_MTXCB_RO_PTR  mtxcb_ro;
+       _KERNEL_T_MTXCB_PTR             mtxcb;
+       _KERNEL_T_MTXHDL                mtxhdl;
+       _KERNEL_T_TCB_PTR               tcb;
+       _KERNEL_T_TSKHDL                tskhdl;
+       _KERNEL_T_TSKHDL                tskhdl_lock;
+       ER                                              ercd;
                
        /* %jp{コンテキストチェック} */
 #if _KERNEL_SPT_LOC_MTX_E_CTX
@@ -75,7 +76,7 @@ ER loc_mtx(ID mtxid)
        tcb    = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
        
        /* ロック中のタスクハンドル取得 */
-       loc_tskhdl = _KERNEL_MTX_GET_TSKHDL(mtxcb);
+       tskhdl_lock = _KERNEL_MTX_GET_TSKHDL(mtxcb);
 
        if ( _KERNEL_MTX_GET_TSKHDL(mtxcb) == _KERNEL_TSKHDL_NULL )
        {
@@ -85,7 +86,6 @@ ER loc_mtx(ID mtxid)
                /* %jp{ミューテックスをTCBに接続} */
                {
                        _KERNEL_T_MTXHDL        mtxhdl_head;
-                       _KERNEL_T_MTXHDL        mtxhdl;
                        
                        mtxhdl = _KERNEL_MTX_GET_MTXHDL(mtxid, mtxcb);
                        
@@ -117,13 +117,15 @@ ER loc_mtx(ID mtxid)
                                _KERNEL_MTX_SET_PREV(mtxcb, mtxhdl_prev);
                        }
                }
-               
-               
+                       
 #if _KERNEL_SPT_MTX_TA_CEILING
-               /* %jp{タスクの優先度をシーリング値まで引き上げ} */
-               if ( _KERNEL_TSK_GET_TSKPRI(tcb) < _KERNEL_MTX_GET_CEILPRI(mtxcb_ro) )
+               if ( _KERNEL_MTX_GET_MTXATR(mtxcb_ro) == TA_CEILING )
                {
-                       _KERNEL_TSK_SET_TSKPRI(tcb, _KERNEL_MTX_GET_CEILPRI(mtxcb_ro));
+                       /* %jp{タスクの優先度をシーリング値まで引き上げ} */
+                       if ( _KERNEL_TSK_GET_TSKPRI(tcb) < _KERNEL_MTX_GET_CEILPRI(mtxcb_ro) )
+                       {
+                               _KERNEL_TSK_SET_TSKPRI(tcb, _KERNEL_MTX_GET_CEILPRI(mtxcb_ro));
+                       }
                }
 #endif
                
@@ -137,17 +139,19 @@ ER loc_mtx(ID mtxid)
                _KERNEL_DSP_WAI_TSK(tskhdl);
                _KERNEL_MTX_ADD_QUE(mtxcb, _KERNEL_MTX_GET_MTXCB_RO(mtxid, mtxcb), tskhdl);                     /* %jp{待ち行列に追加} */
 
-#if _KERNEL_MTX_TA_INHERIT
+#if _KERNEL_SPT_MTX_TA_INHERIT
+               /* %jp{優先度継承} */
+               if ( _KERNEL_MTX_GET_MTXATR(mtxcb_ro) == TA_INHERIT )
                {
-                       _KERNEL_T_TSKHDL loc_tcb;
+                       _KERNEL_T_TCB_PTR tcb_lock;
 
                        /* %jp{ロック中タスクのTCB取得} */
-                       loc_tcb = _KERNEL_TSK_TSKHDL2TCB(loc_tskhdl);
+                       tcb_lock = _KERNEL_TSK_TSKHDL2TCB(tskhdl_lock);
 
                        /* %jp{優先度継承} */
-                       if ( _KERNEL_TSK_GET_TSKPRI(loc_tcb) > _KERNEL_TSK_GET_TSKPRI(tcb) )
+                       if ( _KERNEL_TSK_GET_TSKPRI(tcb_lock) > _KERNEL_TSK_GET_TSKPRI(tcb) )
                        {
-                               _KERNEL_TSK_SET_TSKPRI(loc_tcb, _KERNEL_TSK_GET_TSKPRI(tcb))
+                               _KERNEL_TSK_SET_TSKPRI(tcb_lock, _KERNEL_TSK_GET_TSKPRI(tcb));
                        }
                }
 #endif