]> git.ipfire.org Git - thirdparty/bird.git/blobdiff - lib/birdlib.h
Filter: Fix function comparison
[thirdparty/bird.git] / lib / birdlib.h
index 37337078d4bb99fb909421fb16e876ab5cecbeef..5202b0c8b2ae20765b73ce5255801990f49a96a9 100644 (file)
@@ -9,14 +9,16 @@
 #ifndef _BIRD_BIRDLIB_H_
 #define _BIRD_BIRDLIB_H_
 
-#include "timer.h"
-#include "alloca.h"
+#include "lib/alloca.h"
 
 /* Ugly structure offset handling macros */
 
+struct align_probe { char x; long int y; };
+
 #define OFFSETOF(s, i) ((size_t) &((s *)0)->i)
 #define SKIP_BACK(s, i, p) ((s *)((char *)p - OFFSETOF(s, i)))
 #define BIRD_ALIGN(s, a) (((s)+a-1)&~(a-1))
+#define CPU_STRUCT_ALIGN (sizeof(struct align_probe))
 
 /* Utility macros */
 
 #define ABS(a)   ((a)>=0 ? (a) : -(a))
 #define DELTA(a,b) (((a)>=(b))?(a)-(b):(b)-(a))
 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(*(a)))
+#define BYTES(n) ((((uint) (n)) + 7) / 8)
+#define CALL(fn, args...) ({ if (fn) fn(args); })
+#define ADVANCE(w, r, l) ({ r -= (l); w += (l); })
+
+static inline int uint_cmp(uint i1, uint i2)
+{ return (int)(i1 > i2) - (int)(i1 < i2); }
+
+static inline int u64_cmp(u64 i1, u64 i2)
+{ return (int)(i1 > i2) - (int)(i1 < i2); }
 
 
 /* Bitfield macros */
 #define BIT32_CLR(b,p)         ((b)[(p)/32] &= ~BIT32_VAL(p))
 #define BIT32_ZERO(b,l)                memset((b), 0, (l)/8)
 
+/* The same, but counting bits from MSB */
+#define BIT32R_VAL(p)          ((((u32) 1) << 31) >> ((p) % 32))
+#define BIT32R_TEST(b,p)       ((b)[(p)/32] & BIT32R_VAL(p))
+#define BIT32R_SET(b,p)                ((b)[(p)/32] |= BIT32R_VAL(p))
+#define BIT32R_CLR(b,p)                ((b)[(p)/32] &= ~BIT32R_VAL(p))
+#define BIT32R_ZERO(b,l)       memset((b), 0, (l)/8)
+
 #ifndef NULL
 #define NULL ((void *) 0)
 #endif
 
-#ifndef IPV6
-#define IP_VERSION 4
-#else
-#define IP_VERSION 6
-#endif
-
-
 /* Macros for gcc attributes */
 
 #define NORET __attribute__((noreturn))
 #define UNUSED __attribute__((unused))
 #define PACKED __attribute__((packed))
 
-#ifdef IPV6
-#define UNUSED4
-#define UNUSED6 UNUSED
-#else
-#define UNUSED4 UNUSED
-#define UNUSED6
+#ifndef HAVE_THREAD_LOCAL
+#define _Thread_local
 #endif
 
 /* Microsecond time */
 
 typedef s64 btime;
+//typedef s64 bird_clock_t;
 
-#define S_     *1000000
-#define MS_    *1000
-#define US_    *1
+#define S_     * (btime) 1000000
+#define MS_    * (btime) 1000
+#define US_    * (btime) 1
 #define TO_S   /1000000
 #define TO_MS  /1000
 #define TO_US  /1
@@ -85,39 +93,26 @@ typedef s64 btime;
 #define S      S_
 #define MS     MS_
 #define US     US_
+#define NS     /1000
 #endif
 
+#define TIME_INFINITY ((s64) 0x7fffffffffffffff)
+
 
 /* Rate limiting */
 
 struct tbf {
-  bird_clock_t timestamp;              /* Last update */
-  u16 count;                           /* Available tokens */
+  btime timestamp;                     /* Last update */
+  u64 count;                           /* Available micro-tokens */
   u16 burst;                           /* Max number of tokens */
-  u16 rate;                            /* Rate of replenishment */
-  u16 mark;                            /* Whether last op was limited */
+  u16 rate;                            /* Rate of replenishment (tokens / sec) */
+  u32 drop;                            /* Number of failed request since last successful */
 };
 
 /* Default TBF values for rate limiting log messages */
 #define TBF_DEFAULT_LOG_LIMITS { .rate = 1, .burst = 5 }
 
-void tbf_update(struct tbf *f);
-
-static inline int
-tbf_limit(struct tbf *f)
-{
-  tbf_update(f);
-
-  if (!f->count)
-  {
-    f->mark = 1;
-    return 1;
-  }
-
-  f->count--;
-  f->mark = 0;
-  return 0;
-}
+int tbf_limit(struct tbf *f);
 
 
 /* Logging and dying */
@@ -157,7 +152,7 @@ void bug(const char *msg, ...) NORET;
 #define L_FATAL "\010"                 /* Fatal errors */
 #define L_BUG "\011"                   /* BIRD bugs */
 
-void debug(const char *msg, ...);              /* Printf to debug output */
+void debug(const char *msg, ...);      /* Printf to debug output */
 
 /* Debugging */
 
@@ -168,9 +163,18 @@ void debug(const char *msg, ...);          /* Printf to debug output */
 #endif
 
 #ifdef DEBUGGING
-#define ASSERT(x) do { if (!(x)) bug("Assertion `%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)
+#define ASSERT(x) do { if (!(x)) bug("Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)
 #else
-#define ASSERT(x) do { } while(0)
+#define ASSERT(x) do { if (!(x)) log(L_BUG "Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)
+#endif
+
+#ifdef DEBUGGING
+asm(
+    ".pushsection \".debug_gdb_scripts\", \"MS\",@progbits,1\n"
+    ".byte 1\n" /* Python */
+    ".asciz \"bird-gdb.py\"\n"
+    ".popsection\n"
+   );
 #endif
 
 /* Pseudorandom numbers */