@@ -595,6 +595,22 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'):
595595 mod_type = _structdefs [mod_name ]
596596 #name_records = log_get_name_records(log)
597597
598+ if 'DXT_POSIX' in log ['modules' ]:
599+ # retrieve file's DXT_POSIX version number
600+ dxt_posix_ver = log ['modules' ]['DXT_POSIX' ]['ver' ]
601+
602+ if 'DXT_MPIIO' in log ['modules' ]:
603+ # retrieve file's DXT_MPIIO version number
604+ dxt_mpiio_ver = log ['modules' ]['DXT_MPIIO' ]['ver' ]
605+
606+ append_extra_info = True
607+ if mod_name == 'DXT_POSIX' and dxt_posix_ver < 2 :
608+ # DXT_POSIX_VER 2 and later has extra_info field added
609+ append_extra_info = False
610+ elif mod_name == 'DXT_MPIIO' and dxt_mpiio_ver < 3 :
611+ # DXT_MPIIO_VER 3 and later has extra_info field added
612+ append_extra_info = False
613+
598614 rec = {}
599615 buf = ffi .new ("void **" )
600616 r = libdutil .darshan_log_get_record (log ['handle' ], modules [mod_name ]['idx' ], buf )
@@ -620,29 +636,47 @@ def log_get_dxt_record(log, mod_name, reads=True, writes=True, dtype='dict'):
620636 size_of = ffi .sizeof ("struct dxt_file_record" )
621637 segments = ffi .cast ("struct segment_info *" , buf [0 ] + size_of )
622638
623-
624639 for i in range (wcnt ):
625640 seg = {
626641 "offset" : segments [i ].offset ,
627642 "length" : segments [i ].length ,
628643 "start_time" : segments [i ].start_time ,
629- "end_time" : segments [i ].end_time ,
630- "extra_info" : ffi .string (segments [i ].extra_info ).decode ("utf-8" )
644+ "end_time" : segments [i ].end_time
631645 }
632- rec ['write_segments' ].append (seg )
633646
647+ if append_extra_info :
648+ # append field of extra_info
649+ info_str = ffi .string (segments [i ].extra_info )
650+ if not info_str :
651+ extra_info_str = info_str .decode ("utf-8" )
652+ else :
653+ extra_info_str = ""
654+
655+ seg ["extra_info" ] = extra_info_str
656+
657+ rec ['write_segments' ].append (seg )
634658
635659 for i in range (rcnt ):
636660 i = i + wcnt
661+
637662 seg = {
638663 "offset" : segments [i ].offset ,
639664 "length" : segments [i ].length ,
640665 "start_time" : segments [i ].start_time ,
641- "end_time" : segments [i ].end_time ,
642- "extra_info" : ffi .string (segments [i ].extra_info ).decode ("utf-8" )
666+ "end_time" : segments [i ].end_time
643667 }
644- rec ['read_segments' ].append (seg )
645668
669+ if append_extra_info :
670+ # append field of extra_info
671+ info_str = ffi .string (segments [i ].extra_info )
672+ if not info_str :
673+ extra_info_str = info_str .decode ("utf-8" )
674+ else :
675+ extra_info_str = ""
676+
677+ seg ["extra_info" ] = extra_info_str
678+
679+ rec ['read_segments' ].append (seg )
646680
647681 if dtype == "pandas" :
648682 rec ['read_segments' ] = pd .DataFrame (rec ['read_segments' ])
0 commit comments