134 int pageSize = getpagesize();
135 long heapPageMask = ~((long)pageSize-1);
136 long heapPage = (long)pointer & heapPageMask;
139 mlock((
void *)heapPage, pageSize);
140 munlock((
void *)heapPage, pageSize);
144 if (mincore((
void *)heapPage, pageSize, pageStatus) == 0)
145 return pageStatus[0] & MINCORE_INCORE;
184 for (
auto line : e.backtrace)
187 asprintf(&lineNumber,
"%3d ", i++);
188 oss << lineNumber << line << endl;
192 const char *format =
"%s:%d :: %s() :: %s\n%s";
193 int size = snprintf(NULL, 0, format, e.file, e.line, e.function, e.variable, oss.str().c_str());
194 char *description = (
char *)malloc(size+1);
195 snprintf(description, size+1, format, e.file, e.line, e.function, e.variable, oss.str().c_str());
197 const char *format =
"%s:%d :: %s() :: %s";
198 int size = snprintf(NULL, 0, format, e.file, e.line, e.function, e.variable);
199 char *description = (
char *)malloc(size+1);
200 snprintf(description, size+1, format, e.file, e.line, e.function, e.variable);
219 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, DISPATCH_TIMER_STRICT, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
220 dispatch_source_set_timer(timer, dispatch_walltime(NULL,0), NSEC_PER_SEC*dumpInterval, NSEC_PER_SEC*dumpInterval);
230 fprintf(stderr,
"\t% 3d refs to %p \"%s\", registered at %s\n", i->second.referenceCount, heapPointer, pointerSummary, description);
288 ostringstream errorMessage;
295 <<
", VuoRegister was called for bogus pointer " << heapPointer
296 <<
" " << description;
301 bool isAlreadyReferenceCounted;
307#ifdef VUOHEAP_TRACEALL
308 if (VuoHeap_isComposition())
313 fprintf(stderr,
"table=%p VuoRegister(%p) %s\n",
referenceCounts, heapPointer, pointerName);
319 if (! isAlreadyReferenceCounted)
322 (*referenceCounts)[heapPointer] = (
VuoHeapEntry){updatedCount, deallocate, file, linenumber, func, pointerName,
329 updatedCount = (*referenceCounts)[heapPointer].referenceCount;
333 if (isAlreadyReferenceCounted)
335 ostringstream errorMessage;
342 <<
", VuoRegister was called more than once for " << heapPointer
343 <<
" " << description;
355int VuoRegisterSingletonF(
const void *heapPointer,
const char *file,
unsigned int linenumber,
const char *func,
const char *pointerName)
362 ostringstream errorMessage;
369 <<
", VuoRegisterSingleton was called for bogus pointer " << heapPointer
370 <<
" " << description;
375 bool isAlreadyReferenceCounted;
380#ifdef VUOHEAP_TRACEALL
381 if (VuoHeap_isComposition())
386 fprintf(stderr,
"table=%p VuoRegisterSingleton(%p) %s\n",
referenceCounts, heapPointer, pointerName);
397 if (! isAlreadyReferenceCounted)
402 if (isAlreadyReferenceCounted)
404 ostringstream errorMessage;
411 <<
", VuoRegisterSingleton was called more than once for " << heapPointer
412 <<
" " << description;
417 return isAlreadyReferenceCounted ? 1 : 0;
447 char pointerSummary[17];
449 ostringstream errorMessage;
451 <<
", VuoRetain was called for bogus pointer " << heapPointer
452 <<
" \"" << pointerSummary <<
"\"";
456 int updatedCount = -1;
457 bool foundSingleton =
false;
461 map<const void *, VuoHeapEntry>::iterator i =
referenceCounts->find(heapPointer);
464#ifdef VUOHEAP_TRACEALL
465 if (VuoHeap_isComposition())
476 updatedCount = ++(i->second.referenceCount);
482 if (updatedCount == -1 && !foundSingleton)
484 char pointerSummary[17];
486 ostringstream errorMessage;
488 <<
", VuoRetain was called for unregistered pointer " << heapPointer
489 <<
" \"" << pointerSummary <<
"\"";
524 char pointerSummary[17];
526 ostringstream errorMessage;
528 <<
", VuoRelease was called for bogus pointer " << heapPointer
529 <<
" \"" << pointerSummary <<
"\"";
533 int updatedCount = -1;
534 bool foundSingleton =
false;
535 bool isRegisteredWithoutRetain =
false;
540 map<const void *, VuoHeapEntry>::iterator i =
referenceCounts->find(heapPointer);
543#ifdef VUOHEAP_TRACEALL
544 if (VuoHeap_isComposition())
556 if (i->second.referenceCount == 0)
558 isRegisteredWithoutRetain =
true;
562 updatedCount = --(i->second.referenceCount);
564 if (updatedCount == 0)
566 deallocate = i->second.deallocateFunction;
575 if (updatedCount == 0)
577#ifdef VUOHEAP_TRACEALL
578 if (VuoHeap_isComposition())
585 fprintf(stderr,
"table=%p VuoDeallocate(%p)\n",
referenceCounts, heapPointer);
593 if (updatedCount == 0)
594 deallocate((
void *)heapPointer);
595 else if (updatedCount == -1 && !foundSingleton)
597 char pointerSummary[17];
599 ostringstream errorMessage;
601 <<
", VuoRelease was called for "
602 << (isRegisteredWithoutRetain ?
"unretained" :
"unregistered")
603 <<
" pointer " << heapPointer
604 <<
" \"" << pointerSummary <<
"\"";