Skip to content

Commit b997b43

Browse files
authored
Merge pull request #739 from CEED/jeremy/copy-ptr
Copy Ceed Object References
2 parents caa531a + db34a14 commit b997b43

18 files changed

Lines changed: 529 additions & 44 deletions

.github/workflows/rust-test-with-style.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
strategy:
99
matrix:
1010
os: [ubuntu-20.04]
11-
compiler: [gcc-10]
11+
compiler: [clang]
1212

1313
runs-on: ${{ matrix.os }}
1414

@@ -38,7 +38,7 @@ jobs:
3838
strategy:
3939
matrix:
4040
os: [ubuntu-20.04]
41-
compiler: [gcc-9]
41+
compiler: [clang]
4242

4343
runs-on: ${{ matrix.os }}
4444

backends/ref/ceed-ref-basis.c

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -305,17 +305,6 @@ static int CeedBasisApply_Ref(CeedBasis basis, CeedInt num_elem,
305305
return CEED_ERROR_SUCCESS;
306306
}
307307

308-
//------------------------------------------------------------------------------
309-
// Basis Destroy Non-Tensor
310-
//------------------------------------------------------------------------------
311-
static int CeedBasisDestroyNonTensor_Ref(CeedBasis basis) {
312-
int ierr;
313-
CeedTensorContract contract;
314-
ierr = CeedBasisGetTensorContract(basis, &contract); CeedChkBackend(ierr);
315-
ierr = CeedTensorContractDestroy(&contract); CeedChkBackend(ierr);
316-
return CEED_ERROR_SUCCESS;
317-
}
318-
319308
//------------------------------------------------------------------------------
320309
// Basis Create Non-Tensor
321310
//------------------------------------------------------------------------------
@@ -334,12 +323,10 @@ int CeedBasisCreateH1_Ref(CeedElemTopology topo, CeedInt dim,
334323
ierr = CeedGetParent(ceed, &parent); CeedChkBackend(ierr);
335324
CeedTensorContract contract;
336325
ierr = CeedTensorContractCreate(parent, basis, &contract); CeedChkBackend(ierr);
337-
ierr = CeedBasisSetTensorContract(basis, &contract); CeedChkBackend(ierr);
326+
ierr = CeedBasisSetTensorContract(basis, contract); CeedChkBackend(ierr);
338327

339328
ierr = CeedSetBackendFunction(ceed, "Basis", basis, "Apply",
340329
CeedBasisApply_Ref); CeedChkBackend(ierr);
341-
ierr = CeedSetBackendFunction(ceed, "Basis", basis, "Destroy",
342-
CeedBasisDestroyNonTensor_Ref); CeedChkBackend(ierr);
343330

344331
return CEED_ERROR_SUCCESS;
345332
}
@@ -349,9 +336,6 @@ int CeedBasisCreateH1_Ref(CeedElemTopology topo, CeedInt dim,
349336
//------------------------------------------------------------------------------
350337
static int CeedBasisDestroyTensor_Ref(CeedBasis basis) {
351338
int ierr;
352-
CeedTensorContract contract;
353-
ierr = CeedBasisGetTensorContract(basis, &contract); CeedChkBackend(ierr);
354-
ierr = CeedTensorContractDestroy(&contract); CeedChkBackend(ierr);
355339

356340
CeedBasis_Ref *impl;
357341
ierr = CeedBasisGetData(basis, &impl); CeedChkBackend(ierr);
@@ -398,7 +382,7 @@ int CeedBasisCreateTensorH1_Ref(CeedInt dim, CeedInt P_1d,
398382
ierr = CeedGetParent(ceed, &parent); CeedChkBackend(ierr);
399383
CeedTensorContract contract;
400384
ierr = CeedTensorContractCreate(parent, basis, &contract); CeedChkBackend(ierr);
401-
ierr = CeedBasisSetTensorContract(basis, &contract); CeedChkBackend(ierr);
385+
ierr = CeedBasisSetTensorContract(basis, contract); CeedChkBackend(ierr);
402386

403387
ierr = CeedSetBackendFunction(ceed, "Basis", basis, "Apply",
404388
CeedBasisApply_Ref); CeedChkBackend(ierr);

include/ceed/backend.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,14 @@ CEED_EXTERN int CeedSetBackendFunction(Ceed ceed,
9393
const char *func_name, int (*f)());
9494
CEED_EXTERN int CeedGetData(Ceed ceed, void *data);
9595
CEED_EXTERN int CeedSetData(Ceed ceed, void *data);
96+
CEED_EXTERN int CeedReference(Ceed ceed);
9697

9798
CEED_EXTERN int CeedVectorGetCeed(CeedVector vec, Ceed *ceed);
9899
CEED_EXTERN int CeedVectorGetState(CeedVector vec, uint64_t *state);
99100
CEED_EXTERN int CeedVectorAddReference(CeedVector vec);
100101
CEED_EXTERN int CeedVectorGetData(CeedVector vec, void *data);
101102
CEED_EXTERN int CeedVectorSetData(CeedVector vec, void *data);
103+
CEED_EXTERN int CeedVectorReference(CeedVector vec);
102104

103105
CEED_EXTERN int CeedElemRestrictionGetCeed(CeedElemRestriction rstr,
104106
Ceed *ceed);
@@ -120,6 +122,7 @@ CEED_EXTERN int CeedElemRestrictionGetData(CeedElemRestriction rstr,
120122
void *data);
121123
CEED_EXTERN int CeedElemRestrictionSetData(CeedElemRestriction rstr,
122124
void *data);
125+
CEED_EXTERN int CeedElemRestrictionReference(CeedElemRestriction rstr);
123126

124127
CEED_EXTERN int CeedBasisGetCollocatedGrad(CeedBasis basis,
125128
CeedScalar *colo_grad_1d);
@@ -130,14 +133,15 @@ CEED_EXTERN int CeedBasisGetCeed(CeedBasis basis, Ceed *ceed);
130133
CEED_EXTERN int CeedBasisIsTensor(CeedBasis basis, bool *is_tensor);
131134
CEED_EXTERN int CeedBasisGetData(CeedBasis basis, void *data);
132135
CEED_EXTERN int CeedBasisSetData(CeedBasis basis, void *data);
136+
CEED_EXTERN int CeedBasisReference(CeedBasis basis);
133137

134138
CEED_EXTERN int CeedBasisGetTopologyDimension(CeedElemTopology topo,
135139
CeedInt *dim);
136140

137141
CEED_EXTERN int CeedBasisGetTensorContract(CeedBasis basis,
138142
CeedTensorContract *contract);
139143
CEED_EXTERN int CeedBasisSetTensorContract(CeedBasis basis,
140-
CeedTensorContract *contract);
144+
CeedTensorContract contract);
141145
CEED_EXTERN int CeedTensorContractCreate(Ceed ceed, CeedBasis basis,
142146
CeedTensorContract *contract);
143147
CEED_EXTERN int CeedTensorContractApply(CeedTensorContract contract, CeedInt A,
@@ -153,6 +157,7 @@ CEED_EXTERN int CeedTensorContractGetData(CeedTensorContract contract,
153157
void *data);
154158
CEED_EXTERN int CeedTensorContractSetData(CeedTensorContract contract,
155159
void *data);
160+
CEED_EXTERN int CeedTensorContractReference(CeedTensorContract contract);
156161
CEED_EXTERN int CeedTensorContractDestroy(CeedTensorContract *contract);
157162

158163
CEED_EXTERN int CeedQFunctionRegister(const char *, const char *, CeedInt,
@@ -174,6 +179,7 @@ CEED_EXTERN int CeedQFunctionGetInnerContext(CeedQFunction qf,
174179
CEED_EXTERN int CeedQFunctionIsIdentity(CeedQFunction qf, bool *is_identity);
175180
CEED_EXTERN int CeedQFunctionGetData(CeedQFunction qf, void *data);
176181
CEED_EXTERN int CeedQFunctionSetData(CeedQFunction qf, void *data);
182+
CEED_EXTERN int CeedQFunctionReference(CeedQFunction qf);
177183
CEED_EXTERN int CeedQFunctionGetFields(CeedQFunction qf,
178184
CeedQFunctionField **input_fields,
179185
CeedQFunctionField **output_fields);
@@ -194,6 +200,7 @@ CEED_EXTERN int CeedQFunctionContextGetBackendData(CeedQFunctionContext ctx,
194200
void *data);
195201
CEED_EXTERN int CeedQFunctionContextSetBackendData(CeedQFunctionContext ctx,
196202
void *data);
203+
CEED_EXTERN int CeedQFunctionContextReference(CeedQFunctionContext ctx);
197204

198205
CEED_EXTERN int CeedOperatorGetCeed(CeedOperator op, Ceed *ceed);
199206
CEED_EXTERN int CeedOperatorGetNumElements(CeedOperator op, CeedInt *num_elem);
@@ -208,6 +215,7 @@ CEED_EXTERN int CeedOperatorGetSubList(CeedOperator op,
208215
CeedOperator **sub_operators);
209216
CEED_EXTERN int CeedOperatorGetData(CeedOperator op, void *data);
210217
CEED_EXTERN int CeedOperatorSetData(CeedOperator op, void *data);
218+
CEED_EXTERN int CeedOperatorReference(CeedOperator op);
211219
CEED_EXTERN int CeedOperatorSetSetupDone(CeedOperator op);
212220

213221
CEED_EXTERN int CeedOperatorGetFields(CeedOperator op,

include/ceed/ceed.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ typedef struct CeedOperator_private *CeedOperator;
150150

151151
CEED_EXTERN int CeedRegistryGetList(size_t *n, char ***const resources, CeedInt **array);
152152
CEED_EXTERN int CeedInit(const char *resource, Ceed *ceed);
153+
CEED_EXTERN int CeedReferenceCopy(Ceed ceed, Ceed *ceed_copy);
153154
CEED_EXTERN int CeedGetResource(Ceed ceed, const char **resource);
154155
CEED_EXTERN int CeedIsDeterministic(Ceed ceed, bool *is_deterministic);
155156
CEED_EXTERN int CeedView(Ceed ceed, FILE *stream);
@@ -304,6 +305,7 @@ typedef enum {
304305
CEED_EXTERN const char *const CeedCopyModes[];
305306

306307
CEED_EXTERN int CeedVectorCreate(Ceed ceed, CeedInt len, CeedVector *vec);
308+
CEED_EXTERN int CeedVectorReferenceCopy(CeedVector vec, CeedVector *vec_copy);
307309
CEED_EXTERN int CeedVectorSetArray(CeedVector vec, CeedMemType mem_type,
308310
CeedCopyMode copy_mode, CeedScalar *array);
309311
CEED_EXTERN int CeedVectorSetValue(CeedVector vec, CeedScalar value);
@@ -386,6 +388,8 @@ CEED_EXTERN int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInt num_elem,
386388
CEED_EXTERN int CeedElemRestrictionCreateBlockedStrided(Ceed ceed,
387389
CeedInt num_elem, CeedInt elem_size, CeedInt blk_size, CeedInt num_comp,
388390
CeedInt l_size, const CeedInt strides[3], CeedElemRestriction *rstr);
391+
CEED_EXTERN int CeedElemRestrictionReferenceCopy(CeedElemRestriction rstr,
392+
CeedElemRestriction *rstr_copy);
389393
CEED_EXTERN int CeedElemRestrictionCreateVector(CeedElemRestriction rstr,
390394
CeedVector *lvec, CeedVector *evec);
391395
CEED_EXTERN int CeedElemRestrictionApply(CeedElemRestriction rstr,
@@ -489,6 +493,7 @@ CEED_EXTERN int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo,
489493
const CeedScalar *grad,
490494
const CeedScalar *q_ref,
491495
const CeedScalar *q_weights, CeedBasis *basis);
496+
CEED_EXTERN int CeedBasisReferenceCopy(CeedBasis basis, CeedBasis *basis_copy);
492497
CEED_EXTERN int CeedBasisView(CeedBasis basis, FILE *stream);
493498
CEED_EXTERN int CeedBasisApply(CeedBasis basis, CeedInt num_elem,
494499
CeedTransposeMode t_mode,
@@ -554,6 +559,7 @@ CEED_EXTERN int CeedQFunctionCreateInteriorByName(Ceed ceed, const char *name,
554559
CeedQFunction *qf);
555560
CEED_EXTERN int CeedQFunctionCreateIdentity(Ceed ceed, CeedInt size,
556561
CeedEvalMode in_mode, CeedEvalMode out_mode, CeedQFunction *qf);
562+
CEED_EXTERN int CeedQFunctionReferenceCopy(CeedQFunction qf, CeedQFunction *qf_copy);
557563
CEED_EXTERN int CeedQFunctionAddInput(CeedQFunction qf, const char *field_name,
558564
CeedInt size, CeedEvalMode eval_mode);
559565
CEED_EXTERN int CeedQFunctionAddOutput(CeedQFunction qf, const char *field_name,
@@ -567,6 +573,8 @@ CEED_EXTERN int CeedQFunctionDestroy(CeedQFunction *qf);
567573

568574
CEED_EXTERN int CeedQFunctionContextCreate(Ceed ceed,
569575
CeedQFunctionContext *ctx);
576+
CEED_EXTERN int CeedQFunctionContextReferenceCopy(CeedQFunctionContext ctx,
577+
CeedQFunctionContext *ctx_copy);
570578
CEED_EXTERN int CeedQFunctionContextSetData(CeedQFunctionContext ctx,
571579
CeedMemType mem_type, CeedCopyMode copy_mode, size_t size, void *data);
572580
CEED_EXTERN int CeedQFunctionContextGetData(CeedQFunctionContext ctx,
@@ -582,6 +590,7 @@ CEED_EXTERN int CeedOperatorCreate(Ceed ceed, CeedQFunction qf,
582590
CeedQFunction dqf, CeedQFunction dqfT,
583591
CeedOperator *op);
584592
CEED_EXTERN int CeedCompositeOperatorCreate(Ceed ceed, CeedOperator *op);
593+
CEED_EXTERN int CeedOperatorReferenceCopy(CeedOperator op, CeedOperator *op_copy);
585594
CEED_EXTERN int CeedOperatorSetField(CeedOperator op, const char *field_name,
586595
CeedElemRestriction r, CeedBasis b,
587596
CeedVector v);

interface/ceed-basis.c

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,20 @@ int CeedBasisSetData(CeedBasis basis, void *data) {
295295
return CEED_ERROR_SUCCESS;
296296
}
297297

298+
/**
299+
@brief Increment the reference counter for a CeedBasis
300+
301+
@param basis Basis to increment the reference counter
302+
303+
@return An error code: 0 - success, otherwise - failure
304+
305+
@ref Backend
306+
**/
307+
int CeedBasisReference(CeedBasis basis) {
308+
basis->ref_count++;
309+
return CEED_ERROR_SUCCESS;
310+
}
311+
298312
/**
299313
@brief Get dimension for given CeedElemTopology
300314
@@ -335,8 +349,10 @@ int CeedBasisGetTensorContract(CeedBasis basis, CeedTensorContract *contract) {
335349
336350
@ref Backend
337351
**/
338-
int CeedBasisSetTensorContract(CeedBasis basis, CeedTensorContract *contract) {
339-
basis->contract = *contract;
352+
int CeedBasisSetTensorContract(CeedBasis basis, CeedTensorContract contract) {
353+
int ierr;
354+
basis->contract = contract;
355+
ierr = CeedTensorContractReference(contract); CeedChk(ierr);
340356
return CEED_ERROR_SUCCESS;
341357
}
342358

@@ -435,7 +451,7 @@ int CeedBasisCreateTensorH1(Ceed ceed, CeedInt dim, CeedInt num_comp,
435451

436452
ierr = CeedCalloc(1, basis); CeedChk(ierr);
437453
(*basis)->ceed = ceed;
438-
ceed->ref_count++;
454+
ierr = CeedReference(ceed); CeedChk(ierr);
439455
(*basis)->ref_count = 1;
440456
(*basis)->tensor_basis = 1;
441457
(*basis)->dim = dim;
@@ -596,7 +612,7 @@ int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo, CeedInt num_comp,
596612
ierr = CeedBasisGetTopologyDimension(topo, &dim); CeedChk(ierr);
597613

598614
(*basis)->ceed = ceed;
599-
ceed->ref_count++;
615+
ierr = CeedReference(ceed); CeedChk(ierr);
600616
(*basis)->ref_count = 1;
601617
(*basis)->tensor_basis = 0;
602618
(*basis)->dim = dim;
@@ -617,6 +633,30 @@ int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo, CeedInt num_comp,
617633
return CEED_ERROR_SUCCESS;
618634
}
619635

636+
/**
637+
@brief Copy the pointer to a CeedBasis. Both pointers should
638+
be destroyed with `CeedBasisDestroy()`;
639+
Note: If `*basis_copy` is non-NULL, then it is assumed that
640+
`*basis_copy` is a pointer to a CeedBasis. This CeedBasis
641+
will be destroyed if `*basis_copy` is the only
642+
reference to this CeedBasis.
643+
644+
@param basis CeedBasis to copy reference to
645+
@param[out] basis_copy Variable to store copied reference
646+
647+
@return An error code: 0 - success, otherwise - failure
648+
649+
@ref User
650+
**/
651+
int CeedBasisReferenceCopy(CeedBasis basis, CeedBasis *basis_copy) {
652+
int ierr;
653+
654+
ierr = CeedBasisReference(basis); CeedChk(ierr);
655+
ierr = CeedBasisDestroy(basis_copy); CeedChk(ierr);
656+
*basis_copy = basis;
657+
return CEED_ERROR_SUCCESS;
658+
}
659+
620660
/**
621661
@brief View a CeedBasis
622662
@@ -1030,6 +1070,9 @@ int CeedBasisDestroy(CeedBasis *basis) {
10301070
if ((*basis)->Destroy) {
10311071
ierr = (*basis)->Destroy(*basis); CeedChk(ierr);
10321072
}
1073+
if ((*basis)->contract) {
1074+
ierr = CeedTensorContractDestroy(&(*basis)->contract); CeedChk(ierr);
1075+
}
10331076
ierr = CeedFree(&(*basis)->interp); CeedChk(ierr);
10341077
ierr = CeedFree(&(*basis)->interp_1d); CeedChk(ierr);
10351078
ierr = CeedFree(&(*basis)->grad); CeedChk(ierr);

interface/ceed-elemrestriction.c

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,20 @@ int CeedElemRestrictionSetData(CeedElemRestriction rstr, void *data) {
271271
return CEED_ERROR_SUCCESS;
272272
}
273273

274+
/**
275+
@brief Increment the reference counter for a CeedElemRestriction
276+
277+
@param rstr ElemRestriction to increment the reference counter
278+
279+
@return An error code: 0 - success, otherwise - failure
280+
281+
@ref Backend
282+
**/
283+
int CeedElemRestrictionReference(CeedElemRestriction rstr) {
284+
rstr->ref_count++;
285+
return CEED_ERROR_SUCCESS;
286+
}
287+
274288
/// @}
275289

276290
/// @cond DOXYGEN_SKIP
@@ -344,7 +358,7 @@ int CeedElemRestrictionCreate(Ceed ceed, CeedInt num_elem, CeedInt elem_size,
344358

345359
ierr = CeedCalloc(1, rstr); CeedChk(ierr);
346360
(*rstr)->ceed = ceed;
347-
ceed->ref_count++;
361+
ierr = CeedReference(ceed); CeedChk(ierr);
348362
(*rstr)->ref_count = 1;
349363
(*rstr)->num_elem = num_elem;
350364
(*rstr)->elem_size = elem_size;
@@ -407,7 +421,7 @@ int CeedElemRestrictionCreateStrided(Ceed ceed, CeedInt num_elem,
407421

408422
ierr = CeedCalloc(1, rstr); CeedChk(ierr);
409423
(*rstr)->ceed = ceed;
410-
ceed->ref_count++;
424+
ierr = CeedReference(ceed); CeedChk(ierr);
411425
(*rstr)->ref_count = 1;
412426
(*rstr)->num_elem = num_elem;
413427
(*rstr)->elem_size = elem_size;
@@ -492,7 +506,7 @@ int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInt num_elem,
492506
elem_size); CeedChk(ierr);
493507

494508
(*rstr)->ceed = ceed;
495-
ceed->ref_count++;
509+
ierr = CeedReference(ceed); CeedChk(ierr);
496510
(*rstr)->ref_count = 1;
497511
(*rstr)->num_elem = num_elem;
498512
(*rstr)->elem_size = elem_size;
@@ -558,7 +572,7 @@ int CeedElemRestrictionCreateBlockedStrided(Ceed ceed, CeedInt num_elem,
558572
ierr = CeedCalloc(1, rstr); CeedChk(ierr);
559573

560574
(*rstr)->ceed = ceed;
561-
ceed->ref_count++;
575+
ierr = CeedReference(ceed); CeedChk(ierr);
562576
(*rstr)->ref_count = 1;
563577
(*rstr)->num_elem = num_elem;
564578
(*rstr)->elem_size = elem_size;
@@ -574,6 +588,31 @@ int CeedElemRestrictionCreateBlockedStrided(Ceed ceed, CeedInt num_elem,
574588
return CEED_ERROR_SUCCESS;
575589
}
576590

591+
/**
592+
@brief Copy the pointer to a CeedElemRestriction. Both pointers should
593+
be destroyed with `CeedElemRestrictionDestroy()`;
594+
Note: If `*rstr_copy` is non-NULL, then it is assumed that
595+
`*rstr_copy` is a pointer to a CeedElemRestriction. This
596+
CeedElemRestriction will be destroyed if `*rstr_copy` is the
597+
only reference to this CeedElemRestriction.
598+
599+
@param rstr CeedElemRestriction to copy reference to
600+
@param[out] rstr_copy Variable to store copied reference
601+
602+
@return An error code: 0 - success, otherwise - failure
603+
604+
@ref User
605+
**/
606+
int CeedElemRestrictionReferenceCopy(CeedElemRestriction rstr,
607+
CeedElemRestriction *rstr_copy) {
608+
int ierr;
609+
610+
ierr = CeedElemRestrictionReference(rstr); CeedChk(ierr);
611+
ierr = CeedElemRestrictionDestroy(rstr_copy); CeedChk(ierr);
612+
*rstr_copy = rstr;
613+
return CEED_ERROR_SUCCESS;
614+
}
615+
577616
/**
578617
@brief Create CeedVectors associated with a CeedElemRestriction
579618

0 commit comments

Comments
 (0)