/* KDDKDDFREE Changed root to *root to allow NULL from ZOLTAN_FREE to propagate * KDDKDDFREE back to calling routine. */ int Zoltan_Oct_POct_delTree(OCT_Global_Info *OCT_info, pOctant *root) { int i; /* index counter */ pOctant child; /* child of an octant */ if(*root == NULL) return 1; if(Zoltan_Oct_isTerminal(*root)) { if(Zoltan_Oct_nRegions(*root)) Zoltan_Oct_clearRegions(*root); Zoltan_Oct_POct_free(OCT_info, root); } else { for(i=0; i<8; i++) { child = Zoltan_Oct_child(*root, i); if(child != NULL && Zoltan_Oct_POct_local(OCT_info,*root, i)) { Zoltan_Oct_POct_delTree(OCT_info,&child); /* KDDKDDFREE propagate NULL from Zoltan_Oct_POct_delTree to root->child */ (*root)->child[i] = NULL; (*root)->cpid[i] = -1; } /* KDDKDDFREE Added this condition so that tests (in other parts of the * KDDKDDFREE code) for NULL children work */ else if (child != NULL) { (*root)->child[i] = NULL; (*root)->cpid[i] = -1; } /* END KDDKDDFREE */ } Zoltan_Oct_POct_free(OCT_info, root); } return 1; }
/* * oct_global_clear() * * delete all regions from all octants on the local processor * */ static void Zoltan_Oct_global_clear(OCT_Global_Info * OCT_info) { pRList RootList; /* list of all local roots */ pOctant Oct; /* * iterate through the list of local roots * traverse down the subtree * delete regions associated with octant */ RootList = Zoltan_Oct_POct_localroots(OCT_info); while ((Oct = RL_nextRootOctant(&RootList))) { while(Oct) { if(Zoltan_Oct_isTerminal(Oct)) Zoltan_Oct_clearRegions(Oct); Oct = Zoltan_Oct_POct_nextDfs(OCT_info, Oct); } } }
static int Zoltan_Oct_Final_Migration( ZZ *zz, pOctant *octs, /* octs[nocts] */ int *newpids, /* newpids[nocts] */ pOctant *newocts, /* newocts[nocts] */ int nocts, /* number of octants leaving this processor */ int nrecocts) /* number of octants received in this processor */ { int i; Migrate_msg *msnd = NULL, *mrcv = NULL; int remotecount; int nsends; int nreceives; int *despid = NULL; int ierr = ZOLTAN_OK; ZOLTAN_COMM_OBJ *comm_plan; /* Object returned by communication routines */ char *yo = "Zoltan_Oct_Final_Migration"; OCT_Global_Info *OCT_info = (OCT_Global_Info *) zz->LB.Data_Structure; /* count number of sends */ nsends=0; for (i=0; i<nocts; i++) if (newpids[i]!=zz->Proc) nsends++; if((despid = (int *) ZOLTAN_MALLOC((nocts+10) * sizeof(int))) == NULL) { ZOLTAN_TRACE_EXIT(zz, yo); return ZOLTAN_MEMERR; } if((msnd = (Migrate_msg *) ZOLTAN_MALLOC((nocts+10) * sizeof(Migrate_msg))) == NULL) { ZOLTAN_TRACE_EXIT(zz, yo); ZOLTAN_FREE(&despid); return ZOLTAN_MEMERR; } remotecount = 0; for (i=0; i<nocts; i++) /* Send and free */ if (newpids[i]!=zz->Proc) { FILLMIGRATEMSG(octs[i], newocts[i], msnd[remotecount], zz->Proc); /* bug */ despid[remotecount++] = newpids[i]; Zoltan_Oct_clearRegions(octs[i]); /* KDDKDDFREE Change oct to &oct to allow NULL from ZOLTAN_FREE * KDDKDDFREE to propagate back. */ Zoltan_Oct_POct_free(OCT_info, &(octs[i])); } ierr = Zoltan_Comm_Create(&comm_plan, remotecount, despid, zz->Communicator, MigFinCommCreate, &nreceives); if(ierr != ZOLTAN_OK && ierr != ZOLTAN_WARN) { ZOLTAN_TRACE_EXIT(zz, yo); ZOLTAN_FREE(&despid); ZOLTAN_FREE(&msnd); return (ierr); } if((mrcv = (Migrate_msg *) ZOLTAN_MALLOC((nreceives+10) * sizeof(Migrate_msg))) == NULL) { ZOLTAN_TRACE_EXIT(zz, yo); ZOLTAN_FREE(&despid); ZOLTAN_FREE(&msnd); return ZOLTAN_MEMERR; } ierr = Zoltan_Comm_Do(comm_plan, MigFinCommDo, (char *) msnd, sizeof(Migrate_msg), (char *) mrcv); if(ierr != ZOLTAN_OK && ierr != ZOLTAN_WARN) { ZOLTAN_TRACE_EXIT(zz, yo); ZOLTAN_FREE(&despid); ZOLTAN_FREE(&msnd); ZOLTAN_FREE(&mrcv); return (ierr); } for (i=0; i<nreceives; i++) { /* Receive new parocts */ /* Zoltan_Oct_setID(mrcv[i].ptr,mrcv[i].id); */ /* Zoltan_Oct_POct_setparent(OCT_info, mrcv[i].ptr, mrcv[i].parent, mrcv[i].ppid); */ SETOCTFROMMIGRATEMSG(OCT_info, mrcv[i]); /* Zoltan_Oct_setchildnum(mrcv[i].ptr,mrcv[i].childnum); */ /* Zoltan_Oct_setchildren(mrcv[i].ptr, mrcv[i].children, mrcv[i].cpids); */ /* Zoltan_Oct_setbounds(mrcv[i].ptr, mrcv[i].min, mrcv[i].max); */ /* Zoltan_Oct_setDir(mrcv[i].ptr,mrcv[i].dir); */ /* Zoltan_Oct_setMapIdx(mrcv[i].ptr,mrcv[i].mapidx); */ } ierr = Zoltan_Comm_Destroy(&comm_plan); if(ierr != ZOLTAN_OK && ierr != ZOLTAN_WARN) { ZOLTAN_TRACE_EXIT(zz, yo); ZOLTAN_FREE(&despid); ZOLTAN_FREE(&msnd); ZOLTAN_FREE(&mrcv); return (ierr); } ZOLTAN_FREE(&despid); ZOLTAN_FREE(&msnd); ZOLTAN_FREE(&mrcv); return ierr; }