Repository 32bit  Forum
Repository 64bit  Wiki

container_of

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 16: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 15:14

Re: container_of

Messaggioda absinthe » mar mag 20, 2008 8: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: dom mag 15, 2005 0: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 9: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 15:14

Re: container_of

Messaggioda afterjames » mar mag 20, 2008 11: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 15:14

Re: container_of

Messaggioda absinthe » mer mag 21, 2008 9: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: dom mag 15, 2005 0: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 14: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 21: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 1 ospite