- smpi_privatization_regions = new s_smpi_privatization_region_t[smpi_process_count()];
-
- for (int i=0; i< smpi_process_count(); i++){
- // create SIMIX_process_count() mappings of this size with the same data inside
- int file_descriptor;
- void* address = nullptr;
- char path[24];
- int status;
-
- do {
- snprintf(path, sizeof(path), "/smpi-buffer-%06x", rand() % 0xffffffU);
- file_descriptor = shm_open(path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
- } while (file_descriptor == -1 && errno == EEXIST);
- if (file_descriptor < 0) {
- if (errno == EMFILE) {
- xbt_die("Impossible to create temporary file for memory mapping: %s\n\
+ smpi_data_exe_copy = ::operator new(smpi_data_exe_size);
+ // Make a copy of the data segment. This clean copy is retained over the whole runtime
+ // of the simulation and can be used to initialize a dynamically added, new process.
+ asan_safe_memcpy(smpi_data_exe_copy, TOPAGE(smpi_data_exe_start), smpi_data_exe_size);
+#else /* ! HAVE_PRIVATIZATION */
+ xbt_die("You are trying to use privatization on a system that does not support it. Don't.");
+#endif
+}
+
+// Initializes the memory mapping for a single process and returns the privatization region
+smpi_privatization_region_t smpi_init_global_memory_segment_process()
+{
+ int file_descriptor;
+ void* address = nullptr;
+ char path[24];
+ int status;
+
+ constexpr unsigned VAL_MASK = 0xffffffU;
+ static unsigned prev_val = VAL_MASK;
+ for (unsigned i = (prev_val + 1) & VAL_MASK; i != prev_val; i = (i + 1) & VAL_MASK) {
+ snprintf(path, sizeof(path), "/smpi-buffer-%06x", i);
+ file_descriptor = shm_open(path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ if (file_descriptor != -1 || errno != EEXIST) {
+ prev_val = i;
+ break;
+ }
+ }
+ if (file_descriptor < 0) {
+ if (errno == EMFILE) {
+ xbt_die("Impossible to create temporary file for memory mapping: %s\n\