#include <sys/sysctl.h>
#include <kern/host.h>
+#include <kern/zalloc.h>
#include <IOKit/system.h>
#include <libkern/c++/OSKext.h>
IOWorkLoopCounter *wlc;
IOUserClientProcessEntry *uce;
- /* Free up the list of counters */
+ /* Disconnect workloop counters; cleanup takes place in unregisterWorkLoop() */
while ((wlc = SLIST_FIRST(&found->workLoopList))) {
SLIST_REMOVE_HEAD(&found->workLoopList, link);
- kfree(wlc, sizeof(IOWorkLoopCounter));
+ wlc->parentKext = NULL;
}
/* Free up the user client list */
}
IORWLockWrite(lock);
-
- SLIST_REMOVE(&counter->parentKext->workLoopList, counter, IOWorkLoopCounter, link);
+ if (counter->parentKext) {
+ SLIST_REMOVE(&counter->parentKext->workLoopList, counter, IOWorkLoopCounter, link);
+ }
kfree(counter, sizeof(IOWorkLoopCounter));
registeredWorkloops--;
vm_offset_t *scanAddr = NULL;
uint32_t i;
KextNode *found = NULL, *ke = NULL;
-
- btCount = OSBacktrace(bt, btCount);
+
+ /*
+ * Gathering the backtrace is a significant source of
+ * overhead. OSBacktrace does many safety checks that
+ * are not needed in this situation.
+ */
+ btCount = fastbacktrace((uintptr_t*)bt, btCount);
if (write) {
IORWLockWrite(lock);