Re: question about linked list implementation in kernel.h

2010-09-14 Thread Bond
On Tue, Sep 14, 2010 at 1:27 AM, Jan Ceuleers wrote:

> On 11/09/10 17:49, Bond wrote:
>
>> (type *)( (char *)__mptr - offsetof(type,member) );})
>>
>> there a subtraction has been done why is this subtraction done?
>>
>
> Not having read any of the documentation, what comes to mind is this:
>
> if __mptr is a pointer to the member of a structure, the above expression
> returns a pointer to the first byte of the containing structure, typecast to
> the type of the structure.
>
> Example:
>
> typedef struct {
>int a;
>char b;
> } test_t;
>
> test_t test;
>
> Now assume that __mptr is a pointer to test.b, then the above expression
> returns a pointer to test, i.e. a pointer to the structure that b is a
> member of.
>
> Jan
>
> Hi,
Jan no problem I am clear with the original question that I had asked with
Manohar.


Re: question about linked list implementation in kernel.h

2010-09-13 Thread Jan Ceuleers

On 11/09/10 17:49, Bond wrote:

(type *)( (char *)__mptr - offsetof(type,member) );})

there a subtraction has been done why is this subtraction done?


Not having read any of the documentation, what comes to mind is this:

if __mptr is a pointer to the member of a structure, the above 
expression returns a pointer to the first byte of the containing 
structure, typecast to the type of the structure.


Example:

typedef struct {
int a;
char b;
} test_t;

test_t test;

Now assume that __mptr is a pointer to test.b, then the above expression 
returns a pointer to test, i.e. a pointer to the structure that b is a 
member of.


Jan

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ



Re: question about linked list implementation in kernel.h

2010-09-12 Thread Bond
On Sat, Sep 11, 2010 at 10:09 PM, Manish Katiyar  wrote:

> If you want some more details about this macro.
> http://www.spinics.net/lists/linux-usb-devel/msg11766.html
>
> Thanks but Manohars explanation was perfect for newbies like me.


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Manish Katiyar
On Sat, Sep 11, 2010 at 5:33 AM, Bond  wrote:
> I read
> I was going through include/linux/kernel.h
> encountered following code
>
> #define container_of(ptr, type, member) ({  \
>     const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
>
> in above code I am not clear with (type *)0

If you want some more details about this macro.
http://www.spinics.net/lists/linux-usb-devel/msg11766.html


> how is it working any link?
>



-- 
Thanks -
Manish
==
[$\*.^ -- I miss being one of them
==

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ



Re: question about linked list implementation in kernel.h

2010-09-11 Thread Manohar Vanga
Hey Mohit,

This is a feature of GCC (I don't know if it is a part of the standard).
Here's the link from the GCC manual:
http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Statement-Exprs.html#Statement-Exprs

On Sat, Sep 11, 2010 at 9:49 PM, mohit verma  wrote:

> thanks a lot  manohar ,
>  but please can u elaborate  on
>
>
> int val = ({5 + 5;});
> printf("Block value: %d\n", val);
>
> i mean we can set  val =( 5+5) or val=5+5
> then what is the need of all this ({5+5;""});
>  the quotes i gave ,i dint get that place completely.
>
>


-- 
/manohar


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Bond
On Sat, Sep 11, 2010 at 9:15 PM, Manohar Vanga wrote:

> I just made a small example (with comments) to play around with :-)
> Let me know if you feel something is wrong in my explanations (I'm still
> learning as well!)
> Hope it helps!
>
> Manohar I just happen to understand great great work man.It is clear
completely.
Awesome explanation I am copy pasting from the file you gave I hope you
don't mind.

#include 
#include 

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

/*
 * The first line gets the type of the member inside the structure. It does
 * this by casting a NULL pointer to the structure type and using the GCC
 * typeof() extension.
 *
 * The second line evaluates to a value of the address of the containing
 * structure. This is done using the value of the member pointer and
 * subtracting the offset of the member from its own address.
 *
 * eg. if a member is at address 10 and is at an offset of 4 bytes into
 * the struture, the containing structure's pointer is at address (10 - 4) =
6
 */
#define container_of(ptr, type, member) ({  \
const typeof( ((type *)0)->member ) *__mptr = (ptr);\
(type *)( (char *)__mptr - offsetof(type,member) );})


struct test {
int a;
};

/*
 * Given the pointer to a member inside a structure, retreive its containing

 * structure pointer
 */
void test_func(int *ptr)
{
/* You can see the output of this macro using: "gcc -E cont.c" */
struct test *container = container_of(ptr, struct test, a);
printf("Retreived pointer: %x\n", (unsigned int)container);
printf("Value: %d\n", container->a);
}

int main()
{
struct test *t = malloc(sizeof(struct test));
t->a = 5;
printf("Structure pointer: %x\n", (unsigned int)t);
printf("Value: %d\n", t->a);
test_func(&t->a);
free(t);


/*
 * This is how a block is evaluated to a value (explains how the macro
 * works. See output from "gcc -E cont.c".
 */
int val = ({5 + 5;});
printf("Block value: %d\n", val);
}


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Carlo Caione

On 11/09/2010 17:45, Manohar Vanga wrote:

I just made a small example (with comments) to play around with :-)
Let me know if you feel something is wrong in my explanations (I'm still
learning as well!)
Hope it helps!


It is correct. Good explanation.

--
Carlo

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ



Re: question about linked list implementation in kernel.h

2010-09-11 Thread Bond
On Sat, Sep 11, 2010 at 9:12 PM, Bond  wrote:

>
>
>
>>
>>
>>
>>
> http://crashcourse.ca/introduction-linux-kernel-programming/intermission-lets-talk-about-linked-lists-and-containerof-free
>
>  Robert

(type *)( (char *)__mptr - offsetof(type,member) );})

there a subtraction has been done why is this subtraction done?

Manohar I am going through your doc.


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Manohar Vanga
I just made a small example (with comments) to play around with :-)
Let me know if you feel something is wrong in my explanations (I'm still
learning as well!)
Hope it helps!

On Sat, Sep 11, 2010 at 6:03 PM, Bond  wrote:

> I read
> I was going through include/linux/kernel.h
> encountered following code
>
> #define container_of(ptr, type, member) ({  \
> const typeof( ((type *)0)->member ) *__mptr = (ptr);\
>
> in above code I am not clear with (type *)0
> how is it working any link?
>



-- 
/manohar
#include 
#include 

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

/*
 * The first line gets the type of the member inside the structure. It does
 * this by casting a NULL pointer to the structure type and using the GCC
 * typeof() extension.
 *
 * The second line evaluates to a value of the address of the containing 
 * structure. This is done using the value of the member pointer and 
 * subtracting the offset of the member from its own address.
 * 
 * eg. if a member is at address 10 and is at an offset of 4 bytes into 
 * the struture, the containing structure's pointer is at address (10 - 4) = 6
 */
#define container_of(ptr, type, member) ({  \
	const typeof( ((type *)0)->member ) *__mptr = (ptr);\
	(type *)( (char *)__mptr - offsetof(type,member) );})


struct test {
	int a;
};

/* 
 * Given the pointer to a member inside a structure, retreive its containing 
 * structure pointer
 */
void test_func(int *ptr)
{
	/* You can see the output of this macro using: "gcc -E cont.c" */
	struct test *container = container_of(ptr, struct test, a);
	printf("Retreived pointer: %x\n", (unsigned int)container);
	printf("Value: %d\n", container->a);
}

int main()
{
	struct test *t = malloc(sizeof(struct test));
	t->a = 5;
	printf("Structure pointer: %x\n", (unsigned int)t);
	printf("Value: %d\n", t->a);
	test_func(&t->a);
	free(t);

	
	/* 
	 * This is how a block is evaluated to a value (explains how the macro 
	 * works. See output from "gcc -E cont.c". 
	 */
	int val = ({5 + 5;});
	printf("Block value: %d\n", val);
}


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Bond
On Sat, Sep 11, 2010 at 8:37 PM, Robert P. J. Day wrote:

>
>   you're making this too difficult -- all container_of() does is,
> given:
>
>  * a structure definition,
>  * the name of a member field within that structure, and
>  * the address of that internal member field in an instance
>
> what you get back is the address of the enclosing structure.
>
>  this allows you to work with member fields of a structure but, when
> you need to, "back up" to the structure they're contained in.  kernel
> linked lists are built on this idea.
>
>
> http://crashcourse.ca/introduction-linux-kernel-programming/intermission-lets-talk-about-linked-lists-and-containerof-free
>
>
> rday
>
> Yeah thanks Robert you saved my day.


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Carlo Caione

On 11/09/2010 16:52, Bond wrote:



On Sat, Sep 11, 2010 at 6:22 PM, Carlo Caione mailto:carlo.cai...@gmail.com>> wrote:


http://www.kroah.com/log/linux/container_of.html

I am not able to understand a single bit of the explanaition on the
above link.
They have assumed I programmed PCI buses which  I have not.


Are you kidding me? That is just an example to show how container_of() 
is used.
Do you think that it is better starting from something simpler than 
kernel programming like for example simple C programming?


--
Carlo

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ



Re: question about linked list implementation in kernel.h

2010-09-11 Thread Robert P. J. Day
On Sat, 11 Sep 2010, Bond wrote:

>
>
> On Sat, Sep 11, 2010 at 6:22 PM, Carlo Caione 
> wrote:
>
> http://www.kroah.com/log/linux/container_of.html
>
> I am not able to understand a single bit of the explanaition on the
> above link. They have assumed I programmed PCI buses which  I have
> not.

  you're making this too difficult -- all container_of() does is,
given:

  * a structure definition,
  * the name of a member field within that structure, and
  * the address of that internal member field in an instance

what you get back is the address of the enclosing structure.

  this allows you to work with member fields of a structure but, when
you need to, "back up" to the structure they're contained in.  kernel
linked lists are built on this idea.

http://crashcourse.ca/introduction-linux-kernel-programming/intermission-lets-talk-about-linked-lists-and-containerof-free


rday

-- 


Robert P. J. Day   Waterloo, Ontario, CANADA

Top-notch, inexpensive online Linux/OSS/kernel courses
http://crashcourse.ca

Twitter:   http://twitter.com/rpjday
LinkedIn:   http://ca.linkedin.com/in/rpjday


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Bond
On Sat, Sep 11, 2010 at 6:22 PM, Carlo Caione wrote:

>
> http://www.kroah.com/log/linux/container_of.html
>
> I am not able to understand a single bit of the explanaition on the above
link.
They have assumed I programmed PCI buses which  I have not.


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Bond
On Sat, Sep 11, 2010 at 6:22 PM, Carlo Caione wrote:

>
> First link on google:
>
Its not that I had not searched it did search but I had searched typedef and
type and I kept reading links related to that only.
What to be searched is not that obvious when some one is not clear.

>
> http://www.kroah.com/log/linux/container_of.html
>
> Any how thanks for link.


Re: question about linked list implementation in kernel.h

2010-09-11 Thread Carlo Caione

On 11/09/2010 14:33, Bond wrote:

I read
I was going through include/linux/kernel.h
encountered following code

#define container_of(ptr, type, member) ({  \
 const typeof( ((type *)0)->member ) *__mptr = (ptr);\

in above code I am not clear with (type *)0
how is it working any link?


First link on google:

http://www.kroah.com/log/linux/container_of.html

--
Carlo


--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ



question about linked list implementation in kernel.h

2010-09-11 Thread Bond
I read
I was going through include/linux/kernel.h
encountered following code

#define container_of(ptr, type, member) ({  \
const typeof( ((type *)0)->member ) *__mptr = (ptr);\

in above code I am not clear with (type *)0
how is it working any link?