|
28 | 28 | #include <stdio.h>
|
29 | 29 | #include <limits.h>
|
30 | 30 | #include <string.h>
|
| 31 | +#include <pthread.h> |
31 | 32 |
|
32 | 33 | #define SHMEM_INTERNAL_INCLUDE
|
33 | 34 | #include "shmem.h"
|
|
37 | 38 | #include "runtime.h"
|
38 | 39 | #include "build_info.h"
|
39 | 40 | #include "shmem_team.h"
|
| 41 | +#include "shmem_atomic.h" |
40 | 42 |
|
41 | 43 | #if defined(ENABLE_REMOTE_VIRTUAL_ADDRESSING) && defined(__linux__)
|
42 | 44 | #include <sys/personality.h>
|
@@ -89,10 +91,10 @@ int shmem_external_heap_device = -1;
|
89 | 91 |
|
90 | 92 | int shmem_internal_my_pe = -1;
|
91 | 93 | int shmem_internal_num_pes = -1;
|
92 |
| -int shmem_internal_initialized = 0; |
93 |
| -int shmem_internal_finalized = 0; |
| 94 | +shmem_internal_cntr_t shmem_internal_init_cntr = 0; |
94 | 95 | int shmem_internal_initialized_with_start_pes = 0;
|
95 | 96 | int shmem_internal_global_exit_called = 0;
|
| 97 | +int shmem_internal_inited_once = 0; |
96 | 98 |
|
97 | 99 | int shmem_internal_thread_level;
|
98 | 100 |
|
@@ -134,44 +136,58 @@ shmem_internal_randr_fini(void)
|
134 | 136 | return;
|
135 | 137 | }
|
136 | 138 |
|
137 |
| - |
138 | 139 | static void
|
139 |
| -shmem_internal_shutdown(void) |
| 140 | +shmem_release_resources(void) |
140 | 141 | {
|
141 |
| - if (!shmem_internal_initialized || |
142 |
| - shmem_internal_finalized) { |
143 |
| - return; |
| 142 | + if (shmem_internal_params.DEBUG) { |
| 143 | + DEBUG_MSG("releasing resources\n"); |
144 | 144 | }
|
145 | 145 |
|
146 |
| - shmem_internal_barrier_all(); |
147 |
| - |
148 |
| - shmem_internal_finalized = 1; |
149 |
| - |
150 | 146 | shmem_internal_team_fini();
|
151 |
| - |
152 | 147 | shmem_transport_fini();
|
153 |
| - |
154 | 148 | shmem_shr_transport_fini();
|
155 |
| - |
156 | 149 | SHMEM_MUTEX_DESTROY(shmem_internal_mutex_alloc);
|
157 |
| - |
158 | 150 | shmem_internal_randr_fini();
|
159 |
| - |
160 | 151 | shmem_internal_symmetric_fini();
|
161 | 152 | shmem_runtime_fini();
|
162 | 153 | }
|
163 | 154 |
|
164 | 155 |
|
| 156 | +static void |
| 157 | +shmem_internal_shutdown(void) |
| 158 | +{ |
| 159 | + if (!shmem_internal_cntr_read(&shmem_internal_init_cntr)) { |
| 160 | + RAISE_WARN_STR("too many calls to shmem_finalize"); |
| 161 | + return; |
| 162 | + } |
| 163 | + |
| 164 | + shmem_internal_barrier_all(); |
| 165 | + |
| 166 | +#ifndef USE_MULTI_INIT |
| 167 | + shmem_release_resources(); |
| 168 | +#else |
| 169 | + shmem_internal_cntr_dec(&shmem_internal_init_cntr); |
| 170 | +#endif |
| 171 | + |
| 172 | + return; |
| 173 | +} |
| 174 | + |
| 175 | + |
165 | 176 | static void
|
166 | 177 | shmem_internal_shutdown_atexit(void)
|
167 | 178 | {
|
168 |
| - if ( shmem_internal_initialized && !shmem_internal_finalized && |
169 |
| - !shmem_internal_initialized_with_start_pes && !shmem_internal_global_exit_called && |
170 |
| - shmem_internal_my_pe == 0) { |
171 |
| - RAISE_WARN_STR("shutting down without a call to shmem_finalize"); |
| 179 | + if (shmem_internal_cntr_read(&shmem_internal_init_cntr) && |
| 180 | + !shmem_internal_initialized_with_start_pes && |
| 181 | + !shmem_internal_global_exit_called && |
| 182 | + shmem_internal_my_pe == 0) { |
| 183 | + |
| 184 | + RAISE_WARN_STR("too few calls to shmem_finalize"); |
172 | 185 | }
|
173 | 186 |
|
174 |
| - shmem_internal_shutdown(); |
| 187 | +#ifdef USE_MULTI_INIT |
| 188 | + shmem_release_resources(); |
| 189 | +#endif |
| 190 | + |
175 | 191 | }
|
176 | 192 |
|
177 | 193 |
|
@@ -518,7 +534,6 @@ shmem_internal_heap_postinit(void)
|
518 | 534 | randr_initialized = 1;
|
519 | 535 |
|
520 | 536 | atexit(shmem_internal_shutdown_atexit);
|
521 |
| - shmem_internal_initialized = 1; |
522 | 537 |
|
523 | 538 | /* finish up */
|
524 | 539 | #ifndef USE_PMIX
|
@@ -554,11 +569,25 @@ shmem_internal_init(int tl_requested, int *tl_provided)
|
554 | 569 | {
|
555 | 570 | int ret;
|
556 | 571 |
|
557 |
| - ret = shmem_internal_heap_preinit(tl_requested, tl_provided); |
558 |
| - if (ret) goto cleanup; |
| 572 | +#ifndef USE_MULTI_INIT |
| 573 | + if (shmem_internal_cntr_read(&shmem_internal_init_cntr)) { |
| 574 | + RAISE_ERROR_STR("attempt to reinitialize library"); |
| 575 | + } |
| 576 | +#endif |
559 | 577 |
|
560 |
| - ret = shmem_internal_heap_postinit(); |
561 |
| - if (ret) goto cleanup; |
| 578 | + if (shmem_internal_cntr_fadd(&shmem_internal_init_cntr, 1) == 0 |
| 579 | + && !shmem_internal_inited_once) { |
| 580 | + |
| 581 | + shmem_internal_inited_once = 1; |
| 582 | + |
| 583 | + ret = shmem_internal_heap_preinit(tl_requested, tl_provided); |
| 584 | + if (ret) goto cleanup; |
| 585 | + |
| 586 | + ret = shmem_internal_heap_postinit(); |
| 587 | + if (ret) goto cleanup; |
| 588 | + } else { |
| 589 | + *tl_provided = shmem_internal_thread_level; |
| 590 | + } |
562 | 591 |
|
563 | 592 | return 0;
|
564 | 593 |
|
|
0 commit comments