* [PATCH 3/5] CodeSamples: Makefile: Remove linux/list.h
2017-06-09 15:22 [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Akira Yokosawa
2017-06-09 15:24 ` [PATCH 1/5] CodeSamples: Remove gprof-helper.c Akira Yokosawa
2017-06-09 15:25 ` [PATCH 2/5] CodeSamples: Use $(MAKE) for recursive make Akira Yokosawa
@ 2017-06-09 15:27 ` Akira Yokosawa
2017-06-09 15:28 ` [PATCH 4/5] CodeSamples: Makefile: Add subdirectories Akira Yokosawa
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Akira Yokosawa @ 2017-06-09 15:27 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: perfbook, Akira Yokosawa
From 19d56c2963ca68952fb593eff967954f26de23bf Mon Sep 17 00:00:00 2001
From: Akira Yokosawa <akiyks@gmail.com>
Date: Wed, 7 Jun 2017 00:00:31 +0900
Subject: [PATCH 3/5] CodeSamples: Makefile: Remove linux/list.h
linux/list.h was used as a fallback when header files of liburcu
was not found. However, current code samples depend on a later
version of liburcu API. Nowadays, liburcu is available for most
Linux distributions as a package (e.g., liburcu-dev for Ubuntu,
liburcu-devel for Fedora).
Remove linux/list.h and its dependency in Makefile rather than
import newer definitions.
While dropping the dependency, merge redundant recipes into a single
recipe by using the variable "target" defined in depend.mk.
Signed-off-by: Akira Yokosawa <akiyks@gmail.com>
---
CodeSamples/Makefile | 107 +-------
CodeSamples/depends.mk | 3 +-
CodeSamples/linux/list.h | 700 -----------------------------------------------
3 files changed, 12 insertions(+), 798 deletions(-)
delete mode 100644 CodeSamples/linux/list.h
diff --git a/CodeSamples/Makefile b/CodeSamples/Makefile
index ec9e9a6..1bfdf08 100644
--- a/CodeSamples/Makefile
+++ b/CodeSamples/Makefile
@@ -1,6 +1,6 @@
subdirs = SMPdesign advsync count defer intro toolsoftrade
-.PHONY: all clean pthreads pthreads-x86 pthreads-ppc64 pthreads-arm
+.PHONY: all clean pthreads
top := .
@@ -15,10 +15,9 @@ include depends.mk
api.h Makefile.arch:
ifeq ($(strip $(target)),)
$(MAKE) pthreads
- $(warning "Could not figure out which target to use (arch:$(arch)).\
- Used 'make pthreads' in CodeSamples/Makefile.")
+ $(warning "Could not figure out which target arch to use (arch:$(arch)).")
else
- $(MAKE) pthreads-$(target)
+ $(MAKE) pthreads
endif
pthreads:
@@ -28,35 +27,10 @@ pthreads:
echo "" >> api.h
cat linux/common.h >> api.h
echo "" >> api.h
- cat api-pthreads/api-pthreads.h >> api.h
- echo "" >> api.h
- if test -f /usr/include/urcu-call-rcu.h -o -f /usr/local/include/urcu-call-rcu.h ; \
- then \
- echo "#define _LGPL_SOURCE" >> api.h; \
- echo "#include <urcu/rculist.h>" >> api.h; \
- echo "#include <urcu/rcuhlist.h>" >> api.h; \
- echo "#include <urcu-pointer.h>" >> api.h; \
- elif test -d /usr/include/urcu -o -d /usr/local/include/urcu ; \
- then \
- echo "#define _LGPL_SOURCE" >> api.h; \
- echo "#include <urcu/rculist.h>" >> api.h; \
- echo "#include <urcu/rcuhlist.h>" >> api.h; \
- echo "#include <urcu-pointer-static.h>" >> api.h; \
- else \
- cat linux/list.h >> api.h; \
- fi
- echo "#endif /* #ifndef __PERFBOOK_API_H__ */" >> api.h
- echo "# MECHANICALLY GENERATED, DO NOT EDIT!!!" > Makefile.arch
-
-pthreads-x86:
- echo "#ifndef __PERFBOOK_API_H__" > api.h
- echo "#define __PERFBOOK_API_H__" >> api.h
- echo "/* MECHANICALLY GENERATED, DO NOT EDIT!!! */" >> api.h
- echo "" >> api.h
- cat linux/common.h >> api.h
- echo "" >> api.h
- cat arch-x86/arch-x86.h >> api.h
+ifneq ($(strip $(target)),)
+ cat arch-$(target)/arch-$(target).h >> api.h
echo "" >> api.h
+endif
cat api-pthreads/api-pthreads.h >> api.h
echo "" >> api.h
cat api-pthreads/api-gcc.h >> api.h
@@ -74,74 +48,15 @@ pthreads-x86:
echo "#include <urcu/rcuhlist.h>" >> api.h; \
echo "#include <urcu-pointer-static.h>" >> api.h; \
else \
- cat linux/list.h >> api.h; \
+ echo "### Missing liburcu package!!! Install it. ###"; \
+ exit 1; \
fi
echo "#endif /* #ifndef __PERFBOOK_API_H__ */" >> api.h
echo "# MECHANICALLY GENERATED, DO NOT EDIT!!!" > Makefile.arch
echo "" >> Makefile.arch
- cat arch-x86/Makefile.arch >> Makefile.arch
-
-pthreads-ppc64:
- echo "#ifndef __PERFBOOK_API_H__" >> api.h
- echo "#define __PERFBOOK_API_H__" >> api.h
- echo "/* MECHANICALLY GENERATED, DO NOT EDIT!!! */" >> api.h
- echo "" >> api.h
- cat linux/common.h >> api.h
- echo "" >> api.h
- cat arch-ppc64/arch-ppc64.h >> api.h
- echo "" >> api.h
- cat api-pthreads/api-pthreads.h >> api.h
- echo "" >> api.h
- cat api-pthreads/api-gcc.h >> api.h
- echo "" >> api.h
- if test -f /usr/include/urcu-call-rcu.h -o -f /usr/local/include/urcu-call-rcu.h ; \
- then \
- echo "#define _LGPL_SOURCE" >> api.h; \
- echo "#include <urcu/rculist.h>" >> api.h; \
- echo "#include <urcu/rcuhlist.h>" >> api.h; \
- echo "#include <urcu-pointer.h>" >> api.h; \
- elif test -d /usr/include/urcu -o -d /usr/local/include/urcu ; \
- then \
- echo "#define _LGPL_SOURCE" >> api.h; \
- echo "#include <urcu/rculist.h>" >> api.h; \
- echo "#include <urcu/rcuhlist.h>" >> api.h; \
- echo "#include <urcu-pointer-static.h>" >> api.h; \
- else \
- cat linux/list.h >> api.h; \
- fi
- echo "#endif /* #ifndef __PERFBOOK_API_H__ */" >> api.h
- echo "# MECHANICALLY GENERATED, DO NOT EDIT!!!" > Makefile.arch
- cat arch-ppc64/Makefile.arch >> Makefile.arch
-
-pthreads-arm:
- echo "#ifndef __PERFBOOK_API_H__" > api.h
- echo "#define __PERFBOOK_API_H__" >> api.h
- echo "/* MECHANICALLY GENERATED, DO NOT EDIT!!! */" >> api.h
- echo "" >> api.h
- cat linux/common.h >> api.h
- echo "" >> api.h
- cat arch-arm/arch-arm.h >> api.h
- echo "" >> api.h
- cat api-pthreads/api-pthreads.h >> api.h
- echo "" >> api.h
- if test -f /usr/include/urcu-call-rcu.h -o -f /usr/local/include/urcu-call-rcu.h ; \
- then \
- echo "#define _LGPL_SOURCE" >> api.h; \
- echo "#include <urcu/rculist.h>" >> api.h; \
- echo "#include <urcu/rcuhlist.h>" >> api.h; \
- echo "#include <urcu-pointer.h>" >> api.h; \
- elif test -d /usr/include/urcu -o -d /usr/local/include/urcu ; \
- then \
- echo "#define _LGPL_SOURCE" >> api.h; \
- echo "#include <urcu/rculist.h>" >> api.h; \
- echo "#include <urcu/rcuhlist.h>" >> api.h; \
- echo "#include <urcu-pointer-static.h>" >> api.h; \
- else \
- cat linux/list.h >> api.h; \
- fi
- echo "#endif /* #ifndef __PERFBOOK_API_H__ */" >> api.h
- echo "# MECHANICALLY GENERATED, DO NOT EDIT!!!" > Makefile.arch
- cat arch-arm/Makefile.arch >> Makefile.arch
+ifneq ($(strip $(target)),)
+ cat arch-$(target)/Makefile.arch >> Makefile.arch
+endif
clean:
rm -f Makefile.arch api.h
diff --git a/CodeSamples/depends.mk b/CodeSamples/depends.mk
index 9d2691b..81f8bec 100644
--- a/CodeSamples/depends.mk
+++ b/CodeSamples/depends.mk
@@ -17,8 +17,7 @@ target :=
endif
api_depend_common := $(top)/linux/common.h \
- $(top)/api-pthreads/api-pthreads.h \
- $(top)/linux/list.h
+ $(top)/api-pthreads/api-pthreads.h
ifeq ($(target),x86)
api_depend := $(top)/arch-x86/arch-x86.h
arch_depend := $(top)/arch-x86/Makefile.arch
diff --git a/CodeSamples/linux/list.h b/CodeSamples/linux/list.h
deleted file mode 100644
index 1db9c61..0000000
--- a/CodeSamples/linux/list.h
+++ /dev/null
@@ -1,700 +0,0 @@
-/* Taken from the Linux kernel source tree, so GPLv2-only!!! */
-
-#ifndef _LINUX_LIST_H
-#define _LINUX_LIST_H
-
-#define LIST_POISON1 ((void *) 0x00100100)
-#define LIST_POISON2 ((void *) 0x00200200)
-
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-#define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
-
-/*
- * Simple doubly linked list implementation.
- *
- * Some of the internal functions ("__xxx") are useful when
- * manipulating whole lists rather than single entries, as
- * sometimes we already know the next/prev entries and we can
- * generate better code by using them directly rather than
- * using the generic single-entry routines.
- */
-
-struct list_head {
- struct list_head *next, *prev;
-};
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
-
-static inline void INIT_LIST_HEAD(struct list_head *list)
-{
- list->next = list;
- list->prev = list;
-}
-
-/*
- * Insert a new entry between two known consecutive entries.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-#ifndef CONFIG_DEBUG_LIST
-static inline void __list_add(struct list_head *new,
- struct list_head *prev,
- struct list_head *next)
-{
- next->prev = new;
- new->next = next;
- new->prev = prev;
- prev->next = new;
-}
-#else
-extern void __list_add(struct list_head *new,
- struct list_head *prev,
- struct list_head *next);
-#endif
-
-/**
- * list_add - add a new entry
- * @new: new entry to be added
- * @head: list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-static inline void list_add(struct list_head *new, struct list_head *head)
-{
- __list_add(new, head, head->next);
-}
-
-
-/**
- * list_add_tail - add a new entry
- * @new: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-static inline void list_add_tail(struct list_head *new, struct list_head *head)
-{
- __list_add(new, head->prev, head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void __list_del(struct list_head * prev, struct list_head * next)
-{
- next->prev = prev;
- prev->next = next;
-}
-
-/**
- * list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- * Note: list_empty() on entry does not return true after this, the entry is
- * in an undefined state.
- */
-#ifndef CONFIG_DEBUG_LIST
-static inline void list_del(struct list_head *entry)
-{
- __list_del(entry->prev, entry->next);
- entry->next = LIST_POISON1;
- entry->prev = LIST_POISON2;
-}
-#else
-extern void list_del(struct list_head *entry);
-#endif
-
-/**
- * list_replace - replace old entry by new one
- * @old : the element to be replaced
- * @new : the new element to insert
- *
- * If @old was empty, it will be overwritten.
- */
-static inline void list_replace(struct list_head *old,
- struct list_head *new)
-{
- new->next = old->next;
- new->next->prev = new;
- new->prev = old->prev;
- new->prev->next = new;
-}
-
-static inline void list_replace_init(struct list_head *old,
- struct list_head *new)
-{
- list_replace(old, new);
- INIT_LIST_HEAD(old);
-}
-
-/**
- * list_del_init - deletes entry from list and reinitialize it.
- * @entry: the element to delete from the list.
- */
-static inline void list_del_init(struct list_head *entry)
-{
- __list_del(entry->prev, entry->next);
- INIT_LIST_HEAD(entry);
-}
-
-/**
- * list_move - delete from one list and add as another's head
- * @list: the entry to move
- * @head: the head that will precede our entry
- */
-static inline void list_move(struct list_head *list, struct list_head *head)
-{
- __list_del(list->prev, list->next);
- list_add(list, head);
-}
-
-/**
- * list_move_tail - delete from one list and add as another's tail
- * @list: the entry to move
- * @head: the head that will follow our entry
- */
-static inline void list_move_tail(struct list_head *list,
- struct list_head *head)
-{
- __list_del(list->prev, list->next);
- list_add_tail(list, head);
-}
-
-/**
- * list_is_last - tests whether @list is the last entry in list @head
- * @list: the entry to test
- * @head: the head of the list
- */
-static inline int list_is_last(const struct list_head *list,
- const struct list_head *head)
-{
- return list->next == head;
-}
-
-/**
- * list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-static inline int list_empty(const struct list_head *head)
-{
- return head->next == head;
-}
-
-/**
- * list_empty_careful - tests whether a list is empty and not being modified
- * @head: the list to test
- *
- * Description:
- * tests whether a list is empty _and_ checks that no other CPU might be
- * in the process of modifying either member (next or prev)
- *
- * NOTE: using list_empty_careful() without synchronization
- * can only be safe if the only activity that can happen
- * to the list entry is list_del_init(). Eg. it cannot be used
- * if another CPU could re-list_add() it.
- */
-static inline int list_empty_careful(const struct list_head *head)
-{
- struct list_head *next = head->next;
- return (next == head) && (next == head->prev);
-}
-
-/**
- * list_is_singular - tests whether a list has just one entry.
- * @head: the list to test.
- */
-static inline int list_is_singular(const struct list_head *head)
-{
- return !list_empty(head) && (head->next == head->prev);
-}
-
-static inline void __list_cut_position(struct list_head *list,
- struct list_head *head, struct list_head *entry)
-{
- struct list_head *new_first = entry->next;
- list->next = head->next;
- list->next->prev = list;
- list->prev = entry;
- entry->next = list;
- head->next = new_first;
- new_first->prev = head;
-}
-
-/**
- * list_cut_position - cut a list into two
- * @list: a new list to add all removed entries
- * @head: a list with entries
- * @entry: an entry within head, could be the head itself
- * and if so we won't cut the list
- *
- * This helper moves the initial part of @head, up to and
- * including @entry, from @head to @list. You should
- * pass on @entry an element you know is on @head. @list
- * should be an empty list or a list you do not care about
- * losing its data.
- *
- */
-static inline void list_cut_position(struct list_head *list,
- struct list_head *head, struct list_head *entry)
-{
- if (list_empty(head))
- return;
- if (list_is_singular(head) &&
- (head->next != entry && head != entry))
- return;
- if (entry == head)
- INIT_LIST_HEAD(list);
- else
- __list_cut_position(list, head, entry);
-}
-
-static inline void __list_splice(const struct list_head *list,
- struct list_head *prev,
- struct list_head *next)
-{
- struct list_head *first = list->next;
- struct list_head *last = list->prev;
-
- first->prev = prev;
- prev->next = first;
-
- last->next = next;
- next->prev = last;
-}
-
-/**
- * list_splice - join two lists, this is designed for stacks
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void list_splice(const struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list))
- __list_splice(list, head, head->next);
-}
-
-/**
- * list_splice_tail - join two lists, each list being a queue
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void list_splice_tail(struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list))
- __list_splice(list, head->prev, head);
-}
-
-/**
- * list_splice_init - join two lists and reinitialise the emptied list.
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * The list at @list is reinitialised
- */
-static inline void list_splice_init(struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list)) {
- __list_splice(list, head, head->next);
- INIT_LIST_HEAD(list);
- }
-}
-
-/**
- * list_splice_tail_init - join two lists and reinitialise the emptied list
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * Each of the lists is a queue.
- * The list at @list is reinitialised
- */
-static inline void list_splice_tail_init(struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list)) {
- __list_splice(list, head->prev, head);
- INIT_LIST_HEAD(list);
- }
-}
-
-/**
- * list_entry - get the struct for this entry
- * @ptr: the &struct list_head pointer.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_struct within the struct.
- */
-#define list_entry(ptr, type, member) \
- container_of(ptr, type, member)
-
-/**
- * list_first_entry - get the first element from a list
- * @ptr: the list head to take the element from.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_struct within the struct.
- *
- * Note, that list is expected to be not empty.
- */
-#define list_first_entry(ptr, type, member) \
- list_entry((ptr)->next, type, member)
-
-/**
- * list_for_each - iterate over a list
- * @pos: the &struct list_head to use as a loop cursor.
- * @head: the head for your list.
- */
-#define list_for_each(pos, head) \
- for (pos = (head)->next; prefetch(pos->next), pos != (head); \
- pos = pos->next)
-
-/**
- * __list_for_each - iterate over a list
- * @pos: the &struct list_head to use as a loop cursor.
- * @head: the head for your list.
- *
- * This variant differs from list_for_each() in that it's the
- * simplest possible list iteration code, no prefetching is done.
- * Use this for code that knows the list to be very short (empty
- * or 1 entry) most of the time.
- */
-#define __list_for_each(pos, head) \
- for (pos = (head)->next; pos != (head); pos = pos->next)
-
-/**
- * list_for_each_prev - iterate over a list backwards
- * @pos: the &struct list_head to use as a loop cursor.
- * @head: the head for your list.
- */
-#define list_for_each_prev(pos, head) \
- for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
- pos = pos->prev)
-
-/**
- * list_for_each_safe - iterate over a list safe against removal of list entry
- * @pos: the &struct list_head to use as a loop cursor.
- * @n: another &struct list_head to use as temporary storage
- * @head: the head for your list.
- */
-#define list_for_each_safe(pos, n, head) \
- for (pos = (head)->next, n = pos->next; pos != (head); \
- pos = n, n = pos->next)
-
-/**
- * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
- * @pos: the &struct list_head to use as a loop cursor.
- * @n: another &struct list_head to use as temporary storage
- * @head: the head for your list.
- */
-#define list_for_each_prev_safe(pos, n, head) \
- for (pos = (head)->prev, n = pos->prev; \
- prefetch(pos->prev), pos != (head); \
- pos = n, n = pos->prev)
-
-/**
- * list_for_each_entry - iterate over list of given type
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- */
-#define list_for_each_entry(pos, head, member) \
- for (pos = list_entry((head)->next, typeof(*pos), member); \
- prefetch(pos->member.next), &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_reverse - iterate backwards over list of given type.
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- */
-#define list_for_each_entry_reverse(pos, head, member) \
- for (pos = list_entry((head)->prev, typeof(*pos), member); \
- prefetch(pos->member.prev), &pos->member != (head); \
- pos = list_entry(pos->member.prev, typeof(*pos), member))
-
-/**
- * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
- * @pos: the type * to use as a start point
- * @head: the head of the list
- * @member: the name of the list_struct within the struct.
- *
- * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
- */
-#define list_prepare_entry(pos, head, member) \
- ((pos) ? : list_entry(head, typeof(*pos), member))
-
-/**
- * list_for_each_entry_continue - continue iteration over list of given type
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- *
- * Continue to iterate over list of given type, continuing after
- * the current position.
- */
-#define list_for_each_entry_continue(pos, head, member) \
- for (pos = list_entry(pos->member.next, typeof(*pos), member); \
- prefetch(pos->member.next), &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_continue_reverse - iterate backwards from the given point
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- *
- * Start to iterate over list of given type backwards, continuing after
- * the current position.
- */
-#define list_for_each_entry_continue_reverse(pos, head, member) \
- for (pos = list_entry(pos->member.prev, typeof(*pos), member); \
- prefetch(pos->member.prev), &pos->member != (head); \
- pos = list_entry(pos->member.prev, typeof(*pos), member))
-
-/**
- * list_for_each_entry_from - iterate over list of given type from the current point
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- *
- * Iterate over list of given type, continuing from current position.
- */
-#define list_for_each_entry_from(pos, head, member) \
- for (; prefetch(pos->member.next), &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- */
-#define list_for_each_entry_safe(pos, n, head, member) \
- for (pos = list_entry((head)->next, typeof(*pos), member), \
- n = list_entry(pos->member.next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_safe_continue
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- *
- * Iterate over list of given type, continuing after current point,
- * safe against removal of list entry.
- */
-#define list_for_each_entry_safe_continue(pos, n, head, member) \
- for (pos = list_entry(pos->member.next, typeof(*pos), member), \
- n = list_entry(pos->member.next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_safe_from
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- *
- * Iterate over list of given type from current point, safe against
- * removal of list entry.
- */
-#define list_for_each_entry_safe_from(pos, n, head, member) \
- for (n = list_entry(pos->member.next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_safe_reverse
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_struct within the struct.
- *
- * Iterate backwards over list of given type, safe against removal
- * of list entry.
- */
-#define list_for_each_entry_safe_reverse(pos, n, head, member) \
- for (pos = list_entry((head)->prev, typeof(*pos), member), \
- n = list_entry(pos->member.prev, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.prev, typeof(*n), member))
-
-/*
- * Double linked lists with a single pointer list head.
- * Mostly useful for hash tables where the two pointer list head is
- * too wasteful.
- * You lose the ability to access the tail in O(1).
- */
-
-struct hlist_head {
- struct hlist_node *first;
-};
-
-struct hlist_node {
- struct hlist_node *next, **pprev;
-};
-
-#define HLIST_HEAD_INIT { .first = NULL }
-#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
-#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
-static inline void INIT_HLIST_NODE(struct hlist_node *h)
-{
- h->next = NULL;
- h->pprev = NULL;
-}
-
-static inline int hlist_unhashed(const struct hlist_node *h)
-{
- return !h->pprev;
-}
-
-static inline int hlist_empty(const struct hlist_head *h)
-{
- return !h->first;
-}
-
-static inline void __hlist_del(struct hlist_node *n)
-{
- struct hlist_node *next = n->next;
- struct hlist_node **pprev = n->pprev;
- *pprev = next;
- if (next)
- next->pprev = pprev;
-}
-
-static inline void hlist_del(struct hlist_node *n)
-{
- __hlist_del(n);
- n->next = LIST_POISON1;
- n->pprev = LIST_POISON2;
-}
-
-static inline void hlist_del_init(struct hlist_node *n)
-{
- if (!hlist_unhashed(n)) {
- __hlist_del(n);
- INIT_HLIST_NODE(n);
- }
-}
-
-static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
-{
- struct hlist_node *first = h->first;
- n->next = first;
- if (first)
- first->pprev = &n->next;
- h->first = n;
- n->pprev = &h->first;
-}
-
-/* next must be != NULL */
-static inline void hlist_add_before(struct hlist_node *n,
- struct hlist_node *next)
-{
- n->pprev = next->pprev;
- n->next = next;
- next->pprev = &n->next;
- *(n->pprev) = n;
-}
-
-static inline void hlist_add_after(struct hlist_node *n,
- struct hlist_node *next)
-{
- next->next = n->next;
- n->next = next;
- next->pprev = &n->next;
-
- if(next->next)
- next->next->pprev = &next->next;
-}
-
-/*
- * Move a list from one list head to another. Fixup the pprev
- * reference of the first entry if it exists.
- */
-static inline void hlist_move_list(struct hlist_head *old,
- struct hlist_head *new)
-{
- new->first = old->first;
- if (new->first)
- new->first->pprev = &new->first;
- old->first = NULL;
-}
-
-#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
-
-#define hlist_for_each(pos, head) \
- for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
- pos = pos->next)
-
-#define hlist_for_each_safe(pos, n, head) \
- for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
- pos = n)
-
-/**
- * hlist_for_each_entry - iterate over list of given type
- * @tpos: the type * to use as a loop cursor.
- * @pos: the &struct hlist_node to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry(tpos, pos, head, member) \
- for (pos = (head)->first; \
- pos && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
-
-/**
- * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
- * @tpos: the type * to use as a loop cursor.
- * @pos: the &struct hlist_node to use as a loop cursor.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_continue(tpos, pos, member) \
- for (pos = (pos)->next; \
- pos && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
-
-/**
- * hlist_for_each_entry_from - iterate over a hlist continuing from current point
- * @tpos: the type * to use as a loop cursor.
- * @pos: the &struct hlist_node to use as a loop cursor.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_from(tpos, pos, member) \
- for (; pos && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
-
-/**
- * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @tpos: the type * to use as a loop cursor.
- * @pos: the &struct hlist_node to use as a loop cursor.
- * @n: another &struct hlist_node to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \
- for (pos = (head)->first; \
- pos && ({ n = pos->next; 1; }) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = n)
-
-#endif
--
2.7.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 5/5] CodeSamples: Makefile: Distinguish arch-independent targets
2017-06-09 15:22 [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Akira Yokosawa
` (3 preceding siblings ...)
2017-06-09 15:28 ` [PATCH 4/5] CodeSamples: Makefile: Add subdirectories Akira Yokosawa
@ 2017-06-09 15:30 ` Akira Yokosawa
2017-06-09 22:21 ` [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Paul E. McKenney
5 siblings, 0 replies; 7+ messages in thread
From: Akira Yokosawa @ 2017-06-09 15:30 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: perfbook, Akira Yokosawa
From b31141981b13d40fbbe5d20fa339d714ecba084c Mon Sep 17 00:00:00 2001
From: Akira Yokosawa <akiyks@gmail.com>
Date: Fri, 9 Jun 2017 19:18:40 +0900
Subject: [PATCH 5/5] CodeSamples: Makefile: Distinguish arch-independent targets
On hosts of unsupported architecture, generated api.h does not
contain architecture-specific definitions. This will result in
build errors.
There are quite a few code samples which can be built with such
api.h. So, this patch distinguishes architecture-independent targets
in Makefiles and let those targets be built.
Signed-off-by: Akira Yokosawa <akiyks@gmail.com>
---
CodeSamples/Makefile | 3 ++-
CodeSamples/SMPdesign/Makefile | 19 ++++++++++++++-----
CodeSamples/advsync/Makefile | 11 +++++++++--
CodeSamples/count/Makefile | 11 +++++++++--
CodeSamples/datastruct/Issaquah/Makefile | 11 +++++++++--
CodeSamples/datastruct/hash/Makefile | 11 +++++++++--
CodeSamples/datastruct/log/Makefile | 11 +++++++++--
CodeSamples/datastruct/skiplist/Makefile | 11 +++++++++--
CodeSamples/defer/Makefile | 18 ++++++++++++++----
CodeSamples/depends.mk | 11 -----------
CodeSamples/intro/Makefile | 15 ++++++++++++---
CodeSamples/locking/Makefile | 15 ++++++++++++---
CodeSamples/recipes.mk | 10 ++++++++++
CodeSamples/toolsoftrade/Makefile | 1 +
14 files changed, 119 insertions(+), 39 deletions(-)
create mode 100644 CodeSamples/recipes.mk
diff --git a/CodeSamples/Makefile b/CodeSamples/Makefile
index cef6927..6b2c3c9 100644
--- a/CodeSamples/Makefile
+++ b/CodeSamples/Makefile
@@ -4,6 +4,7 @@ subdirs += datastruct/Issaquah datastruct/hash datastruct/log datastruct/skiplis
.PHONY: all clean pthreads
top := .
+include depends.mk
all:
for d in $(subdirs); \
@@ -11,7 +12,7 @@ all:
$(MAKE) -C $$d; \
done
-include depends.mk
+include recipes.mk
api.h Makefile.arch:
ifeq ($(strip $(target)),)
diff --git a/CodeSamples/SMPdesign/Makefile b/CodeSamples/SMPdesign/Makefile
index d03575c..b1e5fc8 100644
--- a/CodeSamples/SMPdesign/Makefile
+++ b/CodeSamples/SMPdesign/Makefile
@@ -14,20 +14,29 @@
#
# Copyright (c) 2008 Paul E. McKenney, IBM Corporation.
-PROGS = smpalloc lockdeq lockhdeq locktdeq lockrwdeq matmul matmul_block
+ARCH_INDEPENDENT = smpalloc
+ARCH_DEPENDENT = lockdeq lockhdeq locktdeq lockrwdeq matmul matmul_block
+PROGS = $(ARCH_DEPENDENT) $(ARCH_INDEPENDENT)
+include ../Makefile.arch
+
+top := ..
+include $(top)/depends.mk
+
+ifeq ($(strip $(target)),)
+all: $(ARCH_INDEPENDENT)
+ @echo "### $(ARCH_DEPENDENT) in SMPdesign/ can't be built on arch: '$(arch)'."
+else
all: $(PROGS)
+endif
-include ../Makefile.arch
+include $(top)/recipes.mk
# GCC_ARGS=-g -O3
# http://www.ibm.com/developerworks/wikis/display/hpccentral/Tuning+options+to+consider+with+gcc#Tuningoptionstoconsiderwithgcc-mcpuandmtune
# GCC_ARGS=-g -O3 -m64 -mcpu=power5 -mtune=power5
-top := ..
-include $(top)/depends.mk
-
smpalloc: smpalloc.c ../api.h
cc $(GCC_ARGS) -g -o smpalloc -DTEST smpalloc.c -lpthread
diff --git a/CodeSamples/advsync/Makefile b/CodeSamples/advsync/Makefile
index bb4c8fc..f2e0db3 100644
--- a/CodeSamples/advsync/Makefile
+++ b/CodeSamples/advsync/Makefile
@@ -18,11 +18,18 @@ include ../Makefile.arch
PROGS = q singleq wfenqueue
-all: $(PROGS)
-
top := ..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all:
+ @echo "### None in advsync/ can be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
q: q.c q.h queuetorture.h ../api.h
cc $(GCC_ARGS) -o q -DTEST q.c -lpthread
diff --git a/CodeSamples/count/Makefile b/CodeSamples/count/Makefile
index d3fbb83..eacdb57 100644
--- a/CodeSamples/count/Makefile
+++ b/CodeSamples/count/Makefile
@@ -33,11 +33,18 @@ PROGS = count_atomic \
RCU_SRCS = ../defer/rcu_nest32.h ../defer/rcu_nest32.c
-all: $(PROGS)
-
top := ..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all:
+ @echo "### None in count/ can be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
count_atomic: count_atomic.c ../api.h counttorture.h
cc $(GCC_ARGS) $(CFLAGS) -o count_atomic count_atomic.c -lpthread
diff --git a/CodeSamples/datastruct/Issaquah/Makefile b/CodeSamples/datastruct/Issaquah/Makefile
index bb3d6a3..b5b63e1 100644
--- a/CodeSamples/datastruct/Issaquah/Makefile
+++ b/CodeSamples/datastruct/Issaquah/Makefile
@@ -19,11 +19,18 @@ include ../../Makefile.arch
PROGS = existence_test treetorture
LIB = ../../lib
-all: $(PROGS)
-
top := ../..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all:
+ @echo "### None in datastruct/Issaquah/ can be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
# NOTE: For decent scalability on update-side tests as of early 2015,
# use something like jemalloc() instead of glibc malloc().
# If you install jemalloc at /home/paulmck/jemalloc, you will
diff --git a/CodeSamples/datastruct/hash/Makefile b/CodeSamples/datastruct/hash/Makefile
index 85dfa5d..d75936f 100644
--- a/CodeSamples/datastruct/hash/Makefile
+++ b/CodeSamples/datastruct/hash/Makefile
@@ -18,11 +18,18 @@ include ../../Makefile.arch
PROGS = hash_bkt hash_bkt_hazptr hash_bkt_rcu hash_global hash_resize
-all: $(PROGS)
-
top := ../..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all:
+ @echo "### None in datastruct/hash/ can be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
hash_bkt: hash_bkt.c ../../api.h hashtorture.h
cc $(GCC_ARGS) -DTEST_HASH -o hash_bkt hash_bkt.c -lpthread
diff --git a/CodeSamples/datastruct/log/Makefile b/CodeSamples/datastruct/log/Makefile
index cd2c571..b45a162 100644
--- a/CodeSamples/datastruct/log/Makefile
+++ b/CodeSamples/datastruct/log/Makefile
@@ -19,11 +19,18 @@ include ../../Makefile.arch
PROGS = log_glock
LIB = ../../lib
-all: $(PROGS)
-
top := ../..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all:
+ @echo "### None in datastruct/log/ can be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
log_glock: log_glock.c ../../api.h logtorture.h log.h
cc $(GCC_ARGS) -DTEST_LOG -I $(LIB) -g -o log_glock log_glock.c $(LIB)/random.c -lpthread
diff --git a/CodeSamples/datastruct/skiplist/Makefile b/CodeSamples/datastruct/skiplist/Makefile
index ab6f524..9044b9c 100644
--- a/CodeSamples/datastruct/skiplist/Makefile
+++ b/CodeSamples/datastruct/skiplist/Makefile
@@ -19,11 +19,18 @@ include ../../Makefile.arch
PROGS = skiplist skiplist_glock
LIB = ../../lib
-all: $(PROGS)
-
top := ../..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all:
+ @echo "### None in datastruct/skiplist/ can be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
skiplist: skiplist.c ../../api.h skiplisttorture.h skiplist.h
cc $(GCC_ARGS) -DTEST_SKIPLIST -I $(LIB) -g -o skiplist skiplist.c $(LIB)/random.c -lpthread -lurcu -lurcu-signal
diff --git a/CodeSamples/defer/Makefile b/CodeSamples/defer/Makefile
index 5e0f1e7..5a08c1f 100644
--- a/CodeSamples/defer/Makefile
+++ b/CodeSamples/defer/Makefile
@@ -16,11 +16,12 @@
include ../Makefile.arch
-PROGS = bug_rcu_dp \
- gettimestamp \
+ARCH_INDEPENDENT = bug_rcu_dp \
+ ptxroute
+
+ARCH_DEPENDENT = gettimestamp \
gettimestampmp \
hazptr \
- ptxroute \
rcu \
rcu64 \
rcu64_atomicgp \
@@ -44,11 +45,20 @@ PROGS = bug_rcu_dp \
route_seqlock \
seqlocktorture \
-all: $(PROGS)
+PROGS = $(ARCH_DEPENDENT) $(ARCH_INDEPENDENT)
top := ..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all: $(ARCH_INDEPENDENT)
+ @echo "### $(ARCH_DEPENDENT) in defer/ can't be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
# Note that bug_srcu_a is disabled until completed.
bug_srcu_a: bug_srcu_a.c srcu.c ../api.h
cc $(GCC_ARGS) -o bug_srcu_a -DTEST bug_srcu_a.c -lurcu -lpthread
diff --git a/CodeSamples/depends.mk b/CodeSamples/depends.mk
index 81f8bec..8eb45b4 100644
--- a/CodeSamples/depends.mk
+++ b/CodeSamples/depends.mk
@@ -31,14 +31,3 @@ else
api_depend :=
arch_depend :=
endif
-
-ifneq ($(top),.)
-$(top)/api.h: $(api_depend) $(api_depend_common)
- $(MAKE) -C $(top) api.h
-
-$(top)/Makefile.arch: $(arch_depend)
- $(MAKE) -C $(top) Makefile.arch
-else
-$(top)/api.h: $(api_depend) $(api_depend_common)
-$(top)/Makefile.arch: $(arch_depend)
-endif
diff --git a/CodeSamples/intro/Makefile b/CodeSamples/intro/Makefile
index ba2f257..c7be0cb 100644
--- a/CodeSamples/intro/Makefile
+++ b/CodeSamples/intro/Makefile
@@ -1,10 +1,19 @@
-PROGS = initrace initraceperf lockinc nakedinc perthreadinc threadcreate
-
-all: $(PROGS)
+ARCH_INDEPENDENT = initraceperf lockinc nakedinc perthreadinc threadcreate
+ARCH_DEPENDENT = initrace
+PROGS = $(ARCH_DEPENDENT) $(ARCH_INDEPENDENT)
top := ..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all: $(ARCH_INDEPENDENT)
+ @echo "### $(ARCH_DEPENDENT) in intro/ can't be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
initrace: initrace.c ../api.h
cc -g -Wall -o initrace initrace.c -lpthread
diff --git a/CodeSamples/locking/Makefile b/CodeSamples/locking/Makefile
index 5862448..3663a7d 100644
--- a/CodeSamples/locking/Makefile
+++ b/CodeSamples/locking/Makefile
@@ -1,10 +1,19 @@
-PROGS = locked_list xchglock
-
-all: $(PROGS)
+ARCH_INDEPENDENT = locked_list
+ARCH_DEPENDENT = xchglock
+PROGS = $(ARCH_INDEPENDENT) $(ARCH_DEPENDENT)
top := ..
include $(top)/depends.mk
+ifeq ($(strip $(target)),)
+all: $(ARCH_INDEPENDENT)
+ @echo "### $(ARCH_DEPENDENT) in locking/ can't be built on arch: '$(arch)'."
+else
+all: $(PROGS)
+endif
+
+include $(top)/recipes.mk
+
locked_list: locked_list.c ../api.h
cc -g -Wall -o locked_list locked_list.c
diff --git a/CodeSamples/recipes.mk b/CodeSamples/recipes.mk
new file mode 100644
index 0000000..afeaf2f
--- /dev/null
+++ b/CodeSamples/recipes.mk
@@ -0,0 +1,10 @@
+ifneq ($(top),.)
+$(top)/api.h: $(api_depend) $(api_depend_common)
+ $(MAKE) -C $(top) api.h
+
+$(top)/Makefile.arch: $(arch_depend)
+ $(MAKE) -C $(top) Makefile.arch
+else
+$(top)/api.h: $(api_depend) $(api_depend_common)
+$(top)/Makefile.arch: $(arch_depend)
+endif
diff --git a/CodeSamples/toolsoftrade/Makefile b/CodeSamples/toolsoftrade/Makefile
index b6216e8..d23ff21 100644
--- a/CodeSamples/toolsoftrade/Makefile
+++ b/CodeSamples/toolsoftrade/Makefile
@@ -28,6 +28,7 @@ all: $(PROGS)
top := ..
include $(top)/depends.mk
+include $(top)/recipes.mk
forkjoin: forkjoin.c ../api.h
cc $(GCC_ARGS) -o forkjoin forkjoin.c
--
2.7.4
^ permalink raw reply related [flat|nested] 7+ messages in thread