// Old Compiler SPI point to release a copied Block used by the compiler in dispose helpers static void _Block_destroy(const void *arg) { struct Block_layout *aBlock; if (!arg) return; aBlock = (struct Block_layout *)arg; if (aBlock->flags & BLOCK_IS_GC) { // assert(aBlock->Block_flags & BLOCK_HAS_CTOR); return; // ignore, we are being called because of a DTOR } _Block_release(aBlock); }
int fts_close(FTS *sp) { FTSENT *freep, *p; int saved_errno; /* * This still works if we haven't read anything -- the dummy structure * points to the root list, so we step through to the end of the root * list which has a valid parent pointer. */ if (sp->fts_cur) { for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { freep = p; p = p->fts_link != NULL ? p->fts_link : p->fts_parent; free(freep); } free(p); } /* Free up child linked list, sort array, path buffer. */ if (sp->fts_child) fts_lfree(sp->fts_child); if (sp->fts_array) free(sp->fts_array); free(sp->fts_path); /* Free block pointer, if any. */ if (ISSET(FTS_COMPAR_B) && sp->fts_compar_b != NULL && _Block_release != 0) _Block_release(sp->fts_compar_b); /* Return to original directory, save errno if necessary. */ if (!ISSET(FTS_NOCHDIR)) { saved_errno = fchdir(sp->fts_rfd) ? errno : 0; (void)_close(sp->fts_rfd); /* Set errno and return. */ if (saved_errno != 0) { /* Free up the stream pointer. */ free(sp); errno = saved_errno; return (-1); } } /* Free up the stream pointer. */ free(sp); return (0); }
static void BlockReleaseCallback(CFAllocatorRef allocator, const void *value) { _Block_release((void *) value); }