@@ -28,7 +28,7 @@ static struct {
2828} backends [32 ];
2929static 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**/
938948int 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