2017-01-19 9 views
0

spinlock_tの定義

typedef struct spinlock { 
     union { 
       struct raw_spinlock rlock; 
       struct { 
         u8 __padding[]; 
         struct lockdep_map dep_map; 
       }; 
     }; 
} spinlock_t; 

なぜ、 "dep_map" 変数 "[]を__paddingする" 内部に置く必要があり、以下のようなspinlock_tの定義名前を持たない構造体

ただし、以下のようなものではありませんか?

typedef struct spinlock { 
     union { 
       struct raw_spinlock rlock; 
       u8 __padding[]; 
       struct lockdep_map dep_map; 
     }; 
} spinlock_t; 

特別な意味はありますか?それは二つの構造の労働組合や他の構造は、デバッグ時に有効になっているので

はあなたに

+0

'それだけではない以下のような' - ?あなたのコードのフィールド '__padding'と(同じアドレスに配置)' dep_map'です**組合** '編では、元のコードでそれらが単一に属しながら、構造は、**順次レイアウト**です。構造体のフィールド名がない場合は、 'lock-> field_name-> dep_map'ではなく' lock-> dep_map'という内部フィールドへの参照を簡略化します。 – Tsyvarev

+0

HI Tsyvarev、あなたの説明は非常に明確です、非常にありがとう:) –

答えて

0

に感謝します。 あなたがしようとしていることは、必要ではない構造体メンバを作成することです。そして、一度に1つずつ使用できる2つの構造体を結合して理解する必要があります。

typedef struct spinlock { 
    union { 
     struct raw_spinlock rlock; 

#ifdef CONFIG_DEBUG_LOCK_ALLOC 
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) 
     struct { 
      u8 __padding[LOCK_PADSIZE]; 
      struct lockdep_map dep_map; 
     }; 
#endif 
    }; 
} spinlock_t;