star-enclosures-3d

Extract enclosures from 3D geometry
git clone git://git.meso-star.fr/star-enclosures-3d.git
Log | Files | Refs | README | LICENSE

commit f36753feec820985af069759ffb8459110783e37
parent e8d332bf208083aa0b1e932599d5efa2b53923dc
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon, 20 Aug 2018 15:29:52 +0200

Stop using dedicated atomic stuff for pointers

Diffstat:
Msrc/senc_scene_analyze.c | 30++++++++++++------------------
1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/src/senc_scene_analyze.c b/src/senc_scene_analyze.c @@ -27,16 +27,6 @@ #include <rsys/hash_table.h> #include <rsys/dynamic_array.h> -#if defined(COMPILER_GCC) -#define ATOMIC_CAS_PTR(Atom, NewVal, Comparand) /* Return the initial value */ \ - ATOMIC_CAS((Atom), (NewVal), (Comparand)) -#elif defined(COMPILER_CL) -#define ATOMIC_CAS_PTR(Atom, NewVal, Comparand) /* Return the initial value */ \ - (InterlockedCompareExchangePointer(Atom, NewVal, Comparand)) -#else -#error "Undefined atomic operations" -#endif - #include <star/s3d.h> #include <omp.h> @@ -554,7 +544,7 @@ group_connex_components struct darray_ptr_component_descriptor* connex_components, struct s3d_scene_view* s3d_view, ATOMIC* next_enclosure_id, - struct cc_descriptor** infinity_first_cc, + ATOMIC* infinity_first_cc, /* Shared error status. * We accept to overwritte an error with a different error */ res_T* res) @@ -615,29 +605,31 @@ group_connex_components } /* If no hit, the component is facing an infinite medium */ if(S3D_HIT_NONE(&hit)) { + struct cc_descriptor* inf_first_cc; cc->cc_group_root = CC_GROUP_ROOT_INFINITE; cc->enclosure_id = 0; /* Keep track of the first component facing infinity */ - ATOMIC_CAS_PTR(infinity_first_cc, cc, NULL); - if((*infinity_first_cc)->medium != cc->medium) { + ATOMIC_CAS(infinity_first_cc, (ATOMIC)cc, (ATOMIC)NULL); + inf_first_cc = (struct cc_descriptor*)ATOMIC_GET(infinity_first_cc); + if(inf_first_cc->medium != cc->medium) { /* Medium mismatch! Model topology is broken. */ const double* infinity_max_vrtx = - positions[(*infinity_first_cc)->max_z_vrtx_id].vec; + positions[inf_first_cc->max_z_vrtx_id].vec; log_err(desc->scene->dev, "Medium mismatch found between vertex %lu and vertex %lu," " both facing infinity.\n", - (unsigned long)(*infinity_first_cc)->max_z_vrtx_id, + (unsigned long)inf_first_cc->max_z_vrtx_id, (unsigned long)cc->max_z_vrtx_id); log_err(desc->scene->dev, "Vertex %lu: (%g %g %g)\n", - (unsigned long)(*infinity_first_cc)->max_z_vrtx_id, + (unsigned long)inf_first_cc->max_z_vrtx_id, SPLIT3(infinity_max_vrtx)); log_err(desc->scene->dev, "Vertex %lu: (%g %g %g)\n", (unsigned long)cc->max_z_vrtx_id, SPLIT3(max_vrtx)); log_err(desc->scene->dev, "Media: %lu VS %lu\n", - (unsigned long)(*infinity_first_cc)->medium, (unsigned long)cc->medium); + (unsigned long)inf_first_cc->medium, (unsigned long)cc->medium); *res = RES_BAD_ARG; } /* Same medium as previous members of the group: OK */ @@ -1120,7 +1112,9 @@ senc_scene_analyze(struct senc_scene* scn, struct senc_descriptor** out_desc) ATOMIC component_count = 0; ATOMIC next_enclosure_id = 1; /* Used as args to have shared vars between threads in functions */ - struct cc_descriptor* infinity_first_cc = NULL; + static_assert(sizeof(intptr_t) == sizeof(ATOMIC), + "Cannot use ATOMIC to store pointers"); + ATOMIC infinity_first_cc = (ATOMIC)NULL; res_T res = RES_OK; res_T res2 = RES_OK;