void freeMetric(Metric *m) { int numinst; /* Metric is on fetch list */ if (m->profile) { if (m->prev) { m->prev->next = m->next; if (m->next) m->next->prev = m->prev; } else { m->host->waits = m->next; if (m->next) m->next->prev = NULL; } if (m->host) freeHost(m->host); } symFree(m->hname); numinst = m->specinst == 0 ? m->m_idom : m->specinst; if (numinst > 0 && m->inames) { int i; for (i = 0; i < numinst; i++) { if (m->inames[i] != NULL) free(m->inames[i]); } free(m->inames); } if (numinst && m->iids) free(m->iids); if (m->vals) free(m->vals); }
void freeHost(Host *h) { if ((h->fetches == NULL) && (h->waits == NULL)) { if (h->next) h->next->prev = h->prev; if (h->prev) h->prev->next = h->next; else { h->task->hosts = h->next; freeTask(h->task); } symFree(h->name); free(h); } }
STATUS newfh(vxfh_t * vxfhp, char *fullpath) { DEV_HDR *devhdrp; SYMBOL *sp, *sp2; int fd; char *valuep, type; if ((fd = open(fullpath, O_RDONLY, 0)) < 0) return ERROR; if ((devhdrp = iosFdDevFind(fd)) == NULL) { close(fd); return ERROR; } if (devhdrp->drvNum == rt11FsDrvNum) { vxfhp->type = rt11FsDrvNum; strcpy(vxfhp->opaque, fullpath); close(fd); return OK; } if (devhdrp->drvNum == dosFsDrvNum) { path_to_all_lower(fullpath); if (symFindByName(nfsd_pathtab, fullpath, &valuep, &type) == OK) { vxfhp->type = dosFsDrvNum; *((int *) (vxfhp->opaque)) = (int) valuep; close(fd); nfsd_debug("newfh: return existing valuep %x <%s>\n", valuep, fullpath); return OK; } if (!(sp = symAlloc(nfsd_pathtab, fullpath, 0, (SYM_TYPE) NFSD_MSDOS_TYPE, 0))) { nfsd_debug("newfh: can't symAlloc sp %x <%s>\n", sp, fullpath); nfsd_debugno(); close(fd); return ERROR; } sp->value = (char *) sp; if (symTblAdd(nfsd_pathtab, sp) == ERROR) { /* * XXX -- only try 2 times if it fails. highly * unlikely hash will collide two times in a row with * different values. but this is obviously imperfect. */ if (!(sp2 = symAlloc(nfsd_pathtab, fullpath, 0, (SYM_TYPE) NFSD_MSDOS_TYPE, 0))) { nfsd_debug("newfh: can't symAlloc sp2 <%s>\n", fullpath); close(fd); symFree(nfsd_pathtab, sp); return ERROR; } symFree(nfsd_pathtab, sp); sp = sp2; sp->value = (char *) sp; if (symTblAdd(nfsd_pathtab, sp) == ERROR) { nfsd_debugno(); nfsd_debug("newfh: couldn't add <%s>\n", fullpath); symFree(nfsd_pathtab, sp); close(fd); return ERROR; } } nfsd_debug("newfh: <%s> added as <%x>\n", fullpath, sp); nfsd_debug("newfh: total %d paths are in pathtab now.\n", nfsd_pathtab->nsymbols); vxfhp->type = dosFsDrvNum; *((int *) (vxfhp->opaque)) = (int) sp; close(fd); return OK; } close(fd); return ERROR; }