Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
ccan
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mirror
ccan
Commits
1e7eb5df
Commit
1e7eb5df
authored
Dec 28, 2007
by
Rusty Russell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New variant of container_of: container_of_var, for list.h
parent
9c468dc3
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
56 additions
and
1 deletion
+56
-1
container_of/container_of.h
container_of/container_of.h
+30
-0
container_of/test/compile_fail-bad-type.c
container_of/test/compile_fail-bad-type.c
+1
-0
container_of/test/compile_fail-types.c
container_of/test/compile_fail-types.c
+1
-0
container_of/test/compile_fail-var-types.c
container_of/test/compile_fail-var-types.c
+21
-0
container_of/test/run.c
container_of/test/run.c
+3
-1
No files found.
container_of/container_of.h
View file @
1e7eb5df
...
@@ -32,4 +32,34 @@
...
@@ -32,4 +32,34 @@
- check_types_match(*(member_ptr), ((containing_type *)0)->member))
- check_types_match(*(member_ptr), ((containing_type *)0)->member))
/**
* container_of_var - get pointer to enclosing structure using a variable
* @member_ptr: pointer to the structure member
* @var: a pointer to a structure of same type as this member is within
* @member: the name of this member within the structure.
*
* Given a pointer to a member of a structure, this macro does pointer
* subtraction to return the pointer to the enclosing type.
*
* Example:
* struct info
* {
* int some_other_field;
* struct foo my_foo;
* };
*
* struct info *foo_to_info(struct foo *foop)
* {
* struct info *i = container_of_var(foo, i, my_foo);
* return i;
* }
*/
#ifdef HAVE_TYPEOF
#define container_of_var(member_ptr, var, member) \
container_of(member_ptr, typeof(*var), member)
#else
#define container_of_var(member_ptr, var, member) \
((void *)((char *)(member_ptr) - offsetof(containing_type, member)))
#endif
#endif
/* CCAN_CONTAINER_OF_H */
#endif
/* CCAN_CONTAINER_OF_H */
container_of/test/compile_fail-bad-type.c
View file @
1e7eb5df
...
@@ -13,6 +13,7 @@ int main(int argc, char *argv[])
...
@@ -13,6 +13,7 @@ int main(int argc, char *argv[])
char
*
p
;
char
*
p
;
#ifdef FAIL
#ifdef FAIL
/* p is a char *, but this gives a struct foo * */
p
=
container_of
(
intp
,
struct
foo
,
a
);
p
=
container_of
(
intp
,
struct
foo
,
a
);
#else
#else
p
=
(
char
*
)
intp
;
p
=
(
char
*
)
intp
;
...
...
container_of/test/compile_fail-types.c
View file @
1e7eb5df
...
@@ -12,6 +12,7 @@ int main(int argc, char *argv[])
...
@@ -12,6 +12,7 @@ int main(int argc, char *argv[])
int
*
intp
=
&
foo
.
a
;
int
*
intp
=
&
foo
.
a
;
#ifdef FAIL
#ifdef FAIL
/* b is a char, but intp is an int * */
foop
=
container_of
(
intp
,
struct
foo
,
b
);
foop
=
container_of
(
intp
,
struct
foo
,
b
);
#else
#else
foop
=
NULL
;
foop
=
NULL
;
...
...
container_of/test/compile_fail-var-types.c
0 → 100644
View file @
1e7eb5df
#include "container_of/container_of.h"
#include <stdlib.h>
struct
foo
{
int
a
;
char
b
;
};
int
main
(
int
argc
,
char
*
argv
[])
{
struct
foo
foo
=
{
.
a
=
1
,
.
b
=
2
},
*
foop
;
int
*
intp
=
&
foo
.
a
;
#ifdef FAIL
/* b is a char, but intp is an int * */
foop
=
container_of_var
(
intp
,
foop
,
b
);
#else
foop
=
NULL
;
#endif
return
intp
==
NULL
;
}
container_of/test/run.c
View file @
1e7eb5df
...
@@ -12,8 +12,10 @@ int main(int argc, char *argv[])
...
@@ -12,8 +12,10 @@ int main(int argc, char *argv[])
int
*
intp
=
&
foo
.
a
;
int
*
intp
=
&
foo
.
a
;
char
*
charp
=
&
foo
.
b
;
char
*
charp
=
&
foo
.
b
;
plan_tests
(
2
);
plan_tests
(
4
);
ok1
(
container_of
(
intp
,
struct
foo
,
a
)
==
&
foo
);
ok1
(
container_of
(
intp
,
struct
foo
,
a
)
==
&
foo
);
ok1
(
container_of
(
charp
,
struct
foo
,
b
)
==
&
foo
);
ok1
(
container_of
(
charp
,
struct
foo
,
b
)
==
&
foo
);
ok1
(
container_of_var
(
intp
,
&
foo
,
a
)
==
&
foo
);
ok1
(
container_of_var
(
charp
,
&
foo
,
b
)
==
&
foo
);
return
exit_status
();
return
exit_status
();
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment