13
13
#include < sstream>
14
14
#include < iostream>
15
15
#include < typeinfo>
16
- #include < variant>
17
16
18
17
#include " eckit/exception/Exceptions.h"
19
18
#include " eckit/log/Log.h"
@@ -125,7 +124,7 @@ void GRIBFileReader::setupReader(const eckit::PathName& inputPath, bool isRoot)
125
124
char buffer[64 ];
126
125
size_t size = sizeof (buffer);
127
126
// 1. Lock the grid name from the passed GRIB file
128
- if (codes_get_string (grib_ , " gridName" , buffer, &size) == GRIB_NOT_FOUND) {
127
+ if (codes_get_string (grib () , " gridName" , buffer, &size) == GRIB_NOT_FOUND) {
129
128
eckit::Log::error () << " Grid type unsupported at the moment, exit" << std::endl;
130
129
eckit::mpi::comm ().abort (1 );
131
130
}
@@ -135,15 +134,11 @@ void GRIBFileReader::setupReader(const eckit::PathName& inputPath, bool isRoot)
135
134
std::string paramMd, _;
136
135
eckit::Log::info () << " Params (name,levtype,level) : " ;
137
136
for (int i = 0 ; i < count_ - 1 ; ++i) {
138
- int err;
139
137
readMsgMetadata (_, paramMd);
140
138
params_.push_back (paramMd);
141
139
eckit::Log::info () << params_[i] << " ; " ;
142
- codes_handle_delete (grib_);
143
- grib_ = codes_handle_new_from_file (nullptr , currentFile_, PRODUCT_GRIB, &err);
144
- if (!grib_) {
145
- eckit::Log::error () << " Could not create grib handle. Error: " << err << " Check source file " << srcPath
146
- << std::endl;
140
+ if (!resetGribHandle ()) {
141
+ eckit::Log::error () << " Check source file " << srcPath << std::endl;
147
142
eckit::mpi::comm ().abort (1 );
148
143
}
149
144
}
@@ -172,19 +167,15 @@ void GRIBFileReader::validateSrcFiles(bool isRoot) {
172
167
fileParams.clear ();
173
168
openGribFile (filename, true );
174
169
for (int i = 0 ; i < count_ - 1 ; ++i) {
175
- int err;
176
170
readMsgMetadata (gridName, paramMd);
177
171
if (gridName != gridName_) {
178
172
eckit::Log::error () << " Grid in " << filename << " is different from setup ("
179
173
<< gridName_ << " ), exit..." << std::endl;
180
174
eckit::mpi::comm ().abort (1 );
181
175
}
182
176
fileParams.push_back (paramMd);
183
- codes_handle_delete (grib_);
184
- grib_ = codes_handle_new_from_file (nullptr , currentFile_, PRODUCT_GRIB, &err);
185
- if (!grib_) {
186
- eckit::Log::error () << " Could not create grib handle. Error: " << err << " Check source file "
187
- << filename << std::endl;
177
+ if (!resetGribHandle ()) {
178
+ eckit::Log::error () << " Check source file " << filename << std::endl;
188
179
eckit::mpi::comm ().abort (1 );
189
180
}
190
181
}
@@ -210,7 +201,7 @@ void GRIBFileReader::readMsgMetadata(std::string& gridName, std::string& paramMd
210
201
char buffer[64 ];
211
202
size_t size = sizeof (buffer);
212
203
gridName = " " ;
213
- int gridStatus = codes_get_string (grib_ , " gridName" , buffer, &size);
204
+ int gridStatus = codes_get_string (grib () , " gridName" , buffer, &size);
214
205
if (gridStatus != GRIB_NOT_FOUND) {
215
206
gridName = std::string (buffer);
216
207
}
@@ -219,7 +210,7 @@ void GRIBFileReader::readMsgMetadata(std::string& gridName, std::string& paramMd
219
210
for (const auto & keyword : keywords) {
220
211
std::memset (buffer, 0 , 64 );
221
212
size = sizeof (buffer);
222
- codes_get_string (grib_ , keyword, buffer, &size);
213
+ codes_get_string (grib () , keyword, buffer, &size);
223
214
paramMd.append (buffer);
224
215
paramMd.append (" ," ); // separator
225
216
}
@@ -234,7 +225,7 @@ bool GRIBFileReader::openGribFile(const eckit::PathName& path, bool exit) {
234
225
// No check for existence here because the paths passed belong to the src dir
235
226
// It is assumed they will not be deleted during runtime
236
227
// No check for file format as checked during construction
237
- currentFile_ = fopen (path.asString ().c_str (), " rb" );
228
+ currentFile_. reset ( fopen (path.asString ().c_str (), " rb" ) );
238
229
if (!currentFile_) {
239
230
eckit::Log::error () << " Could not open file " << path << std::endl;
240
231
if (exit ) {
@@ -243,31 +234,33 @@ bool GRIBFileReader::openGribFile(const eckit::PathName& path, bool exit) {
243
234
return false ; // defer error handling
244
235
}
245
236
index_ = 0 ;
246
- codes_count_in_file (nullptr , currentFile_, &count_);
247
- int err;
248
- grib_ = codes_handle_new_from_file (nullptr , currentFile_, PRODUCT_GRIB, &err);
249
- if (!grib_) {
250
- eckit::Log::error () << " Could not create grib handle. Error: " << err << std::endl;
237
+ codes_count_in_file (nullptr , currentFile (), &count_);
238
+ if (!resetGribHandle ()) {
251
239
if (exit ) {
252
240
eckit::mpi::comm ().abort (1 );
253
241
}
254
- return false ; // defer error handling
242
+ return false ;
255
243
}
256
244
return true ;
257
245
}
258
246
259
- void GRIBFileReader::closeGribFile () {
260
- if (grib_) {
261
- codes_handle_delete (grib_);
262
- }
263
- if (currentFile_) {
264
- fclose (currentFile_);
247
+ bool GRIBFileReader::resetGribHandle () {
248
+ int err;
249
+ // This calls the deleter of the previous handle first
250
+ grib_.reset (codes_handle_new_from_file (nullptr , currentFile (), PRODUCT_GRIB, &err));
251
+ if (!grib_) {
252
+ eckit::Log::error () << " Could not create grib handle. Error: " << err << std::endl;
253
+ return false ;
265
254
}
255
+ return true ;
256
+ }
257
+
258
+ void GRIBFileReader::closeGribFile () {
266
259
count_ = 0 ;
267
260
index_ = 0 ;
268
- // To avoid segfault at destruction if they have already been dereferenced
269
- currentFile_ = nullptr ;
270
- grib_ = nullptr ;
261
+ // Calls the custom destructors
262
+ currentFile_. reset ( nullptr ) ;
263
+ grib_. reset ( nullptr ) ;
271
264
}
272
265
273
266
bool GRIBFileReader::done () {
@@ -307,28 +300,21 @@ bool GRIBFileReader::nextMessage(std::string& shortName, std::string& levtype, s
307
300
std::getline (ss, level, ' ,' );
308
301
309
302
size_t nbOfValues;
310
- codes_get_size (grib_ , " values" , &nbOfValues);
303
+ codes_get_size (grib () , " values" , &nbOfValues);
311
304
data.resize (nbOfValues);
312
305
if constexpr (std::is_same_v<FIELD_TYPE_REAL, double >) {
313
306
ASSERT ((std::is_same_v<FIELD_TYPE_REAL, double >));
314
- codes_get_double_array (grib_ , " values" , reinterpret_cast <double *>(data.data ()), &nbOfValues);
307
+ codes_get_double_array (grib () , " values" , reinterpret_cast <double *>(data.data ()), &nbOfValues);
315
308
}
316
309
else {
317
310
ASSERT ((std::is_same_v<FIELD_TYPE_REAL, float >));
318
- codes_get_float_array (grib_ , " values" , reinterpret_cast <float *>(data.data ()), &nbOfValues);
311
+ codes_get_float_array (grib () , " values" , reinterpret_cast <float *>(data.data ()), &nbOfValues);
319
312
}
320
313
}
321
314
++index_;
322
315
eckit::mpi::comm ().broadcast (count_, root_);
323
316
if (rank_ == root_ && index_ < count_) {
324
- // Load the next message
325
- int err;
326
- codes_handle_delete (grib_);
327
- grib_ = codes_handle_new_from_file (nullptr , currentFile_, PRODUCT_GRIB, &err);
328
- if (!grib_) {
329
- eckit::Log::error () << " Could not create grib handle. Error: " << err << " Skipping..." << std::endl;
330
- return false ;
331
- }
317
+ return resetGribHandle (); // Load the next message
332
318
}
333
319
return true ;
334
320
}
0 commit comments