22import time
33import threading
44from threading import Thread
5- from dtrace_consumer .dtrace_h cimport *
5+ from dtrace_cython .dtrace_h cimport *
66
77# ----------------------------------------------------------------------------
88# The DTrace callbacks
@@ -242,7 +242,9 @@ cdef class DTraceConsumer:
242242 self .walk_func = walk_func or simple_walk
243243
244244 cdef int err
245- self .handle = dtrace_open(3 , 0 , & err)
245+ if not hasattr (self , ' handle' ):
246+ # ensure we only grab 1 - cython might call init twice, of more.
247+ self .handle = dtrace_open(3 , 0 , & err)
246248 if self .handle == NULL :
247249 raise Exception (dtrace_errmsg(NULL , err))
248250
@@ -255,11 +257,12 @@ cdef class DTraceConsumer:
255257 raise Exception (dtrace_errmsg(self .handle,
256258 dtrace_errno(self .handle)))
257259
258- def __del__ (self ):
260+ def __delalloc__ (self ):
259261 """
260262 Release DTrace handle.
261263 """
262- dtrace_close(self .handle)
264+ if self .handle != NULL :
265+ dtrace_close(self .handle)
263266
264267 cpdef compile (self , char * script):
265268 """
@@ -358,7 +361,9 @@ cdef class DTraceContinuousConsumer:
358361 self .script = script
359362
360363 cdef int err
361- self .handle = dtrace_open(3 , 0 , & err)
364+ if not hasattr (self , ' handle' ):
365+ # ensure we only grab 1 - cython might call init twice, of more.
366+ self .handle = dtrace_open(3 , 0 , & err)
362367 if self .handle == NULL :
363368 raise Exception (dtrace_errmsg(NULL , err))
364369
@@ -371,12 +376,13 @@ cdef class DTraceContinuousConsumer:
371376 raise Exception (dtrace_errmsg(self .handle,
372377 dtrace_errno(self .handle)))
373378
374- def __del__ (self ):
379+ def __delalloc__ (self ):
375380 """
376381 Release DTrace handle.
377382 """
378- dtrace_stop(self .handle)
379- dtrace_close(self .handle)
383+ if self .handle != NULL :
384+ dtrace_stop(self .handle)
385+ dtrace_close(self .handle)
380386
381387 cpdef go(self ):
382388 """
0 commit comments