* [PATCH 0/5] CodeSamples: Cleanups and Makefile updates
@ 2017-06-09 15:22 Akira Yokosawa
2017-06-09 15:24 ` [PATCH 1/5] CodeSamples: Remove gprof-helper.c Akira Yokosawa
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Akira Yokosawa @ 2017-06-09 15:22 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 23:59:11 +0900
Subject: [PATCH 0/5] CodeSamples: Cleanups and Makefile updates
Hi Paul,
Removal of gprof-helper.c and linux/list.h has become a fairly large
patch set.
Patch 1 is simple removal.
Patch 2 is an improvement to make the "-jN" option to propagate to
subdirectories.
Patch 3 removes linux/list.h, with refactoring of recipes.
Patch 4 adds subdirectories that can be built by "make" in the
CodeSamples/ directory.
Patch 5 improves build behavior for unsupported architectures.
You can test the behavior by overriding "arch" variable by defining
it as an environment variable, e.g.:
$ export arch=unsupported
$ make clean; make
After the test,
$ unset arch
will restore the normal behavior.
Thoughts?
Thanks, Akira
--
Akira Yokosawa (5):
CodeSamples: Remove gprof-helper.c
CodeSamples: Use $(MAKE) for recursive make
CodeSamples: Makefile: Remove linux/list.h
CodeSamples: Makefile: Add subdirectories
CodeSamples: Makefile: Distinguish arch-independent targets
CodeSamples/.gitignore | 1 -
CodeSamples/Makefile | 125 +-----
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 | 14 +-
CodeSamples/gprof-helper.c | 118 ------
CodeSamples/intro/Makefile | 15 +-
CodeSamples/linux/list.h | 700 -------------------------------
CodeSamples/locking/Makefile | 15 +-
CodeSamples/recipes.mk | 10 +
CodeSamples/toolsoftrade/Makefile | 1 +
17 files changed, 139 insertions(+), 963 deletions(-)
delete mode 100644 CodeSamples/gprof-helper.c
delete mode 100644 CodeSamples/linux/list.h
create mode 100644 CodeSamples/recipes.mk
--
2.7.4
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/5] CodeSamples: Remove gprof-helper.c
2017-06-09 15:22 [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Akira Yokosawa
@ 2017-06-09 15:24 ` Akira Yokosawa
2017-06-09 15:25 ` [PATCH 2/5] CodeSamples: Use $(MAKE) for recursive make Akira Yokosawa
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Akira Yokosawa @ 2017-06-09 15:24 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: perfbook, Akira Yokosawa
From 5d81fb381768463ac02881edb5e8caf3896e9c48 Mon Sep 17 00:00:00 2001
From: Akira Yokosawa <akiyks@gmail.com>
Date: Tue, 6 Jun 2017 00:06:44 +0900
Subject: [PATCH 1/5] CodeSamples: Remove gprof-helper.c
Paul confirmed that he no longer needs this.
Also remove its entry in .gitignore.
Signed-off-by: Akira Yokosawa <akiyks@gmail.com>
---
CodeSamples/.gitignore | 1 -
CodeSamples/gprof-helper.c | 118 ---------------------------------------------
2 files changed, 119 deletions(-)
delete mode 100644 CodeSamples/gprof-helper.c
diff --git a/CodeSamples/.gitignore b/CodeSamples/.gitignore
index e116055..042e44d 100644
--- a/CodeSamples/.gitignore
+++ b/CodeSamples/.gitignore
@@ -1,3 +1,2 @@
-/gprof-helper.c
/Makefile.arch
/api.h
diff --git a/CodeSamples/gprof-helper.c b/CodeSamples/gprof-helper.c
deleted file mode 100644
index e413b17..0000000
--- a/CodeSamples/gprof-helper.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* gprof-helper.c -- preload library to profile pthread-enabled programs
- *
- * Authors: Sam Hocevar <sam at zoy dot org>
- * Daniel Jönsson <danieljo at fagotten dot org>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the Do What The Fuck You Want To
- * Public License as published by Banlu Kemiyatorn. See
- * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
- *
- * Compilation example:
- * gcc -shared -fPIC gprof-helper.c -o gprof-helper.so -lpthread -ldl
- *
- * Usage example:
- * LD_PRELOAD=./gprof-helper.so your_program
- */
-
-#define _GNU_SOURCE
-#include <sys/time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-#include <pthread.h>
-
-static void * wrapper_routine(void *);
-
-/* Original pthread function */
-static int (*pthread_create_orig)(pthread_t *__restrict,
- __const pthread_attr_t *__restrict,
- void *(*)(void *), void *__restrict) = NULL;
-
-/* Library initialization function */
-void wooinit(void) __attribute__((constructor));
-
-void wooinit(void)
-{
- pthread_create_orig = dlsym(RTLD_NEXT, "pthread_create");
- fprintf(stderr, "pthreads: using profiling hooks for gprof\n");
- if(pthread_create_orig == NULL) {
- char *error = dlerror();
- if(error == NULL) {
- error = "pthread_create is NULL";
- }
- fprintf(stderr, "%s\n", error);
- exit(EXIT_FAILURE);
- }
-}
-
-/* Our data structure passed to the wrapper */
-typedef struct wrapper_s
-{
- void * (*start_routine)(void *);
- void * arg;
-
- pthread_mutex_t lock;
- pthread_cond_t wait;
-
- struct itimerval itimer;
-
-} wrapper_t;
-
-/* The wrapper function in charge for setting the itimer value */
-static void * wrapper_routine(void * data)
-{
- /* Put user data in thread-local variables */
- void * (*start_routine)(void *) = ((wrapper_t*)data)->start_routine;
- void * arg = ((wrapper_t*)data)->arg;
-
- /* Set the profile timer value */
- setitimer(ITIMER_PROF, &((wrapper_t*)data)->itimer, NULL);
-
- /* Tell the calling thread that we don't need its data anymore */
- pthread_mutex_lock(&((wrapper_t*)data)->lock);
- pthread_cond_signal(&((wrapper_t*)data)->wait);
- pthread_mutex_unlock(&((wrapper_t*)data)->lock);
-
- /* Call the real function */
- return start_routine(arg);
-}
-
-/* Our wrapper function for the real pthread_create() */
-int pthread_create(pthread_t *__restrict thread,
- __const pthread_attr_t *__restrict attr,
- void * (*start_routine)(void *),
- void *__restrict arg)
-{
- wrapper_t wrapper_data;
- int i_return;
-
- /* Initialize the wrapper structure */
- wrapper_data.start_routine = start_routine;
- wrapper_data.arg = arg;
- getitimer(ITIMER_PROF, &wrapper_data.itimer);
- pthread_cond_init(&wrapper_data.wait, NULL);
- pthread_mutex_init(&wrapper_data.lock, NULL);
- pthread_mutex_lock(&wrapper_data.lock);
-
- /* The real pthread_create call */
- i_return = pthread_create_orig(thread,
- attr,
- &wrapper_routine,
- &wrapper_data);
-
- /*
- * If the thread was successfully spawned, wait for the data
- * to be released
- */
-
- if(i_return == 0) {
- pthread_cond_wait(&wrapper_data.wait, &wrapper_data.lock);
- }
-
- pthread_mutex_unlock(&wrapper_data.lock);
- pthread_mutex_destroy(&wrapper_data.lock);
- pthread_cond_destroy(&wrapper_data.wait);
-
- return i_return;
-}
--
2.7.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/5] CodeSamples: Use $(MAKE) for recursive make
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 ` Akira Yokosawa
2017-06-09 15:27 ` [PATCH 3/5] CodeSamples: Makefile: Remove linux/list.h Akira Yokosawa
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Akira Yokosawa @ 2017-06-09 15:25 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: perfbook, Akira Yokosawa
From e227572a57eaa6c14636c1d197a6d40254bcfa5c Mon Sep 17 00:00:00 2001
From: Akira Yokosawa <akiyks@gmail.com>
Date: Tue, 6 Jun 2017 00:24:15 +0900
Subject: [PATCH 2/5] CodeSamples: Use $(MAKE) for recursive make
For recursive make, "$(MAKE)" is recommended.[1]
By this change, options such as "-j4" can be transferred to builds
under subdirectories.
Also convert the list of recursive "make"s to a "for" loop by
defining a variable "subdirs".
[1] https://www.gnu.org/software/make/manual/html_node/Recursion.html
Signed-off-by: Akira Yokosawa <akiyks@gmail.com>
---
CodeSamples/Makefile | 16 ++++++++--------
CodeSamples/depends.mk | 4 ++--
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/CodeSamples/Makefile b/CodeSamples/Makefile
index e1593a7..ec9e9a6 100644
--- a/CodeSamples/Makefile
+++ b/CodeSamples/Makefile
@@ -1,24 +1,24 @@
+subdirs = SMPdesign advsync count defer intro toolsoftrade
+
.PHONY: all clean pthreads pthreads-x86 pthreads-ppc64 pthreads-arm
top := .
all:
- (cd SMPdesign; make)
- (cd advsync; make)
- (cd count; make)
- (cd defer; make)
- (cd intro; make)
- (cd toolsoftrade; make)
+ for d in $(subdirs); \
+ do \
+ $(MAKE) -C $$d; \
+ done
include depends.mk
api.h Makefile.arch:
ifeq ($(strip $(target)),)
- make pthreads
+ $(MAKE) pthreads
$(warning "Could not figure out which target to use (arch:$(arch)).\
Used 'make pthreads' in CodeSamples/Makefile.")
else
- make pthreads-$(target)
+ $(MAKE) pthreads-$(target)
endif
pthreads:
diff --git a/CodeSamples/depends.mk b/CodeSamples/depends.mk
index f3a325d..9d2691b 100644
--- a/CodeSamples/depends.mk
+++ b/CodeSamples/depends.mk
@@ -35,10 +35,10 @@ endif
ifneq ($(top),.)
$(top)/api.h: $(api_depend) $(api_depend_common)
- make -C $(top) api.h
+ $(MAKE) -C $(top) api.h
$(top)/Makefile.arch: $(arch_depend)
- make -C $(top) Makefile.arch
+ $(MAKE) -C $(top) Makefile.arch
else
$(top)/api.h: $(api_depend) $(api_depend_common)
$(top)/Makefile.arch: $(arch_depend)
--
2.7.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [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 4/5] CodeSamples: Makefile: Add subdirectories
2017-06-09 15:22 [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Akira Yokosawa
` (2 preceding siblings ...)
2017-06-09 15:27 ` [PATCH 3/5] CodeSamples: Makefile: Remove linux/list.h Akira Yokosawa
@ 2017-06-09 15:28 ` Akira Yokosawa
2017-06-09 15:30 ` [PATCH 5/5] CodeSamples: Makefile: Distinguish arch-independent targets 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:28 UTC (permalink / raw)
To: Paul E. McKenney; +Cc: perfbook, Akira Yokosawa
From 7e77e8a2d087b979ab984e9b90731b5db0d1eedc Mon Sep 17 00:00:00 2001
From: Akira Yokosawa <akiyks@gmail.com>
Date: Wed, 7 Jun 2017 20:41:34 +0900
Subject: [PATCH 4/5] CodeSamples: Makefile: Add subdirectories
Add subdirectories whose builds depend on api.h and Makefile.arch.
Now that liburcu is mandatory, we can safely add these subdirectories
which contain targets to be linked to urcu libraries.
Signed-off-by: Akira Yokosawa <akiyks@gmail.com>
---
CodeSamples/Makefile | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CodeSamples/Makefile b/CodeSamples/Makefile
index 1bfdf08..cef6927 100644
--- a/CodeSamples/Makefile
+++ b/CodeSamples/Makefile
@@ -1,4 +1,5 @@
-subdirs = SMPdesign advsync count defer intro toolsoftrade
+subdirs = SMPdesign advsync count defer intro toolsoftrade locking
+subdirs += datastruct/Issaquah datastruct/hash datastruct/log datastruct/skiplist
.PHONY: all clean pthreads
--
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
* Re: [PATCH 0/5] CodeSamples: Cleanups and Makefile updates
2017-06-09 15:22 [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Akira Yokosawa
` (4 preceding siblings ...)
2017-06-09 15:30 ` [PATCH 5/5] CodeSamples: Makefile: Distinguish arch-independent targets Akira Yokosawa
@ 2017-06-09 22:21 ` Paul E. McKenney
5 siblings, 0 replies; 7+ messages in thread
From: Paul E. McKenney @ 2017-06-09 22:21 UTC (permalink / raw)
To: Akira Yokosawa; +Cc: perfbook
On Sat, Jun 10, 2017 at 12:22:53AM +0900, Akira Yokosawa wrote:
> >From b31141981b13d40fbbe5d20fa339d714ecba084c Mon Sep 17 00:00:00 2001
> From: Akira Yokosawa <akiyks@gmail.com>
> Date: Fri, 9 Jun 2017 23:59:11 +0900
> Subject: [PATCH 0/5] CodeSamples: Cleanups and Makefile updates
>
> Hi Paul,
>
> Removal of gprof-helper.c and linux/list.h has become a fairly large
> patch set.
>
> Patch 1 is simple removal.
> Patch 2 is an improvement to make the "-jN" option to propagate to
> subdirectories.
> Patch 3 removes linux/list.h, with refactoring of recipes.
> Patch 4 adds subdirectories that can be built by "make" in the
> CodeSamples/ directory.
> Patch 5 improves build behavior for unsupported architectures.
> You can test the behavior by overriding "arch" variable by defining
> it as an environment variable, e.g.:
> $ export arch=unsupported
> $ make clean; make
> After the test,
> $ unset arch
> will restore the normal behavior.
>
> Thoughts?
Seems to work, applied and pushed, thank you!
Thanx, Paul
> Thanks, Akira
> --
>
> Akira Yokosawa (5):
> CodeSamples: Remove gprof-helper.c
> CodeSamples: Use $(MAKE) for recursive make
> CodeSamples: Makefile: Remove linux/list.h
> CodeSamples: Makefile: Add subdirectories
> CodeSamples: Makefile: Distinguish arch-independent targets
>
> CodeSamples/.gitignore | 1 -
> CodeSamples/Makefile | 125 +-----
> 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 | 14 +-
> CodeSamples/gprof-helper.c | 118 ------
> CodeSamples/intro/Makefile | 15 +-
> CodeSamples/linux/list.h | 700 -------------------------------
> CodeSamples/locking/Makefile | 15 +-
> CodeSamples/recipes.mk | 10 +
> CodeSamples/toolsoftrade/Makefile | 1 +
> 17 files changed, 139 insertions(+), 963 deletions(-)
> delete mode 100644 CodeSamples/gprof-helper.c
> delete mode 100644 CodeSamples/linux/list.h
> create mode 100644 CodeSamples/recipes.mk
>
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-06-09 22:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH 3/5] CodeSamples: Makefile: Remove linux/list.h Akira Yokosawa
2017-06-09 15:28 ` [PATCH 4/5] CodeSamples: Makefile: Add subdirectories Akira Yokosawa
2017-06-09 15:30 ` [PATCH 5/5] CodeSamples: Makefile: Distinguish arch-independent targets Akira Yokosawa
2017-06-09 22:21 ` [PATCH 0/5] CodeSamples: Cleanups and Makefile updates Paul E. McKenney
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.