work in progress
[nbds] / include / common.h
1 /*
2  * Written by Josh Dybnis and released to the public domain, as explained at
3  * http://creativecommons.org/licenses/publicdomain
4  */
5 #ifndef COMMON_H
6 #define COMMON_H
7
8 #include <stdlib.h>
9 #include <assert.h>
10 #include <limits.h>
11 #include <string.h>
12 #include <sys/types.h>
13
14 #define CACHE_LINE_SIZE  64 // 64 byte cache line on x86 and x86-64
15 #define CACHE_LINE_SCALE 6  // log base 2 of the cache line size
16
17 #define EXPECT_TRUE(x)      __builtin_expect(!!(x), 1)
18 #define EXPECT_FALSE(x)     __builtin_expect(!!(x), 0)
19
20 #ifndef NBD_SINGLE_THREADED
21
22 #define MAX_NUM_THREADS  32 // make this whatever you want, but make it a power of 2
23
24 #define SYNC_SWAP(addr,x)         __sync_lock_test_and_set(addr,x)
25 #define SYNC_CAS(addr,old,x)      __sync_val_compare_and_swap(addr,old,x)
26 #define SYNC_ADD(addr,n)          __sync_add_and_fetch(addr,n)
27 #define SYNC_FETCH_AND_OR(addr,x) __sync_fetch_and_or(addr,x)
28 #else// NBD_SINGLE_THREADED
29
30 #define MAX_NUM_THREADS  1
31
32 #define SYNC_SWAP(addr,x)         ({ typeof(*(addr)) _old = *(addr); *(addr)  = (x); _old; })
33 #define SYNC_CAS(addr,old,x)      ({ typeof(*(addr)) _old = *(addr); *(addr)  = (x); _old; })
34 //#define SYNC_CAS(addr,old,x)    ({ typeof(*(addr)) _old = *(addr); if ((old) == _old) { *(addr)  = (x); } _old; })
35 #define SYNC_ADD(addr,n)          ({ typeof(*(addr)) _old = *(addr); *(addr) += (n); _old; })
36 #define SYNC_FETCH_AND_OR(addr,x) ({ typeof(*(addr)) _old = *(addr); *(addr) |= (x); _old; })
37
38 #endif//NBD_SINGLE_THREADED
39
40 #define COUNT_TRAILING_ZEROS __builtin_ctz
41
42 #define MASK(n)     ((1ULL << (n)) - 1)
43
44 #define TRUE  1
45 #define FALSE 0
46
47 #ifdef NBD32
48 #define TAG1         (1U << 31)
49 #define TAG2         (1U << 30)
50 #else
51 #define TAG1         (1ULL << 63)
52 #define TAG2         (1ULL << 62)
53 #endif
54 #define TAG_VALUE(v, tag) ((v) |  tag)
55 #define IS_TAGGED(v, tag) ((v) &  tag)
56 #define STRIP_TAG(v, tag) ((v) & ~tag)
57
58 #define DOES_NOT_EXIST 0
59 #define ERROR_INVALID_OPTION      (-1)
60 #define ERROR_INVALID_ARGUMENT    (-2)
61 #define ERROR_UNSUPPORTED_FEATURE (-3)
62 #define ERROR_TXN_NOT_RUNNING     (-4)
63
64 #define VOLATILE_DEREF(x) (*((volatile typeof(x))(x)))
65
66 typedef unsigned long long uint64_t;
67 typedef unsigned int       uint32_t;
68 typedef unsigned short     uint16_t;
69 typedef unsigned char      uint8_t;
70
71 typedef size_t markable_t;
72
73 static inline uint64_t rdtsc (void) {
74     unsigned l, u;
75     __asm__ __volatile__("rdtsc" : "=a" (l), "=d" (u));
76     return ((uint64_t)u << 32) | l;
77 }
78
79 #include "lwt.h"
80 #endif //COMMON_H