예제 #1
0
파일: libpe_init.c 프로젝트: tomtor/freebsd
void
libpe_release_object(PE *pe)
{
    PE_Scn *ps, *_ps;

    if (pe->pe_dh)
        free(pe->pe_dh);

    if (pe->pe_rh) {
        free(pe->pe_rh->rh_compid);
        free(pe->pe_rh->rh_cnt);
        free(pe->pe_rh);
    }

    if (pe->pe_ch)
        free(pe->pe_ch);

    if (pe->pe_oh)
        free(pe->pe_oh);

    if (pe->pe_dd)
        free(pe->pe_dd);

    if (pe->pe_stub)
        free(pe->pe_stub);

    STAILQ_FOREACH_SAFE(ps, &pe->pe_scn, ps_next, _ps)
    libpe_release_scn(ps);

    free(pe);
}
예제 #2
0
파일: elf_end.c 프로젝트: 0mp/freebsd
int
elf_end(Elf *e)
{
	Elf *sv;
	Elf_Scn *scn, *tscn;

	if (e == NULL || e->e_activations == 0)
		return (0);

	if (--e->e_activations > 0)
		return (e->e_activations);

	assert(e->e_activations == 0);

	while (e && e->e_activations == 0) {
		switch (e->e_kind) {
		case ELF_K_AR:
			/*
			 * If we still have open child descriptors, we
			 * need to defer reclaiming resources till all
			 * the child descriptors for the archive are
			 * closed.
			 */
			if (e->e_u.e_ar.e_nchildren > 0)
				return (0);
			break;
		case ELF_K_ELF:
			/*
			 * Reclaim all section descriptors.
			 */
			STAILQ_FOREACH_SAFE(scn, &e->e_u.e_elf.e_scn, s_next,
			    tscn)
 				scn = _libelf_release_scn(scn);
			break;
		case ELF_K_NUM:
			assert(0);
		default:
			break;
		}

		if (e->e_rawfile) {
			if (e->e_flags & LIBELF_F_RAWFILE_MALLOC)
				free(e->e_rawfile);
#if	ELFTC_HAVE_MMAP
			else if (e->e_flags & LIBELF_F_RAWFILE_MMAP)
				(void) munmap(e->e_rawfile, e->e_rawsize);
#endif
		}

		sv = e;
		if ((e = e->e_parent) != NULL)
			e->e_u.e_ar.e_nchildren--;
		sv = _libelf_release_elf(sv);
	}

	return (0);
}
예제 #3
0
파일: chipc.c 프로젝트: wulf7/freebsd
/* Free memory management state */
static void
chipc_free_rman(struct chipc_softc *sc)
{
	struct chipc_region *cr, *cr_next;

	STAILQ_FOREACH_SAFE(cr, &sc->mem_regions, cr_link, cr_next)
		chipc_free_region(sc, cr);

	rman_fini(&sc->mem_rman);
}