Skip to content

Commit 58c1b12

Browse files
committed
Use backend delegates for work vectors
1 parent 0002d81 commit 58c1b12

1 file changed

Lines changed: 22 additions & 2 deletions

File tree

interface/ceed.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static struct {
2828
} backends[32];
2929
static size_t num_backends;
3030

31-
#define CEED_FTABLE_ENTRY(class, method) {#class #method, offsetof(struct class##_private, method)}
31+
#define CEED_FTABLE_ENTRY(class, method) { #class #method, offsetof(struct class##_private, method) }
3232
/// @endcond
3333

3434
/// @file
@@ -858,7 +858,7 @@ int CeedClearWorkVectors(Ceed ceed, CeedSize min_len) {
858858
CeedSize vec_len;
859859
CeedCall(CeedVectorGetLength(ceed->work_vectors->vecs[i], &vec_len));
860860
if (vec_len < min_len) {
861-
ceed->ref_count += 2; // Note: increase ref_count to prevent Ceed destructor from triggering
861+
ceed->ref_count += 2; // Note: increase ref_count to prevent Ceed destructor from triggering again
862862
CeedCall(CeedVectorDestroy(&ceed->work_vectors->vecs[i]));
863863
ceed->ref_count -= 1; // Note: restore ref_count
864864
ceed->work_vectors->num_vecs--;
@@ -890,6 +890,16 @@ int CeedGetWorkVector(Ceed ceed, CeedSize len, CeedVector *vec) {
890890
CeedInt i = 0;
891891
CeedScalar usage_mb;
892892

893+
if (!ceed->VectorCreate) {
894+
Ceed delegate;
895+
896+
CeedCall(CeedGetObjectDelegate(ceed, &delegate, "Vector"));
897+
CeedCheck(delegate, ceed, CEED_ERROR_UNSUPPORTED, "Backend does not implement VectorCreate");
898+
CeedCall(CeedGetWorkVector(delegate, len, vec));
899+
CeedCall(CeedDestroy(&delegate));
900+
return CEED_ERROR_SUCCESS;
901+
}
902+
893903
if (!ceed->work_vectors) CeedCall(CeedWorkVectorsCreate(ceed));
894904

895905
// Search for big enough work vector
@@ -936,6 +946,16 @@ int CeedGetWorkVector(Ceed ceed, CeedSize len, CeedVector *vec) {
936946
@ref Backend
937947
**/
938948
int CeedRestoreWorkVector(Ceed ceed, CeedVector *vec) {
949+
if (!ceed->VectorCreate) {
950+
Ceed delegate;
951+
952+
CeedCall(CeedGetObjectDelegate(ceed, &delegate, "Vector"));
953+
CeedCheck(delegate, ceed, CEED_ERROR_UNSUPPORTED, "Backend does not implement VectorCreate");
954+
CeedCall(CeedRestoreWorkVector(delegate, vec));
955+
CeedCall(CeedDestroy(&delegate));
956+
return CEED_ERROR_SUCCESS;
957+
}
958+
939959
for (CeedInt i = 0; i < ceed->work_vectors->num_vecs; i++) {
940960
if (*vec == ceed->work_vectors->vecs[i]) {
941961
CeedCheck(ceed->work_vectors->is_in_use[i], ceed, CEED_ERROR_ACCESS, "Work vector %" CeedSize_FMT " was not checked out but is being returned");

0 commit comments

Comments
 (0)