diff --git a/modules/internal/LocaleModelHelpSetup.chpl b/modules/internal/LocaleModelHelpSetup.chpl index a95170b05ee9..243ffa7a8c1f 100644 --- a/modules/internal/LocaleModelHelpSetup.chpl +++ b/modules/internal/LocaleModelHelpSetup.chpl @@ -39,7 +39,8 @@ module LocaleModelHelpSetup { config param debugLocaleModel = false; - extern var chpl_nodeID: chpl_nodeID_t; + pragma "fn synchronization free" + extern "get_chpl_nodeID" proc chpl_nodeID: chpl_nodeID_t; record chpl_root_locale_accum { var nPUsPhysAcc: atomic int; diff --git a/runtime/include/chpl-comm.h b/runtime/include/chpl-comm.h index ffb5bec0d833..c20c45df8e2a 100644 --- a/runtime/include/chpl-comm.h +++ b/runtime/include/chpl-comm.h @@ -41,6 +41,14 @@ extern c_nodeid_t chpl_nodeID; // unique ID for each node: 0, 1, 2, ... // the current task is running. // Note also that this value is set only in chpl_comm_init to a value which is // (hopefully) unique to the running image, and never changed again. + +// +// Helper function for Chapel to get the value of chpl_nodeID +// +static inline c_nodeid_t get_chpl_nodeID(void) { + return chpl_nodeID; +} + extern int32_t chpl_numNodes; // number of nodes size_t chpl_comm_getenvMaxHeapSize(void); diff --git a/test/localeModels/dmk/locale_name.chpl b/test/localeModels/dmk/locale_name.chpl index 058e8ffb239a..6f6e42761dfa 100644 --- a/test/localeModels/dmk/locale_name.chpl +++ b/test/localeModels/dmk/locale_name.chpl @@ -1,5 +1,4 @@ extern proc chpl_nodeName(): c_string; -extern var chpl_nodeID: chpl_nodeID_t; var locale_name = here.chpl_name(); diff --git a/test/localeModels/nodeIDbug.chpl b/test/localeModels/nodeIDbug.chpl new file mode 100644 index 000000000000..ef19a220a678 --- /dev/null +++ b/test/localeModels/nodeIDbug.chpl @@ -0,0 +1,23 @@ +var s$: sync int = 0; + +writeln("coforall: "); +coforall loc in Locales { + on loc { + while (s$.readFF() != here.id) { } + s$.readFE(); + writeln("chpl_nodeID: ", chpl_nodeID, ", here.id = ", here.id); + s$.writeEF(here.id+1); + } +} +writeln(); +s$.writeXF(0); + +writeln("forall: "); +forall loc in Locales { + on loc { + while (s$.readFF() != here.id) { } + s$.readFE(); + writeln("chpl_nodeID: ", chpl_nodeID, ", here.id = ", here.id); + s$.writeEF(here.id+1); + } +} diff --git a/test/localeModels/nodeIDbug.comm-none.good b/test/localeModels/nodeIDbug.comm-none.good new file mode 100644 index 000000000000..8ae7967010af --- /dev/null +++ b/test/localeModels/nodeIDbug.comm-none.good @@ -0,0 +1,5 @@ +coforall: +chpl_nodeID: 0, here.id = 0 + +forall: +chpl_nodeID: 0, here.id = 0 diff --git a/test/localeModels/nodeIDbug.good b/test/localeModels/nodeIDbug.good new file mode 100644 index 000000000000..26e74e64cbc5 --- /dev/null +++ b/test/localeModels/nodeIDbug.good @@ -0,0 +1,11 @@ +coforall: +chpl_nodeID: 0, here.id = 0 +chpl_nodeID: 1, here.id = 1 +chpl_nodeID: 2, here.id = 2 +chpl_nodeID: 3, here.id = 3 + +forall: +chpl_nodeID: 0, here.id = 0 +chpl_nodeID: 1, here.id = 1 +chpl_nodeID: 2, here.id = 2 +chpl_nodeID: 3, here.id = 3 diff --git a/test/localeModels/nodeIDbug.numlocales b/test/localeModels/nodeIDbug.numlocales new file mode 100644 index 000000000000..b8626c4cff28 --- /dev/null +++ b/test/localeModels/nodeIDbug.numlocales @@ -0,0 +1 @@ +4