@@ -76,25 +76,47 @@ def __init__(self, constructor, destructor):
7676 self ._cache = {}
7777 self ._lock = threading .Lock ()
7878 self ._counter = 0
79+ self ._purge_buffer = []
80+ self ._owner2_buffer = []
7981
8082 def _next_id (self ):
81- with self ._lock :
82- self ._counter += 1
83- return self ._counter
83+ # Caller must hold self._lock.
84+ self ._counter += 1
85+ return self ._counter
8486
8587 def register (self ):
86- owner = self ._next_id ()
87- self ._live_owners .add (owner )
88+ with self ._lock :
89+ owner = self ._next_id ()
90+ self ._live_owners .add (owner )
91+ if owner == 2 :
92+ self ._owner2_buffer .append ({
93+ 'action' : 'register' ,
94+ 'pid' : os .getpid (),
95+ 'live_owners' : list (self ._live_owners )
96+ })
8897 return owner
8998
9099 def purge (self , owner ):
91100 to_delete = []
92101 with self ._lock :
102+ self ._purge_buffer .append ({
103+ 'owner' : owner ,
104+ 'pid' : os .getpid (),
105+ 'live_owners' : ("%s" % self ._live_owners ),
106+ })
107+ if owner == 2 :
108+ self ._owner2_buffer .append ({
109+ 'action' : 'purge' ,
110+ 'pid' : os .getpid (),
111+ 'live_owners' : list (self ._live_owners )
112+ })
93113 if owner not in self ._live_owners :
94114 _LOGGER .warning (
95115 "Subprocess owner %s already purged. If this occurs during atexit "
96- "shutdown, the subprocess was already cleaned up earlier." ,
97- owner )
116+ "shutdown, the subprocess was already cleaned up earlier. Purge buffer: %s. Owner 2 buffer: %s" ,
117+ owner ,
118+ self ._purge_buffer ,
119+ self ._owner2_buffer )
98120 return
99121 self ._live_owners .remove (owner )
100122 for key , entry in list (self ._cache .items ()):
@@ -103,6 +125,11 @@ def purge(self, owner):
103125 if not entry .owners :
104126 to_delete .append (entry .obj )
105127 del self ._cache [key ]
128+ if to_delete :
129+ _LOGGER .warning (
130+ "Purging subprocess. Purge buffer: %s. Owner 2 buffer: %s" ,
131+ self ._purge_buffer ,
132+ self ._owner2_buffer )
106133 # Actually call the destructors outside of the lock.
107134 for value in to_delete :
108135 self ._destructor (value )
0 commit comments