Pagina 1 di 1

container_of

Inviato: lun 19 mag 2008, 16:52
da afterjames
Salve a tutti.Mi sono imbattuto nelle liste bidirezionali che usa il kernel, ho incontrato questa macro container_of che ho capito cosa restituisce ma non capisco come ci riesce:

Codice: Seleziona tutto

#define container_of(ptr, type, member) ({			\
	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
	(type *)( (char *)__mptr - offsetof(type,member) );})
Cosa significa __mptr?

Re: container_of

Inviato: mar 20 mag 2008, 8:26
da absinthe
const typeof( ((type *)0)->member ) *__mptr = (ptr);

*__mptr è una variabile della macro. è definita come const dunque il suo contenuto non può mutare. il tipo della variabile è definito da typeof( ((type *)0)->member ). in particolare typeof è un'estensione gnu del c che NON è ansi. ritorna il tipo di una variabile. ad esempio se tu crei un puntatore ad un oggetto che può mutare puoi usare typeof per indicare indirettamente il tipo. è un accrocco per fare polimorfismo in c. un esempio banalissimo:

Codice: Seleziona tutto

#define PIPPO_INTERO 1

//una struttura inutile :-)
typedef struct _a_useless_struct {
#ifdef PIPPO_INTERO
    int *puntatore_a_una_variabile_inutile;
#else
    double *puntatore_a_una_variabile_inutile;
#endif
} a_useless_struct;

//punto alla variabile della struttura fregandomene del define
a_useless_struct pandora;
const typeof(pandora.puntatore_a_una_variabile_inutile) puntatore_costante_taldeitali;
automaticamente puntatore_costante_taldeitali assume il tipo di puntatore_a_una_variabile_inutile, indipendentemente da quale esso sia.
un paio di links:
http://docs.freebsd.org/info/gcc/gcc.info.Typeof.html
http://modal-echoes.blogspot.com/2007/0 ... -in-c.html

M

Re: container_of

Inviato: mar 20 mag 2008, 9:12
da afterjames
Ok..Ma quel ((type*)0) cosa significa?E il successivo offsetof?

Re: container_of

Inviato: mar 20 mag 2008, 11:08
da afterjames
Ok, forse dovrei aver capito.Volevo fare qualche prova sfruttando le macro del kernel contenute in list.h, ma non riesco ad includere questo file!Sulla mia macchina il path completo è /usr/src/linux/include/linux/list.h, ma se lo specifico ottengo un warning del tipo:

Codice: Seleziona tutto

 #warning "don't include kernel headers in userspace"
e una serie d'errori dovuti al non reperimento delle macro da me utilizzate.

Re: container_of

Inviato: mer 21 mag 2008, 9:58
da absinthe
mmm... il warning significa che non è bene usare gli headers con le funzioni interne del kernel per fare un progetto userspace. per gli errori andrebbero visti, così su due piedi non saprei...

M

Re: container_of

Inviato: mer 21 mag 2008, 14:22
da Mario Vanoni
afterjames ha scritto:

Codice: Seleziona tutto

 #warning "don't include kernel headers in userspace"
Mai, ripeto _mai_ usarli, sono privati ad uso esclusivo del kernel.

- li usi, il tuo progamma funziona
- la prossima versione del kernel, 50% che va, 50 % che non va piu`
- due o piu` kernel successivi, dimentica il tuo programma