>From 10024f2b41c129e5e7e892c60946c8dd5dd58007 Mon Sep 17 00:00:00 2001 From: Akira Yokosawa <akiyks@xxxxxxxxx> Date: Sun, 28 May 2017 09:40:21 +0900 Subject: [RFC PATCH 2/4] CodeSamples: Remove generated files from repository Now, as Makefile.arch and api.h are generated when necessary, they are no longer necessary in the repository. Also fix entry for gprof-helper.c in .gitignore and remove an executable file sneaked into repository under datastruct/Issaquah/. Signed-off-by: Akira Yokosawa <akiyks@xxxxxxxxx> --- CodeSamples/.gitignore | 4 +- CodeSamples/Makefile.arch | 6 - CodeSamples/api.h | 808 ------------------------- CodeSamples/datastruct/Issaquah/existence_test | Bin 26359 -> 0 bytes 4 files changed, 3 insertions(+), 815 deletions(-) delete mode 100644 CodeSamples/Makefile.arch delete mode 100644 CodeSamples/api.h delete mode 100755 CodeSamples/datastruct/Issaquah/existence_test diff --git a/CodeSamples/.gitignore b/CodeSamples/.gitignore index 9e3642f..e116055 100644 --- a/CodeSamples/.gitignore +++ b/CodeSamples/.gitignore @@ -1 +1,3 @@ -./gprof-helper.c +/gprof-helper.c +/Makefile.arch +/api.h diff --git a/CodeSamples/Makefile.arch b/CodeSamples/Makefile.arch deleted file mode 100644 index 07a4b33..0000000 --- a/CodeSamples/Makefile.arch +++ /dev/null @@ -1,6 +0,0 @@ -# MECHANICALLY GENERATED, DO NOT EDIT!!! - -# For use on 64-bit systems, add -m32. You might also need to install -# g++-multilib (thanks to robert.berger@xxxxxxxxxxxxxxxxxxxxxxxxxxx). - -GCC_ARGS=-g -O3 -Wall diff --git a/CodeSamples/api.h b/CodeSamples/api.h deleted file mode 100644 index 3b4bc16..0000000 --- a/CodeSamples/api.h +++ /dev/null @@ -1,808 +0,0 @@ -#ifndef __PERFBOOK_API_H__ -#define __PERFBOOK_API_H__ -/* MECHANICALLY GENERATED, DO NOT EDIT!!! */ - -/* - * common.h: Common Linux kernel-isms. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; but version 2 of the License only due - * to code included from the Linux kernel. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can access it online at - * http://www.gnu.org/licenses/gpl-2.0.html. - * - * Copyright (c) 2006 Paul E. McKenney, IBM. - * - * Much code taken from the Linux kernel. For such code, the option - * to redistribute under later versions of GPL might not be available. - */ - -#ifndef __always_inline -#define __always_inline inline -#endif -#ifndef __maybe_unused -#define __maybe_unused __attribute__((unused)) -#endif - -#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) -#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1) - -#ifdef __ASSEMBLY__ -# define stringify_in_c(...) __VA_ARGS__ -# define ASM_CONST(x) x -#else -/* This version of stringify will deal with commas... */ -# define __stringify_in_c(...) #__VA_ARGS__ -# define stringify_in_c(...) __stringify_in_c(__VA_ARGS__) " " -# define __ASM_CONST(x) x##UL -# define ASM_CONST(x) __ASM_CONST(x) -#endif - - -/* - * arch-i386.h: Expose x86 atomic instructions. 80486 and better only. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, but version 2 only due to inclusion - * of Linux-kernel code. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can access it online at - * http://www.gnu.org/licenses/gpl-2.0.html. - * - * Copyright (c) 2006 Paul E. McKenney, IBM. - * - * Much code taken from the Linux kernel. For such code, the option - * to redistribute under later versions of GPL might not be available. - */ - -/* - * Machine parameters. - */ - -#define CONFIG_SMP - -#define CACHE_LINE_SIZE 64 -#define ____cacheline_internodealigned_in_smp \ - __attribute__((__aligned__(1 << 6))) - -#define LOCK_PREFIX "lock ; " - -/* These are x86-specific, used by some header files */ -#define atomic_clear_mask(mask, addr) \ -__asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \ -: : "r" (~(mask)),"m" (*addr) : "memory") - -#define atomic_set_mask(mask, addr) \ -__asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \ -: : "r" (mask),"m" (*(addr)) : "memory") - -/* Atomic operations are already serializing on x86 */ -#define smp_mb__before_atomic_dec() barrier() -#define smp_mb__after_atomic_dec() barrier() -#define smp_mb__before_atomic_inc() barrier() -#define smp_mb__after_atomic_inc() barrier() - -#define smp_mb() \ -__asm__ __volatile__("mfence" : : : "memory") -/* __asm__ __volatile__("lock; addl $0,0(%%esp)" : : : "memory") */ - - -/* - * Generate 64-bit timestamp. - */ - -static __inline__ long long get_timestamp(void) -{ - unsigned int __a,__d; - - __asm__ __volatile__("rdtsc" : "=a" (__a), "=d" (__d)); - return ((long long)__a) | (((long long)__d)<<32); -} - -/* - * api_pthreads.h: API mapping to pthreads environment. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. However, please note that much - * of the code in this file derives from the Linux kernel, and that such - * code may not be available except under GPLv2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can access it online at - * http://www.gnu.org/licenses/gpl-2.0.html. - * - * Copyright (c) 2006 Paul E. McKenney, IBM. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <strings.h> -#include <errno.h> -#include <limits.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <poll.h> -#include <sys/time.h> -#include <string.h> -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif /* #ifndef _GNU_SOURCE */ -#ifndef __USE_GNU -#define __USE_GNU -#endif /* #ifndef __USE_GNU */ -#include <pthread.h> -#include <sched.h> -#include <sys/param.h> -/* #include "atomic.h" */ - -/* - * Compiler magic. - */ -#ifndef offsetof -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#endif /* #ifndef offsetof */ -#ifndef container_of -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *__mptr = (ptr); \ - (type *)( (char *)__mptr - offsetof(type,member) );}) -#endif /* #ifndef offsetof */ -#define barrier() __asm__ __volatile__("": : :"memory") - -/* - * Default machine parameters. - */ - -#ifndef CACHE_LINE_SIZE -#define CACHE_LINE_SIZE 128 -#endif /* #ifndef CACHE_LINE_SIZE */ - -/* - * Exclusive locking primitives. - */ - -typedef pthread_mutex_t spinlock_t; - -#define DEFINE_SPINLOCK(lock) spinlock_t lock = PTHREAD_MUTEX_INITIALIZER; -#define __SPIN_LOCK_UNLOCKED(lockp) PTHREAD_MUTEX_INITIALIZER - -static __inline__ void spin_lock_init(spinlock_t *sp) -{ - int ret; - -retry: - ret = pthread_mutex_init(sp, NULL); - if (ret) { - if (ret == EINTR) - goto retry; - fprintf(stderr, "spin_lock_init:pthread_mutex_init %d\n", ret); - abort(); - } -} - -static __inline__ void spin_lock(spinlock_t *sp) -{ - if (pthread_mutex_lock(sp) != 0) { - perror("spin_lock:pthread_mutex_lock"); - abort(); - } -} - -static __inline__ int spin_trylock(spinlock_t *sp) -{ - int retval; - - if ((retval = pthread_mutex_trylock(sp)) == 0) - return 1; - if (retval == EBUSY) - return 0; - perror("spin_trylock:pthread_mutex_trylock"); - abort(); -} - -static __inline__ void spin_unlock(spinlock_t *sp) -{ - if (pthread_mutex_unlock(sp) != 0) { - perror("spin_unlock:pthread_mutex_unlock"); - abort(); - } -} - -static __inline__ int spin_is_locked(spinlock_t *sp) -{ - if (spin_trylock(sp)) { - spin_unlock(sp); - return 0; - } - return 1; -} - -#define spin_lock_irqsave(l, f) do { f = 1; spin_lock(l); } while (0) -#define spin_unlock_irqrestore(l, f) do { f = 0; spin_unlock(l); } while (0) - -#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) -#define READ_ONCE(x) ({ typeof(x) ___x = ACCESS_ONCE(x); ___x; }) -#define WRITE_ONCE(x, val) ({ ACCESS_ONCE(x) = (val); }) -#ifndef unlikely -#define unlikely(x) x -#endif /* #ifndef unlikely */ -#ifndef likely -#define likely(x) x -#endif /* #ifndef likely */ -#define prefetch(x) x - -/* - * Thread creation/destruction primitives. - */ - -typedef pthread_t thread_id_t; - -#define NR_THREADS 128 - -#define __THREAD_ID_MAP_EMPTY 0 -#define __THREAD_ID_MAP_WAITING 1 -thread_id_t __thread_id_map[NR_THREADS]; -spinlock_t __thread_id_map_mutex; - -#define for_each_thread(t) \ - for (t = 0; t < NR_THREADS; t++) - -#define for_each_running_thread(t) \ - for (t = 0; t < NR_THREADS; t++) \ - if ((__thread_id_map[t] != __THREAD_ID_MAP_EMPTY) && \ - (__thread_id_map[t] != __THREAD_ID_MAP_WAITING)) - -#define for_each_tid(t, tid) \ - for (t = 0; t < NR_THREADS; t++) \ - if ((((tid) = __thread_id_map[t]) != __THREAD_ID_MAP_EMPTY) && \ - ((tid) != __THREAD_ID_MAP_WAITING)) - -pthread_key_t thread_id_key; - -static __inline__ int num_online_threads(void) -{ - int t; - int nonline = 0; - - for_each_running_thread(t) - nonline++; - return nonline; -} - -static __inline__ int __smp_thread_id(void) -{ - int i; - thread_id_t tid = pthread_self(); - - for (i = 0; i < NR_THREADS; i++) { - if (__thread_id_map[i] == tid) { - long v = i + 1; /* must be non-NULL. */ - - if (pthread_setspecific(thread_id_key, (void *)v) != 0) { - perror("pthread_setspecific"); - exit(-1); - } - return i; - } - } - spin_lock(&__thread_id_map_mutex); - for (i = 0; i < NR_THREADS; i++) { - if (__thread_id_map[i] == tid) { - spin_unlock(&__thread_id_map_mutex); - return i; - } - } - spin_unlock(&__thread_id_map_mutex); - fprintf(stderr, "smp_thread_id: Rogue thread, id: %d(%#x)\n", - (int)tid, (int)tid); - exit(-1); -} - -static __inline__ int smp_thread_id(void) -{ - void *id; - - id = pthread_getspecific(thread_id_key); - if (id == NULL) - return __smp_thread_id(); - return (long)(id - 1); -} - -static __inline__ thread_id_t create_thread(void *(*func)(void *), void *arg) -{ - thread_id_t tid; - int i; - - spin_lock(&__thread_id_map_mutex); - for (i = 0; i < NR_THREADS; i++) { - if (__thread_id_map[i] == __THREAD_ID_MAP_EMPTY) - break; - } - if (i >= NR_THREADS) { - spin_unlock(&__thread_id_map_mutex); - fprintf(stderr, "Thread limit of %d exceeded!\n", NR_THREADS); - exit(-1); - } - __thread_id_map[i] = __THREAD_ID_MAP_WAITING; - if (pthread_create(&tid, NULL, func, arg) != 0) { - perror("create_thread:pthread_create"); - exit(-1); - } - __thread_id_map[i] = tid; - spin_unlock(&__thread_id_map_mutex); - return tid; -} - -static __inline__ void *wait_thread(thread_id_t tid) -{ - int i; - void *vp; - - for (i = 0; i < NR_THREADS; i++) { - if (__thread_id_map[i] == tid) - break; - } - if (i >= NR_THREADS){ - fprintf(stderr, "wait_thread: bad tid = %d(%#x)\n", - (int)tid, (int)tid); - exit(-1); - } - if (pthread_join(tid, &vp) != 0) { - perror("wait_thread:pthread_join"); - exit(-1); - } - __thread_id_map[i] = __THREAD_ID_MAP_EMPTY; - return vp; -} - -static __inline__ void wait_all_threads(void) -{ - int i; - thread_id_t tid; - - for (i = 1; i < NR_THREADS; i++) { - tid = __thread_id_map[i]; - if (tid != __THREAD_ID_MAP_EMPTY && - tid != __THREAD_ID_MAP_WAITING) - (void)wait_thread(tid); - } -} - -/* - * Wait on all child processes. - */ -static __inline__ void waitall(void) -{ - int pid; - int status; - - for (;;) { - pid = wait(&status); - if (pid == -1) { - if (errno == ECHILD) - break; - perror("wait"); - exit(-1); - } - poll(NULL, 0, 1); - } -} - -static __inline__ void run_on(int cpu) -{ - cpu_set_t mask; - - CPU_ZERO(&mask); - CPU_SET(cpu, &mask); - sched_setaffinity(0, sizeof(mask), &mask); -} - -/* - * timekeeping -- very crude -- should use MONOTONIC... - */ - -static __inline__ long long get_microseconds(void) -{ - struct timeval tv; - - if (gettimeofday(&tv, NULL) != 0) - abort(); - return ((long long)tv.tv_sec) * 1000000LL + (long long)tv.tv_usec; -} - -/* - * Per-thread variables. - */ - -#define DEFINE_PER_THREAD(type, name) \ - struct { \ - __typeof__(type) v \ - __attribute__((__aligned__(CACHE_LINE_SIZE))); \ - } __per_thread_##name[NR_THREADS]; -#define DECLARE_PER_THREAD(type, name) extern DEFINE_PER_THREAD(type, name) - -#define per_thread(name, thread) __per_thread_##name[thread].v -#define __get_thread_var(name) per_thread(name, smp_thread_id()) - -#define init_per_thread(name, v) \ - do { \ - int __i_p_t_i; \ - for (__i_p_t_i = 0; __i_p_t_i < NR_THREADS; __i_p_t_i++) \ - per_thread(name, __i_p_t_i) = v; \ - } while (0) - -/* - * CPU traversal primitives. - */ - -#ifndef NR_CPUS -#define NR_CPUS 16 -#endif /* #ifndef NR_CPUS */ - -#define for_each_possible_cpu(cpu) \ - for (cpu = 0; cpu < NR_CPUS; cpu++) -#define for_each_online_cpu(cpu) \ - for (cpu = 0; cpu < NR_CPUS; cpu++) - -/* - * Per-CPU variables. - */ - -#define DEFINE_PER_CPU(type, name) \ - struct { \ - __typeof__(type) v \ - __attribute__((__aligned__(CACHE_LINE_SIZE))); \ - } __per_cpu_##name[NR_CPUS] -#define DECLARE_PER_CPU(type, name) extern DEFINE_PER_CPU(type, name) - -DEFINE_PER_THREAD(int, smp_processor_id); - -static __inline__ int smp_processor_id(void) -{ - return __get_thread_var(smp_processor_id); -} - -static __inline__ void set_smp_processor_id(int cpu) -{ - __get_thread_var(smp_processor_id) = cpu; -} - -#define per_cpu(name, thread) __per_cpu_##name[thread].v -#define __get_cpu_var(name) per_cpu(name, smp_processor_id()) - -#define init_per_cpu(name, v) \ - do { \ - int __i_p_c_i; \ - for (__i_p_c_i = 0; __i_p_c_i < NR_CPUS; __i_p_c_i++) \ - per_cpu(name, __i_p_c_i) = v; \ - } while (0) - -/* - * CPU state checking (crowbarred). - */ - -#define idle_cpu(cpu) 0 -#define in_softirq() 1 -#define hardirq_count() 0 -#define PREEMPT_SHIFT 0 -#define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS) -#define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS) -#define PREEMPT_BITS 8 -#define SOFTIRQ_BITS 8 - -/* - * CPU hotplug. - */ - -struct notifier_block { - int (*notifier_call)(struct notifier_block *, unsigned long, void *); - struct notifier_block *next; - int priority; -}; - -#define CPU_ONLINE 0x0002 /* CPU (unsigned)v is up */ -#define CPU_UP_PREPARE 0x0003 /* CPU (unsigned)v coming up */ -#define CPU_UP_CANCELED 0x0004 /* CPU (unsigned)v NOT coming up */ -#define CPU_DOWN_PREPARE 0x0005 /* CPU (unsigned)v going down */ -#define CPU_DOWN_FAILED 0x0006 /* CPU (unsigned)v NOT going down */ -#define CPU_DEAD 0x0007 /* CPU (unsigned)v dead */ -#define CPU_DYING 0x0008 /* CPU (unsigned)v not running any task, - * not handling interrupts, soon dead */ -#define CPU_POST_DEAD 0x0009 /* CPU (unsigned)v dead, cpu_hotplug - * lock is dropped */ - -/* Used for CPU hotplug events occuring while tasks are frozen due to a suspend - * operation in progress - */ -#define CPU_TASKS_FROZEN 0x0010 - -#define CPU_ONLINE_FROZEN (CPU_ONLINE | CPU_TASKS_FROZEN) -#define CPU_UP_PREPARE_FROZEN (CPU_UP_PREPARE | CPU_TASKS_FROZEN) -#define CPU_UP_CANCELED_FROZEN (CPU_UP_CANCELED | CPU_TASKS_FROZEN) -#define CPU_DOWN_PREPARE_FROZEN (CPU_DOWN_PREPARE | CPU_TASKS_FROZEN) -#define CPU_DOWN_FAILED_FROZEN (CPU_DOWN_FAILED | CPU_TASKS_FROZEN) -#define CPU_DEAD_FROZEN (CPU_DEAD | CPU_TASKS_FROZEN) -#define CPU_DYING_FROZEN (CPU_DYING | CPU_TASKS_FROZEN) - -/* Hibernation and suspend events */ -#define PM_HIBERNATION_PREPARE 0x0001 /* Going to hibernate */ -#define PM_POST_HIBERNATION 0x0002 /* Hibernation finished */ -#define PM_SUSPEND_PREPARE 0x0003 /* Going to suspend the system */ -#define PM_POST_SUSPEND 0x0004 /* Suspend finished */ -#define PM_RESTORE_PREPARE 0x0005 /* Going to restore a saved image */ -#define PM_POST_RESTORE 0x0006 /* Restore failed */ - -#define NOTIFY_DONE 0x0000 /* Don't care */ -#define NOTIFY_OK 0x0001 /* Suits me */ -#define NOTIFY_STOP_MASK 0x8000 /* Don't call further */ -#define NOTIFY_BAD (NOTIFY_STOP_MASK|0x0002) - /* Bad/Veto action */ -/* - * Clean way to return from the notifier and stop further calls. - */ -#define NOTIFY_STOP (NOTIFY_OK|NOTIFY_STOP_MASK) - -/* - * Bug checks. - */ - -#define BUG_ON(c) do { if (c) abort(); } while (0) - -/* - * Initialization -- Must be called before calling any primitives. - */ - -static __inline__ void smp_init(void) -{ - int i; - - spin_lock_init(&__thread_id_map_mutex); - __thread_id_map[0] = pthread_self(); - for (i = 1; i < NR_THREADS; i++) - __thread_id_map[i] = __THREAD_ID_MAP_EMPTY; - init_per_thread(smp_processor_id, 0); - if (pthread_key_create(&thread_id_key, NULL) != 0) { - perror("pthread_key_create"); - exit(-1); - } -} - -/* - * api-gcc.h: API mapping to pthreads gcc environment. - * Uses C11-like gcc intrinsics. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. However, please note that much - * of the code in this file derives from the Linux kernel, and that such - * code may not be available except under GPLv2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can access it online at - * http://www.gnu.org/licenses/gpl-2.0.html. - * - * Copyright (c) 2016 Paul E. McKenney, IBM. - */ - -/* - * Atomic data structure, initialization, and access. - */ - -typedef struct { volatile int counter; } atomic_t; - -#define ATOMIC_INIT(i) { (i) } - -#define atomic_read(v) \ - __atomic_load_n(&(v)->counter, __ATOMIC_RELAXED) -#define atomic_set(v, i) \ - __atomic_store_n(&(v)->counter, (i), __ATOMIC_RELAXED) -#define smp_load_acquire(p) \ - __atomic_load_n(p, __ATOMIC_ACQUIRE) -#define smp_store_release(p, i) \ - __atomic_store_n(p, (i), __ATOMIC_RELEASE) - -/* - * Atomic operations. - */ - -/** - * atomic_add - add integer to atomic variable - * @i: integer value to add - * @v: pointer of type atomic_t - * - * Atomically adds @i to @v. - */ -static __inline__ void atomic_add(int i, atomic_t *v) -{ - __atomic_add_fetch(&v->counter, i, __ATOMIC_RELAXED); -} - -/** - * atomic_sub - subtract the atomic variable - * @i: integer value to subtract - * @v: pointer of type atomic_t - * - * Atomically subtracts @i from @v. - */ -static __inline__ void atomic_sub(int i, atomic_t *v) -{ - __atomic_sub_fetch(&v->counter, i, __ATOMIC_RELAXED); -} - -/** - * atomic_sub_and_test - subtract value from variable and test result - * @i: integer value to subtract - * @v: pointer of type atomic_t - * - * Atomically subtracts @i from @v and returns - * true if the result is zero, or false for all - * other cases. - */ -static __inline__ int atomic_sub_and_test(int i, atomic_t *v) -{ - return __atomic_sub_fetch(&v->counter, i, __ATOMIC_SEQ_CST) == 0; -} - -/** - * atomic_inc - increment atomic variable - * @v: pointer of type atomic_t - * - * Atomically increments @v by 1. - */ -static __inline__ void atomic_inc(atomic_t *v) -{ - atomic_add(1, v); -} - -/** - * atomic_dec - decrement atomic variable - * @v: pointer of type atomic_t - * - * Atomically decrements @v by 1. - */ -static __inline__ void atomic_dec(atomic_t *v) -{ - atomic_sub(1, v); -} - -/** - * atomic_dec_and_test - decrement and test - * @v: pointer of type atomic_t - * - * Atomically decrements @v by 1 and - * returns true if the result is 0, or false for all other - * cases. - */ -static __inline__ int atomic_dec_and_test(atomic_t *v) -{ - return atomic_sub_and_test(1, v); -} - -/** - * atomic_inc_and_test - increment and test - * @v: pointer of type atomic_t - * - * Atomically increments @v by 1 - * and returns true if the result is zero, or false for all - * other cases. - */ -static __inline__ int atomic_inc_and_test(atomic_t *v) -{ - return __atomic_add_fetch(&v->counter, 1, __ATOMIC_SEQ_CST) == 0; -} - -/** - * atomic_add_negative - add and test if negative - * @v: pointer of type atomic_t - * @i: integer value to add - * - * Atomically adds @i to @v and returns true - * if the result is negative, or false when - * result is greater than or equal to zero. - */ -static __inline__ int atomic_add_negative(int i, atomic_t *v) -{ - return __atomic_add_fetch(&v->counter, 1, __ATOMIC_SEQ_CST) < 0; -} - -/** - * atomic_add_return - add and return - * @v: pointer of type atomic_t - * @i: integer value to add - * - * Atomically adds @i to @v and returns @i + @v - */ -static __inline__ int atomic_add_return(int i, atomic_t *v) -{ - return __atomic_add_fetch(&v->counter, 1, __ATOMIC_SEQ_CST); -} - -static __inline__ int atomic_sub_return(int i, atomic_t *v) -{ - return atomic_add_return(-i, v); -} - -struct __xchg_dummy { - unsigned long a[100]; -}; -#define __xg(x) ((struct __xchg_dummy *)(x)) - -#define cmpxchg(ptr, o, n) \ -({ \ - typeof(*ptr) _____actual = (o); \ - \ - (void)__atomic_compare_exchange_n(ptr, (void *)&_____actual, (n), 1, \ - __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ - _____actual; \ -}) - -static __inline__ int atomic_cmpxchg(atomic_t *v, int old, int new) -{ - return cmpxchg(&v->counter, old, new); -} - -#define xchg(ptr, v) __atomic_exchange_n((ptr), (v), __ATOMIC_SEQ_CST) -#define atomic_xchg(ptr, v) \ - __atomic_exchange_n(&(ptr)->counter, (v), __ATOMIC_SEQ_CST) - -/** - * atomic_add_unless - add unless the number is a given value - * @v: pointer of type atomic_t - * @a: the amount to add to v... - * @u: ...unless v is equal to u. - * - * Atomically adds @a to @v, so long as it was not @u. - * Returns non-zero if @v was not @u, and zero otherwise. - */ -#define atomic_add_unless(v, a, u) \ -({ \ - int c, old; \ - c = atomic_read(v); \ - for (;;) { \ - if (unlikely(c == (u))) \ - break; \ - old = atomic_cmpxchg((v), c, c + (a)); \ - if (likely(old == c)) \ - break; \ - c = old; \ - } \ - c != (u); \ -}) -#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) - -#define atomic_inc_return(v) (atomic_add_return(1,v)) -#define atomic_dec_return(v) (atomic_sub_return(1,v)) - -#define _LGPL_SOURCE -#include <urcu/rculist.h> -#include <urcu/rcuhlist.h> -#include <urcu-pointer.h> -#endif /* #ifndef __PERFBOOK_API_H__ */ diff --git a/CodeSamples/datastruct/Issaquah/existence_test b/CodeSamples/datastruct/Issaquah/existence_test deleted file mode 100755 index a3ef38115581c15944e82e5d57ddc86e8da4afb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26359 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	<jwVBtz; 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 -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe perfbook" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html