@@ -208,6 +208,57 @@ inline int32_t GPUReconstruction::ReadStructFromFile(const char* file, T* obj)
208208 return 0 ;
209209}
210210
211+ template <class T >
212+ inline void GPUReconstruction::DumpDynamicStructToFile (const T* obj, size_t dynamicSize, const char * file)
213+ {
214+ FILE* fp = fopen (file, " w+b" );
215+ if (fp == nullptr ) {
216+ return ;
217+ }
218+ size_t size = sizeof (*obj);
219+ fwrite (&size, sizeof (size), 1 , fp);
220+ fwrite (&dynamicSize, sizeof (dynamicSize), 1 , fp);
221+ fwrite (obj, 1 , dynamicSize, fp);
222+ fclose (fp);
223+ }
224+
225+ template <class T , auto F>
226+ inline aligned_unique_buffer_ptr<T> GPUReconstruction::ReadDynamicStructFromFile (const char * file)
227+ {
228+ FILE* fp = fopen (file, " rb" );
229+ if (fp == nullptr ) {
230+ return nullptr ;
231+ }
232+ size_t size, dynsize, r, r2;
233+ r = fread (&size, sizeof (size), 1 , fp);
234+ r2 = fread (&dynsize, sizeof (dynsize), 1 , fp);
235+ if (r == 0 || r2 == 0 || size != sizeof (T) || dynsize < size) {
236+ fclose (fp);
237+ GPUError (" ERROR reading %s, invalid size: %ld (%ld buffer size, %ld object size expected)" , file, (int64_t )size, (int64_t )dynsize, (int64_t )sizeof (T));
238+ throw std::runtime_error (" invalid size" );
239+ }
240+ std::unique_ptr<T> tmp = std::make_unique<T>();
241+ r = fread (tmp.get (), sizeof (T), 1 , fp);
242+ if (r == 0 ) {
243+ fclose (fp);
244+ GPUError (" ERROR reading %s" , file, (int64_t )size, (int64_t )sizeof (T));
245+ throw std::runtime_error (" read error" );
246+ }
247+ if ((tmp.get ()->*F)() != dynsize) {
248+ fclose (fp);
249+ GPUError (" ERROR: invalid size: %ld (%ld expected)" , file, (int64_t )dynsize, (int64_t )(tmp.get ()->*F)());
250+ throw std::runtime_error (" invalid size" );
251+ }
252+ aligned_unique_buffer_ptr<T> newObj (dynsize);
253+ memcpy (newObj.get (), tmp.get (), sizeof (T));
254+ r = fread (newObj.getraw () + sizeof (T), 1 , dynsize - sizeof (T), fp);
255+ fclose (fp);
256+ if (GetProcessingSettings ().debugLevel >= 2 ) {
257+ GPUInfo (" Read %ld bytes from %s" , (int64_t )r, file);
258+ }
259+ return newObj;
260+ }
261+
211262} // namespace o2::gpu
212263
213264#endif
0 commit comments