Public Access
fix log dump race and unclosed HDF5 data pool file in DamarisGUI
This commit is contained in:
1 parent
efb01250c8
commit
da1dc4a088
1 file changed
+10
-8
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user