Added CDS_VERIFY_EQ debug macro
[libcds.git] / cds / details / defs.h
index 3e4d53fbcf3ad955ec10ed7124d2097bbb44d4a2..4d382aeae1c8ddae3aeca13fac489f4f18cde21f 100644 (file)
@@ -1,7 +1,7 @@
 /*
     This file is a part of libcds - Concurrent Data Structures library
 
-    (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
+    (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
 
     Source code repo: http://github.com/khizmax/libcds/
     Download: http://sourceforge.net/projects/libcds/files/
@@ -32,6 +32,7 @@
 #define CDSLIB_DEFS_H
 
 #include <stddef.h>
+#include <stdlib.h>
 #include <assert.h>
 #include <cstdint>
 #include <exception>
    \par How to build
 
    The <b>cds</b> is mostly header-only library. Only small part of library related to GC core functionality
-   should be compiled.
+   should be compiled. <b>cds</b> depends on C++ standard library only.
 
-   External dependenies: the tests depends on:
+   Test suite depends on:
    - \p boost.thread (thread-loal storage support), boost.system
    - \p google-test
 
+   Some parts of libcds may depend on DCAS (double-width compare-and-swap) atomic primitive if
+   the target architecture supports it. For x86, cmake build script enables -mcx16 compiler flag that
+   switches DCAS support on. You may manually disable DCAS support with the following  command line flags
+   in GCC/clang (for MS VC++ compiler DCAS is not supported):
+   - \p -DCDS_DISABLE_128BIT_ATOMIC - for 64bit build
+   - \p -DCDS_DISABLE_64BIT_ATOMIC - for 32bit build
+
+   @warning All your projects AND libcds MUST be compiled with the same flags - either with DCAS support or without it.
+
    \par Windows build
 
    Prerequisites: for building <b>cds</b> library and test suite you need:
     - <a href="http://www.boost.org/">boost library</a> 1.51 and above. You should create environment variable
         \p BOOST_PATH containing full path to \p boost root directory (for example, <tt>C:\\libs\\boost_1_57_0</tt>).
 
-   Open solution file <tt>cds\projects\vc14\cds.sln</tt> with Microsoft VisualStudio 2015.
+   Open solution file <tt>cds\projects\vc141\cds.sln</tt> with Microsoft VisualStudio 2017.
    The solution contains \p cds project and a lot of test projects. Just build the library using solution.
 
    <b>Warning</b>: the solution depends on \p BOOST_PATH environment variable that specifies full path
    For Unix-like systems GCC and Clang compilers are supported.
    Use GCC 4.8+ compiler or Clang 3.6+ to build <b>cds</b> library with CMake.
    See accompanying file <tt>/build/cmake/readme.md</tt> for more info.
-
-   @note Important for GCC compiler: all your projects that use \p libcds must be compiled with <b>-fno-strict-aliasing</b>
-   compiler flag.
-
 */
 
 
@@ -339,11 +345,15 @@ namespace cds {}
 
 // CDS_VERIFY: Debug - assert(_expr); Release - _expr
 #ifdef CDS_DEBUG
-#   define CDS_VERIFY( _expr )    assert( _expr )
+#   define CDS_VERIFY( _expr )       assert( _expr )
+#   define CDS_VERIFY_FALSE( _expr ) assert( !( _expr ))
 #   define CDS_DEBUG_ONLY( _expr )        _expr
+#   define CDS_VERIFY_EQ( expr, val )   assert( expr == val )
 #else
 #   define CDS_VERIFY( _expr )    _expr
+#   define CDS_VERIFY_FALSE( _expr ) _expr
 #   define CDS_DEBUG_ONLY( _expr )
+#   define CDS_VERIFY_EQ( expr, val )   expr
 #endif
 
 #ifdef CDS_STRICT
@@ -352,6 +362,14 @@ namespace cds {}
 #   define CDS_STRICT_DO( _expr )
 #endif
 
+#ifdef CDS_DEBUG
+#   define cds_assert( expr )       assert( expr )
+#else
+    static inline void cds_assert( bool expr ) {
+        if ( !expr )
+            abort();
+    }
+#endif
 
 // Compiler-specific defines
 #include <cds/compiler/defs.h>