Repository 32bit  Forum
Repository 64bit  Wiki

container_of

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

container_of

Messaggioda afterjames » lun mag 19, 2008 15:52

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?
afterjames
Linux 1.0
Linux 1.0
 
Messaggi: 64
Iscritto il: lun gen 14, 2008 14:14

Re: container_of

Messaggioda absinthe » mar mag 20, 2008 7:26

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
Avatar utente
absinthe
Iper Master
Iper Master
 
Messaggi: 2354
Iscritto il: sab mag 14, 2005 23:00
Località: Prato
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze

Re: container_of

Messaggioda afterjames » mar mag 20, 2008 8:12

Ok..Ma quel ((type*)0) cosa significa?E il successivo offsetof?
afterjames
Linux 1.0
Linux 1.0
 
Messaggi: 64
Iscritto il: lun gen 14, 2008 14:14

Re: container_of

Messaggioda afterjames » mar mag 20, 2008 10:08

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.
afterjames
Linux 1.0
Linux 1.0
 
Messaggi: 64
Iscritto il: lun gen 14, 2008 14:14

Re: container_of

Messaggioda absinthe » mer mag 21, 2008 8:58

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
Avatar utente
absinthe
Iper Master
Iper Master
 
Messaggi: 2354
Iscritto il: sab mag 14, 2005 23:00
Località: Prato
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze

Re: container_of

Messaggioda Mario Vanoni » mer mag 21, 2008 13:22

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti