static void gmem_dimm_free(fmd_hdl_t *hdl, gmem_dimm_t *dimm, int destroy) { gmem_case_t *cc = &dimm->dimm_case; int i; gmem_mq_t *q; tstamp_t *tsp, *next; if (cc->cc_cp != NULL) { gmem_case_fini(hdl, cc->cc_cp, destroy); if (cc->cc_serdnm != NULL) { if (fmd_serd_exists(hdl, cc->cc_serdnm) && destroy) fmd_serd_destroy(hdl, cc->cc_serdnm); fmd_hdl_strfree(hdl, cc->cc_serdnm); } } gmem_fmri_fini(hdl, &dimm->dimm_asru, destroy); for (i = 0; i < GMEM_MAX_CKWDS; i++) { while ((q = gmem_list_next(&dimm->mq_root[i])) != NULL) { if (q->mq_serdnm != NULL) { if (fmd_serd_exists(hdl, q->mq_serdnm)) fmd_serd_destroy(hdl, q->mq_serdnm); fmd_hdl_strfree(hdl, q->mq_serdnm); q->mq_serdnm = NULL; } for (tsp = gmem_list_next(&q->mq_dupce_tstamp); tsp != NULL; tsp = next) { next = gmem_list_next(tsp); gmem_list_delete(&q->mq_dupce_tstamp, &tsp->ts_l); fmd_hdl_free(hdl, tsp, sizeof (tstamp_t)); } gmem_list_delete(&dimm->mq_root[i], q); fmd_hdl_free(hdl, q, sizeof (gmem_mq_t)); } } if (destroy) fmd_buf_destroy(hdl, NULL, dimm->dimm_bufname); gmem_list_delete(&gmem.gm_dimms, dimm); fmd_hdl_free(hdl, dimm, sizeof (gmem_dimm_t)); }
static void cmd_dimm_free(fmd_hdl_t *hdl, cmd_dimm_t *dimm, int destroy) { cmd_case_t *cc = &dimm->dimm_case; #ifdef sun4v cmd_branch_t *branch; #endif if (cc->cc_cp != NULL) { cmd_case_fini(hdl, cc->cc_cp, destroy); if (cc->cc_serdnm != NULL) { if (fmd_serd_exists(hdl, cc->cc_serdnm) && destroy) fmd_serd_destroy(hdl, cc->cc_serdnm); fmd_hdl_strfree(hdl, cc->cc_serdnm); } } if (dimm->dimm_bank != NULL) cmd_bank_remove_dimm(hdl, dimm->dimm_bank, dimm); #ifdef sun4v branch = cmd_branch_lookup_by_unum(hdl, dimm->dimm_unum); if (branch != NULL) cmd_branch_remove_dimm(hdl, branch, dimm); #endif cmd_fmri_fini(hdl, &dimm->dimm_asru, destroy); if (destroy) fmd_buf_destroy(hdl, NULL, dimm->dimm_bufname); cmd_list_delete(&cmd.cmd_dimms, dimm); fmd_hdl_free(hdl, dimm, sizeof (cmd_dimm_t)); }
void cmd_dimm_destroy(fmd_hdl_t *hdl, cmd_dimm_t *dimm) { int i; cmd_mq_t *q; for (i = 0; i < CMD_MAX_CKWDS; i++) { while ((q = cmd_list_next(&dimm->mq_root[i])) != NULL) { if (q->mq_serdnm != NULL) { if (fmd_serd_exists(hdl, q->mq_serdnm)) { fmd_serd_destroy(hdl, q->mq_serdnm); } fmd_hdl_strfree(hdl, q->mq_serdnm); q->mq_serdnm = NULL; } cmd_list_delete(&dimm->mq_root[i], q); fmd_hdl_free(hdl, q, sizeof (cmd_mq_t)); } } fmd_stat_destroy(hdl, 1, &(dimm->dimm_retstat)); cmd_dimm_free(hdl, dimm, FMD_B_TRUE); }