Skip to content

Commit 8fdd425

Browse files
committed
ensured dtrace handle get's released; ensured cython doesn't screw-up when retrieving a handle.
1 parent 97bcbd1 commit 8fdd425

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

dtrace_cython/consumer.pyx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import time
33
import threading
44
from 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

Comments
 (0)