I am currently working with the v2.x branch, rather than tarballs.
While attempting to build on AIX (which is ILP32 by default), I encountered
an unexpected undefined reference to __sync_add_and_fetch_8() from
opal/class/opal_list.h.
I found that when debugging is enabled (as in almost every build I try)
there is the following code:
#if OPAL_ENABLE_DEBUG
/* Spot check: ensure this item is only on the list that we
just insertted it into */
(void)opal_atomic_add( &(item->opal_list_item_refcount), 1 );
assert(1 == item->opal_list_item_refcount);
item->opal_list_item_belong_to = list;
#endif
I am not sure why (and it may be an AIX-specific issue), but that
"opal_atomic_add()" is attempting a 64-bit add.
That is a problem, given that 'opal_list_item_refcount' is 32-bits!
Noting that all other accesses to this field are OPAL_THREAD_ADD32(), I
suggest the following (with a bonus spell-check at no additional charge):
--- opal/class/opal_list.c~ 2016-05-10 10:20:19.000000000 -0700
+++ opal/class/opal_list.c 2016-05-10 10:29:14.000000000 -0700
@@ -142,9 +142,9 @@
#if OPAL_ENABLE_DEBUG
/* Spot check: ensure this item is only on the list that we
- just insertted it into */
+ just inserted it into */
- (void)opal_atomic_add( &(item->opal_list_item_refcount), 1 );
+ (void)OPAL_THREAD_ADD32( &(item->opal_list_item_refcount), 1 );
assert(1 == item->opal_list_item_refcount);
item->opal_list_item_belong_to = list;
#endif
Source inspection shows the same mixing or opal_atomic_add() vs
OPAL_THREAD_ADD32() in master.
-Paul
--
Paul H. Hargrove [email protected]
Computer Languages & Systems Software (CLaSS) Group
Computer Science Department Tel: +1-510-495-2352
Lawrence Berkeley National Laboratory Fax: +1-510-486-6900