fix log dump race and unclosed HDF5 data pool file in DamarisGUI

This commit is contained in:
markusro committed 2026-10-18 11:11:14 +02:00
1 parent efb01250c8
commit da1dc4a088
1 file changed
+10 -8
+10 -8
View File
@@ -613,6 +613,7 @@ class DamarisGUI:
logger.debug("Data cleanup took %.3fs", time.time() - data_cleanup_start) logger.debug("Data cleanup took %.3fs", time.time() - data_cleanup_start)
# set the text mark for hdf logging # set the text mark for hdf logging
with self.log.lock:
if self.log.textbuffer.get_mark( "lastdumped" ) is None: if self.log.textbuffer.get_mark( "lastdumped" ) is None:
self.log.textbuffer.create_mark( "lastdumped", self.log.textbuffer.get_end_iter( ), left_gravity=True ) self.log.textbuffer.create_mark( "lastdumped", self.log.textbuffer.get_end_iter( ), left_gravity=True )
@@ -991,6 +992,7 @@ class DamarisGUI:
# now it's time to create the hdf file # now it's time to create the hdf file
dump_file = None dump_file = None
try:
if not os.path.isfile( self.dump_filename ): if not os.path.isfile( self.dump_filename ):
if not init: if not init:
logger.warning("Dump file \"%s\" vanished unexpectedly, creating new one", self.dump_filename) logger.warning("Dump file \"%s\" vanished unexpectedly, creating new one", self.dump_filename)
@@ -1089,27 +1091,25 @@ class DamarisGUI:
# save log window information: # save log window information:
# also save backend's logfile information? # also save backend's logfile information?
# the dump thread must not race with the GUI thread appending messages
with self.log.lock:
logtextbuffer = self.log.textbuffer logtextbuffer = self.log.textbuffer
last_end = logtextbuffer.get_mark( "lastdumped" ) last_end = logtextbuffer.get_mark( "lastdumped" )
if last_end is None: if last_end is None:
last_end = logtextbuffer.create_mark( "lastdumped", logtextbuffer.get_start_iter( ), left_gravity=True ) last_end = logtextbuffer.create_mark( "lastdumped", logtextbuffer.get_start_iter( ), left_gravity=True )
#logtext_start = logtextbuffer.get_iter_at_mark( last_end )
logtext_end = logtextbuffer.get_end_iter( )
logtextbuffer.move_mark( last_end, logtext_end )
# Create new iterators after the mark move
logtext_start = logtextbuffer.get_iter_at_mark( last_end ) logtext_start = logtextbuffer.get_iter_at_mark( last_end )
logtext_end = logtextbuffer.get_end_iter( ) logtext_end = logtextbuffer.get_end_iter( )
# recode from unicode
logtext = logtextbuffer.get_text( logtext_start, logtext_end, True ) logtext = logtextbuffer.get_text( logtext_start, logtext_end, True )
# avoid circular references (seems to be necessary with gtk-2.12) logtextbuffer.move_mark( "lastdumped", logtext_end )
# del logtextbuffer, logtext_start, logtext_end, last_end if logtext is not None:
for l in logtext.splitlines( ): for l in logtext.splitlines( ):
dump_file.root.log.append( numpy.array( [ l ], dtype="S120" ) ) dump_file.root.log.append( numpy.array( [ l ], dtype="S120" ) )
dump_file.flush( ) dump_file.flush( )
finally:
if dump_file is not None:
dump_file.close( ) dump_file.close( )
self.last_dumped = time.time( ) self.last_dumped = time.time( )
del dump_file
return True return True
@@ -1351,6 +1351,7 @@ class LogWindow:
self.textview.connect( "key-press-event", self.textview_keypress) self.textview.connect( "key-press-event", self.textview_keypress)
apply_font_css(self.textview, "Monospace 10") apply_font_css(self.textview, "Monospace 10")
self.textbuffer = self.textview.get_buffer( ) self.textbuffer = self.textview.get_buffer( )
self.lock = threading.Lock( )
self.last_timetag = None self.last_timetag = None
self( "Started in directory %s\n" % os.getcwd( ) ) self( "Started in directory %s\n" % os.getcwd( ) )
@@ -1365,6 +1366,7 @@ class LogWindow:
timetag_int = math.floor( timetag ) timetag_int = math.floor( timetag )
timetag_ms = int( (timetag - timetag_int) * 1000 ) timetag_ms = int( (timetag - timetag_int) * 1000 )
date_tag = time.strftime( "%Y%m%d %H:%M:%S.%%03d:\n", time.localtime( timetag_int ) ) % timetag_ms date_tag = time.strftime( "%Y%m%d %H:%M:%S.%%03d:\n", time.localtime( timetag_int ) ) % timetag_ms
with self.lock:
self.textbuffer.place_cursor( self.textbuffer.get_end_iter( ) ) self.textbuffer.place_cursor( self.textbuffer.get_end_iter( ) )
self.textbuffer.insert_at_cursor( date_tag + str( message ) ) self.textbuffer.insert_at_cursor( date_tag + str( message ) )
self.textview.scroll_to_mark( self.textbuffer.get_insert( ), 0.1 , False, 0.5, 0.5) self.textview.scroll_to_mark( self.textbuffer.get_insert( ), 0.1 , False, 0.5, 0.5)