Skip to content

Commit 45d6c62

Browse files
committed
bugfix: handle the case where the adt is persistent
1 parent 5a5aa5f commit 45d6c62

File tree

14 files changed

+60
-62
lines changed

14 files changed

+60
-62
lines changed

parsec/data.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,8 @@ parsec_data_destroy( parsec_data_t *data )
568568

569569
/* adt constructor is split in two stages: when the adt is constructed
570570
* with OBJ_CONSTRUCT (or allocated with OBJ_NEW), we initialize the
571-
* adt object. The user code must then call the parameterized constructor
571+
* adt object with static zero values.
572+
* The user code must then call the parameterized constructor
572573
* (below) that attaches the datatype and creates the associated arena.
573574
*
574575
* When the adt object is destructed (or released), the implicit destructor
@@ -583,11 +584,23 @@ int parsec_arena_datatype_construct(parsec_arena_datatype_t *adt,
583584
adt->arena = PARSEC_OBJ_NEW(parsec_arena_t);
584585
parsec_arena_construct(adt->arena, elem_size,
585586
alignment);
587+
adt->opaque_dtt = opaque_dtt;
588+
return PARSEC_SUCCESS;
589+
}
590+
591+
/* This constructor must only initialize fields with static values.
592+
* When the user is using a persistent adt, the PTG generator will
593+
* construct_zero the static arenas, and the user will overwrite them
594+
* without calling destruct, which is valid only if this function does
595+
* not allocate memory.
596+
*/
597+
static void parsec_arena_datatype_construct_zero(parsec_object_t *obj) {
598+
parsec_arena_datatype_t *adt = (parsec_arena_datatype_t *)obj;
599+
adt->arena = NULL;
586600
adt->ht_item.next_item = NULL; /* keep Coverity happy */
587601
adt->ht_item.hash64 = 0; /* keep Coverity happy */
588602
adt->ht_item.key = 0; /* keep Coverity happy */
589-
adt->opaque_dtt = opaque_dtt;
590-
return PARSEC_SUCCESS;
603+
adt->opaque_dtt = NULL;
591604
}
592605

593606
static void parsec_arena_datatype_destruct(parsec_object_t *obj) {
@@ -596,5 +609,5 @@ static void parsec_arena_datatype_destruct(parsec_object_t *obj) {
596609
}
597610

598611
PARSEC_OBJ_CLASS_INSTANCE(parsec_arena_datatype_t, parsec_object_t,
599-
NULL,
612+
parsec_arena_datatype_construct_zero,
600613
parsec_arena_datatype_destruct);

parsec/data_dist/matrix/matrix.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,10 @@ int parsec_matrix_arena_datatype_destruct_free_type(parsec_arena_datatype_t *adt
366366
parsec_matrix_arena_datatype_construct_alloc_type( (_adt_), (_oldtype_), PARSEC_MATRIX_FULL, 0, (_m_), (_n_), (_ld_), PARSEC_ARENA_ALIGNMENT_SSE, -1 ), \
367367
(_adt_))
368368

369-
#define parsec_matrix_adt_free(_adt_) do {\
370-
parsec_matrix_arena_datatype_destruct_free_type(_adt_); \
371-
free(_adt_); \
369+
#define parsec_matrix_adt_free(_padt_) do {\
370+
parsec_matrix_arena_datatype_destruct_free_type(*(_padt_)); \
371+
free(*(_padt_)); \
372+
(*_padt_) = NULL; \
372373
} while(0)
373374

374375

parsec/interfaces/ptg/ptg-compiler/jdf2c.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4758,7 +4758,10 @@ static void jdf_generate_constructor( const jdf_t* jdf )
47584758
* stages, one in the generated code runs the generic constructor, then
47594759
* the user code calls the parameterized constructor (that attaches the
47604760
* datatype). Thus, for symmetry the user code is also responsible for calling
4761-
* the destructor. */
4761+
* the destructor.
4762+
* The statically constructed arena_datatype_t can be overwritten by
4763+
* the user without leaking memory.
4764+
*/
47624765
coutput(" for(i = 0; i < (uint32_t)__parsec_tp->super.arenas_datatypes_size; i++) {\n"
47634766
" PARSEC_OBJ_CONSTRUCT(&__parsec_tp->super.arenas_datatypes[i], parsec_arena_datatype_t);\n"
47644767
" }\n");

tests/apps/haar_tree/main.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ int main(int argc, char *argv[])
143143
parsec_matrix_block_cyclic_t fakeDesc;
144144
parsec_project_taskpool_t *project;
145145
parsec_walk_taskpool_t *walker;
146-
parsec_arena_datatype_t adt;
146+
parsec_arena_datatype_t *adt = PARSEC_OBJ_NEW(parsec_arena_datatype_t);
147147
int do_checks = 0, be_verbose = 0;
148148
int pargc = 0, i;
149149
char **pargv;
@@ -216,24 +216,22 @@ int main(int argc, char *argv[])
216216
0, 0, world, world,
217217
1, world, 1, 1, 0, 0);
218218

219-
parsec_matrix_adt_construct_rect( &adt,
219+
parsec_matrix_adt_construct_rect( adt,
220220
parsec_datatype_float_t, 2, 1, 2);
221221

222222
#if defined(HAVE_MPI)
223223
MPI_Barrier(MPI_COMM_WORLD);
224224
#endif
225225

226226
project = parsec_project_new(treeA, world, (parsec_data_collection_t*)&fakeDesc, 1e-3, be_verbose, 1.0);
227-
project->arenas_datatypes[PARSEC_project_DEFAULT_ADT_IDX] = adt;
228-
PARSEC_OBJ_RETAIN(adt.arena);
227+
project->arenas_datatypes[PARSEC_project_DEFAULT_ADT_IDX] = *adt;
229228
rc = parsec_context_add_taskpool(parsec, &project->super);
230229
PARSEC_CHECK_ERROR(rc, "parsec_context_add_taskpool");
231230
rc = parsec_context_start(parsec);
232231
PARSEC_CHECK_ERROR(rc, "parsec_context_start");
233232
rc = parsec_context_wait(parsec);
234233
PARSEC_CHECK_ERROR(rc, "parsec_context_wait");
235234

236-
project->arenas_datatypes[PARSEC_project_DEFAULT_ADT_IDX].arena = NULL;
237235
parsec_taskpool_free(&project->super);
238236
ret = 0;
239237

@@ -247,7 +245,7 @@ int main(int argc, char *argv[])
247245
rs, print_node_fn, print_link_fn,
248246
be_verbose);
249247
}
250-
walker->arenas_datatypes[PARSEC_walk_DEFAULT_ADT_IDX] = adt;
248+
walker->arenas_datatypes[PARSEC_walk_DEFAULT_ADT_IDX] = *adt;
251249
rc = parsec_context_add_taskpool(parsec, &walker->super);
252250
PARSEC_CHECK_ERROR(rc, "parsec_context_add_taskpool");
253251
rc = parsec_context_start(parsec);
@@ -291,9 +289,8 @@ int main(int argc, char *argv[])
291289
}
292290
}
293291
#endif /* defined(HAVE_MPI) */
294-
parsec_matrix_arena_datatype_destruct_free_type( & adt );
292+
parsec_matrix_adt_free( &adt );
295293

296-
walker->arenas_datatypes[PARSEC_walk_DEFAULT_ADT_IDX].arena = NULL;
297294
parsec_taskpool_free(&walker->super);
298295

299296
tree_dist_free(treeA);

tests/collections/reshape/common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ int reshape_print(parsec_execution_stream_t *es,
131131
parsec_arena_datatype_t adt_default; \
132132
parsec_arena_datatype_t adt_lower; \
133133
parsec_arena_datatype_t adt_upper; \
134+
PARSEC_OBJ_CONSTRUCT(&adt_default, parsec_arena_datatype_t); \
135+
PARSEC_OBJ_CONSTRUCT(&adt_lower, parsec_arena_datatype_t); \
136+
PARSEC_OBJ_CONSTRUCT(&adt_upper, parsec_arena_datatype_t); \
134137
parsec_matrix_adt_construct_rect( &adt_default, \
135138
parsec_datatype_int_t, MB, NB, MB ); \
136139
parsec_matrix_adt_construct_lower( &adt_lower, \

tests/collections/reshape/testing_avoidable_reshape.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ int main(int argc, char *argv[])
9292
parsec_datatype_t tmp = adt_default.opaque_dtt;
9393
ctp->arenas_datatypes[PARSEC_avoidable_reshape_DEFAULT_ADT_IDX].opaque_dtt = dcA.super.super.default_dtt;
9494
#endif
95-
PARSEC_OBJ_RETAIN(adt_default.arena);
9695

9796
DO_RUN(ctp);
9897
DO_CHECK(avoidable_reshape, dcA, dcA_check);

tests/collections/reshape/testing_remote_multiple_outs_same_pred_flow.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,6 @@ int main(int argc, char *argv[])
116116
ctp->arenas_datatypes[PARSEC_remote_multiple_outs_same_pred_flow_DEFAULT_ADT_IDX] = adt_default;
117117
ctp->arenas_datatypes[PARSEC_remote_multiple_outs_same_pred_flow_LOWER_TILE_ADT_IDX] = adt_lower;
118118
ctp->arenas_datatypes[PARSEC_remote_multiple_outs_same_pred_flow_UPPER_TILE_ADT_IDX] = adt_upper;
119-
PARSEC_OBJ_RETAIN(adt_default.arena);
120-
PARSEC_OBJ_RETAIN(adt_lower.arena);
121-
PARSEC_OBJ_RETAIN(adt_upper.arena);
122119

123120
DO_RUN(ctp);
124121
DO_CHECK(remote_multiple_outs_same_pred_flow, dcA, dcA_check);

tests/collections/reshape/testing_reshape.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ int main(int argc, char *argv[])
9292

9393
ctp->arenas_datatypes[PARSEC_local_no_reshape_DEFAULT_ADT_IDX] = adt_default;
9494
ctp->arenas_datatypes[PARSEC_local_no_reshape_LOWER_TILE_ADT_IDX] = adt_lower;
95-
PARSEC_OBJ_RETAIN(adt_default.arena);
96-
PARSEC_OBJ_RETAIN(adt_lower.arena);
9795

9896
DO_RUN(ctp);
9997
DO_CHECK(local_no_reshape, dcA, dcA_check);
@@ -124,8 +122,6 @@ int main(int argc, char *argv[])
124122

125123
ctp->arenas_datatypes[PARSEC_local_read_reshape_DEFAULT_ADT_IDX] = adt_default;
126124
ctp->arenas_datatypes[PARSEC_local_read_reshape_LOWER_TILE_ADT_IDX] = adt_lower;
127-
PARSEC_OBJ_RETAIN(adt_default.arena);
128-
PARSEC_OBJ_RETAIN(adt_lower.arena);
129125

130126
DO_RUN(ctp);
131127
DO_CHECK(local_read_reshape, dcA, dcA_check);
@@ -157,8 +153,6 @@ int main(int argc, char *argv[])
157153

158154
ctp->arenas_datatypes[PARSEC_local_output_reshape_DEFAULT_ADT_IDX] = adt_default;
159155
ctp->arenas_datatypes[PARSEC_local_output_reshape_LOWER_TILE_ADT_IDX] = adt_lower;
160-
PARSEC_OBJ_RETAIN(adt_default.arena);
161-
PARSEC_OBJ_RETAIN(adt_lower.arena);
162156

163157
DO_RUN(ctp);
164158
DO_CHECK(local_output_reshape, dcA, dcA_check);
@@ -190,8 +184,6 @@ int main(int argc, char *argv[])
190184

191185
ctp->arenas_datatypes[PARSEC_local_input_reshape_DEFAULT_ADT_IDX] = adt_default;
192186
ctp->arenas_datatypes[PARSEC_local_input_reshape_LOWER_TILE_ADT_IDX] = adt_lower;
193-
PARSEC_OBJ_RETAIN(adt_default.arena);
194-
PARSEC_OBJ_RETAIN(adt_lower.arena);
195187

196188
DO_RUN(ctp);
197189
DO_CHECK(local_input_reshape, dcA, dcA_check);
@@ -222,8 +214,6 @@ int main(int argc, char *argv[])
222214

223215
ctp->arenas_datatypes[PARSEC_remote_read_reshape_DEFAULT_ADT_IDX] = adt_default;
224216
ctp->arenas_datatypes[PARSEC_remote_read_reshape_LOWER_TILE_ADT_IDX] = adt_lower;
225-
PARSEC_OBJ_RETAIN(adt_default.arena);
226-
PARSEC_OBJ_RETAIN(adt_lower.arena);
227217

228218
DO_RUN(ctp);
229219
DO_CHECK(remote_read_reshape, dcA, dcA_check);
@@ -252,8 +242,6 @@ int main(int argc, char *argv[])
252242

253243
ctp->arenas_datatypes[PARSEC_remote_no_re_reshape_DEFAULT_ADT_IDX] = adt_default;
254244
ctp->arenas_datatypes[PARSEC_remote_no_re_reshape_LOWER_TILE_ADT_IDX] = adt_lower;
255-
PARSEC_OBJ_RETAIN(adt_default.arena);
256-
PARSEC_OBJ_RETAIN(adt_lower.arena);
257245

258246
DO_RUN(ctp);
259247
DO_CHECK(remote_no_re_reshape, dcA, dcA_check);

tests/dsl/ptg/complex_deps.jdf

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ int main( int argc, char** argv )
111111
{
112112
parsec_complex_deps_taskpool_t* tp;
113113
parsec_matrix_block_cyclic_t descA;
114-
parsec_arena_datatype_t adt;
114+
parsec_arena_datatype_t *adt = PARSEC_OBJ_NEW(parsec_arena_datatype_t);
115115
parsec_datatype_t otype;
116116
parsec_context_t *parsec;
117117
int ni = NN, nk = NN, verbose = 0, i = 1, rc;
@@ -167,15 +167,14 @@ int main( int argc, char** argv )
167167
descA.super.bsiz *
168168
parsec_datadist_getsizeoftype(TYPE) );
169169
parsec_translate_matrix_type(TYPE, &otype);
170-
parsec_matrix_adt_construct_rect(&adt, otype,
170+
parsec_matrix_adt_construct_rect(adt, otype,
171171
descA.super.mb, descA.super.nb, descA.super.mb);
172172

173173

174174
/* Heat up the engine: small tasks */
175175
tp = parsec_complex_deps_new( &descA, ni, nk );
176176
assert( NULL != tp );
177-
tp->arenas_datatypes[PARSEC_complex_deps_DEFAULT_ADT_IDX] = adt;
178-
PARSEC_OBJ_RETAIN(adt.arena);
177+
tp->arenas_datatypes[PARSEC_complex_deps_DEFAULT_ADT_IDX] = *adt;
179178

180179
rc = parsec_context_add_taskpool( parsec, (parsec_taskpool_t*)tp );
181180
PARSEC_CHECK_ERROR(rc, "parsec_context_add_taskpool");
@@ -191,7 +190,7 @@ int main( int argc, char** argv )
191190
tp = parsec_complex_deps_new( &descA, ni, nk );
192191
assert( NULL != tp );
193192
TIMER_START(time_elapsed);
194-
tp->arenas_datatypes[PARSEC_complex_deps_DEFAULT_ADT_IDX] = adt;
193+
tp->arenas_datatypes[PARSEC_complex_deps_DEFAULT_ADT_IDX] = *adt;
195194
rc = parsec_context_add_taskpool( parsec, (parsec_taskpool_t*)tp );
196195
PARSEC_CHECK_ERROR(rc, "parsec_context_add_taskpool");
197196
TIMER_STOP(time_elapsed);
@@ -213,7 +212,7 @@ int main( int argc, char** argv )
213212
TIMER_STOP(time_elapsed);
214213
printf("DAG execution in %ld micro-sec\n", time_elapsed);
215214

216-
parsec_matrix_arena_datatype_destruct_free_type( & adt );
215+
parsec_matrix_adt_free( & adt );
217216

218217
free(descA.mat);
219218

tests/dsl/ptg/local-indices/local_indices.jdf

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ int main( int argc, char** argv )
120120
{
121121
parsec_local_indices_taskpool_t* tp;
122122
parsec_matrix_block_cyclic_t descA;
123-
parsec_arena_datatype_t adt;
123+
parsec_arena_datatype_t *adt = PARSEC_OBJ_NEW(parsec_arena_datatype_t);
124124
parsec_datatype_t dt;
125125
parsec_context_t *parsec;
126126
int ws = 1, mr = 0;
@@ -169,7 +169,7 @@ int main( int argc, char** argv )
169169
parsec_data_collection_set_key(&descA.super.super, "A");
170170

171171
parsec_translate_matrix_type(PARSEC_MATRIX_DOUBLE, &dt);
172-
parsec_matrix_adt_construct_rect(&adt, dt,
172+
parsec_matrix_adt_construct_rect(adt, dt,
173173
descA.super.mb, descA.super.nb, descA.super.mb);
174174
/* Start the PaRSEC engine */
175175
rc = parsec_context_start(parsec);
@@ -179,7 +179,7 @@ int main( int argc, char** argv )
179179
memset(local_nb, 0, 4*sizeof(int));
180180
tp = parsec_local_indices_new( &descA, (int32_t*)local_nb );
181181
assert( NULL != tp );
182-
tp->arenas_datatypes[PARSEC_local_indices_DEFAULT_ADT_IDX] = adt;
182+
tp->arenas_datatypes[PARSEC_local_indices_DEFAULT_ADT_IDX] = *adt;
183183
rc = parsec_context_add_taskpool( parsec, (parsec_taskpool_t*)tp );
184184
PARSEC_CHECK_ERROR(rc, "parsec_context_add_taskpool");
185185
rc = parsec_context_wait(parsec);
@@ -219,7 +219,7 @@ int main( int argc, char** argv )
219219
parsec_taskpool_free(&tp->super);
220220

221221
free(descA.mat);
222-
parsec_matrix_arena_datatype_destruct_free_type( & adt );
222+
parsec_matrix_adt_free( &adt );
223223

224224
parsec_fini( &parsec);
225225

0 commit comments

Comments
 (0)