2017-01-19 4 views
0

dans include/linux/spinlock_types.hla définition de spinlock_t dans le noyau linux

la définition de spinlock_t comme ci-dessous

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

pourquoi la variable "__padding []" et "dep_map" devrait mettre à l'intérieur une structure qui n'a pas de nom

mais pas seulement comme ci-dessous?

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

Y a-t-il une signification particulière?

merci

+0

'mais pas comme ci-dessous' - Dans vos champs de code de la __padding' et 'dep_map' sont ** union ** 'ed (placé à la même adresse), alors que dans le code d'origine, ils appartiennent à simple structure, ont donc ** mise en page séquentielle **. Quant à l'absence du nom de champ de la structure, elle simplifie la référence aux champs internes: 'lock-> dep_map' au lieu de' lock-> field_name-> dep_map'. – Tsyvarev

+0

HI Tsyvarev, votre explication très claire, merci beaucoup :) –

Répondre

0

Parce qu'il est l'union de deux structures et l'autre structure est activée lors de la mise au point. Ce que vous essayez de faire est de créer des membres de structure qui ne sont pas du tout nécessaires. Et vous devriez comprendre en union de deux structures que nous pouvons utiliser une à la fois.

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;