definizione di funzione non vista / sconosciuta in linux source

4

Qualcuno può spiegare questo pezzo di codice che ho trovato nel sorgente del kernel di Linux. Vedo un sacco di codice come questo nel kernel di Linux e minix ma non riesco a trovare quello che fa (anche se i compilatori C supportano quel tipo di definizione di funzione)

/* IRQs are disabled and uidhash_lock is held upon function entry.
 * IRQ state (as stored in flags) is restored and uidhash_lock released
 * upon function exit.
 */
static void free_user(struct user_struct *up, unsigned long flags)
__releases(&uidhash_lock)
{
uid_hash_remove(up);
spin_unlock_irqrestore(&uidhash_lock, flags);
key_put(up->uid_keyring);
key_put(up->session_keyring);
kmem_cache_free(uid_cachep, up);
}

Non riesco a scoprire se questo riferimento __releases(&uidhash_lock) prima che inizi la parentesi sia permesso O supportato. (È sicuramente supportato come nel kernel di Linux)

    
posta Broncha 18.12.2012 - 07:18
fonte

1 risposta

9

Queste sono annotazioni usate da Sparse , lo Strumento di analisi statica per il Kernel Linux, originariamente scritto da Linus Torvalds. Quando sono compilati normalmente, senza Sparse, sono semplicemente #define d via a nulla.

Le definizioni sono in include/linux/compiler.h :

# define __releases(x)  __attribute__((context(x,1,0)))

Questo utilizza l'estensione GCC __attribute__ non standard.

Questa specifica annotazione è accoppiata con un'altra chiamata __acquires(x) , che consente a Sparse di determinare se i percorsi di codice che acquisiscono e rilasciano un blocco specifico sono correttamente bilanciati.

    
risposta data 18.12.2012 - 07:47
fonte

Leggi altre domande sui tag