From: Martin Quinson Date: Sun, 13 Sep 2015 22:50:06 +0000 (+0200) Subject: Use std::atomic instead of __sync_fetch_and_add for portability X-Git-Tag: v3_12~187^2~17 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/b2252602473b26e442a9c96b4f28dc089deb19f4 Use std::atomic instead of __sync_fetch_and_add for portability --- diff --git a/include/xbt/base.h b/include/xbt/base.h index 54ab2700e6..ae3f926f87 100644 --- a/include/xbt/base.h +++ b/include/xbt/base.h @@ -247,9 +247,9 @@ /* Microsoft wants to improve the code quality blah blah blah */ /* See: https://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx */ /* warning C4996: '_strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strdup. */ - # define _CRT_NONSTDC_NO_WARNINGS + #define _CRT_NONSTDC_NO_WARNINGS /* warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. */ - # define _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS #endif diff --git a/src/xbt/parmap.c b/src/xbt/parmap.cpp similarity index 99% rename from src/xbt/parmap.c rename to src/xbt/parmap.cpp index a19ed045e6..b2c952cd9d 100644 --- a/src/xbt/parmap.c +++ b/src/xbt/parmap.cpp @@ -4,6 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include + #include "internal_config.h" #ifdef HAVE_UNISTD_H #include @@ -73,7 +75,7 @@ typedef struct s_xbt_parmap { xbt_os_thread_t *workers; /**< worker thread handlers */ void_f_pvoid_t fun; /**< function to run in parallel on each element of data */ xbt_dynar_t data; /**< parameters to pass to fun in parallel */ - unsigned int index; /**< index of the next element of data to pick */ + std::atomic index; /**< index of the next element of data to pick */ #ifdef HAVE_MC int finish; @@ -304,7 +306,7 @@ void xbt_parmap_apply(xbt_parmap_t parmap, void_f_pvoid_t fun, xbt_dynar_t data) */ void* xbt_parmap_next(xbt_parmap_t parmap) { - unsigned int index = __sync_fetch_and_add(&parmap->index, 1); + unsigned int index = parmap->index++; if (index < xbt_dynar_length(parmap->data)) { return xbt_dynar_get_as(parmap->data, index, void*); } @@ -314,7 +316,7 @@ void* xbt_parmap_next(xbt_parmap_t parmap) static void xbt_parmap_work(xbt_parmap_t parmap) { unsigned index; - while ((index = __sync_fetch_and_add(&parmap->index, 1)) + while ((index = parmap->index++) < xbt_dynar_length(parmap->data)) parmap->fun(xbt_dynar_get_as(parmap->data, index, void*)); } diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 0ffc042503..6084499eb4 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -265,7 +265,7 @@ set(XBT_SRC src/xbt/lib.c src/xbt/log.c src/xbt/mallocator.c - src/xbt/parmap.c + src/xbt/parmap.cpp src/xbt/set.c src/xbt/setset.c src/xbt/snprintf.c