[Openmp-commits] [openmp] r272271 - kmp_lock.h: Fix VS2013 build after r271324

Hans Wennborg via Openmp-commits openmp-commits at lists.llvm.org
Thu Jun 9 08:54:43 PDT 2016


Author: hans
Date: Thu Jun  9 10:54:43 2016
New Revision: 272271

URL: http://llvm.org/viewvc/llvm-project?rev=272271&view=rev
Log:
kmp_lock.h: Fix VS2013 build after r271324

MSVC doesn't allow std::atomic<>s in a union since they don't have trivial
copy constructor. Replacing them with e.g. std::atomic_int works, but that
breaks the GCC build on Linux, because then calls to e.g. std::atomic_load_explicit
fail, as they expect a real std::atomic<> pointer.

Fixing this with an #ifdef to unbreak the build for now.

Modified:
    openmp/trunk/runtime/src/kmp_lock.h

Modified: openmp/trunk/runtime/src/kmp_lock.h
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_lock.h?rev=272271&r1=272270&r2=272271&view=diff
==============================================================================
--- openmp/trunk/runtime/src/kmp_lock.h (original)
+++ openmp/trunk/runtime/src/kmp_lock.h Thu Jun  9 10:54:43 2016
@@ -237,6 +237,21 @@ extern void __kmp_destroy_nested_futex_l
 
 #ifdef __cplusplus
 
+#ifdef _MSC_VER
+// MSVC won't allow use of std::atomic<> in a union since it has non-trivial copy constructor.
+
+struct kmp_base_ticket_lock {
+    // `initialized' must be the first entry in the lock data structure!
+    std::atomic_bool      initialized;
+    volatile union kmp_ticket_lock *self; // points to the lock union
+    ident_t const *       location;       // Source code location of omp_init_lock().
+    std::atomic_uint      next_ticket;    // ticket number to give to next thread which acquires
+    std::atomic_uint      now_serving;    // ticket number for thread which holds the lock
+    std::atomic_int       owner_id;       // (gtid+1) of owning thread, 0 if unlocked
+    std::atomic_int       depth_locked;   // depth locked, for nested locks only
+    kmp_lock_flags_t      flags;          // lock specifics, e.g. critical section lock
+};
+#else
 struct kmp_base_ticket_lock {
     // `initialized' must be the first entry in the lock data structure!
     std::atomic<bool>     initialized;
@@ -248,6 +263,7 @@ struct kmp_base_ticket_lock {
     std::atomic<int>      depth_locked;   // depth locked, for nested locks only
     kmp_lock_flags_t      flags;          // lock specifics, e.g. critical section lock
 };
+#endif
 
 #else // __cplusplus
 




More information about the Openmp-commits mailing list