void CalcFaceCentroidFromNodes (FacePtr pF) { double Cx = 0.0, Cy = 0.0, Cz = 0.0; // to sum x, y, and z locations for all Nodes int numNodes, nN; // to count and loop over Nodes LItemPtr pNLI; // the Node list of the Face NodePtr pN; pNLI = pF->p1stNodeLI; numNodes = CountListItems (pNLI); for (nN = 0; nN < numNodes; nN++) { pN = (NodePtr)RetrieveListItem (pNLI, umNODE, nN); Cx += pN->Loc3D.x; Cy += pN->Loc3D.y; Cz += pN->Loc3D.z; } pF->Centroid.x = Cx / numNodes; pF->Centroid.y = Cy / numNodes; pF->Centroid.z = Cz / numNodes; }
int RunTheTest(struct cmd_syndesc *a_s, void *arock) { /*RunTheTest */ static char rn[] = "RunTheTest"; /*Routine name */ int code; /*Return code */ int numCMs; /*# Cache Managers to monitor */ int numCollIDs; /*# collections to fetch */ int currCM; /*Loop index */ int currCollIDIdx; /*Index of current collection ID */ afs_int32 *collIDP; /*Ptr to array of collection IDs */ afs_int32 *currCollIDP; /*Ptr to current collection ID */ struct cmd_item *curr_item; /*Current CM cmd line record */ struct sockaddr_in *CMSktArray; /*Cache Manager socket array */ struct hostent *he; /*Host entry */ int initFlags; /*Flags passed to the init fcn */ int freq; /*Frequency of polls */ int period; /*Time in minutes of data collection */ opr_softsig_Init(); /* * Are we doing one-shot measurements? */ if (a_s->parms[P_ONESHOT].items != 0) one_shot = 1; /* * Are we doing debugging output? */ if (a_s->parms[P_DEBUG].items != 0) debugging_on = 1; /* * Pull out the number of Cache Managers to watch and the number of * collections to get. */ numCMs = CountListItems(a_s->parms[P_CM_NAMES].items); numCollIDs = CountListItems(a_s->parms[P_COLL_IDS].items); /* Get the polling frequency */ if (a_s->parms[P_FREQUENCY].items != 0) freq = atoi(a_s->parms[P_FREQUENCY].items->data); else freq = 30; /* default to 30 seconds */ /* Get the time duration to run the tests */ if (a_s->parms[P_PERIOD].items != 0) period = atoi(a_s->parms[P_PERIOD].items->data); else period = 10; /* default to 10 minutes */ /* * Allocate the socket array. */ if (debugging_on) printf("%s: Allocating socket array for %d Cache Manager(s)\n", rn, numCMs); if (numCMs > 0) { CMSktArray = calloc(numCMs, sizeof(struct sockaddr_in)); if (CMSktArray == NULL) { printf("%s: Can't allocate socket array for %d Cache Managers\n", rn, numCMs); exit(1); } } else { CMSktArray = NULL; } /* * Fill in the socket array for each of the Cache Managers listed. */ curr_item = a_s->parms[P_CM_NAMES].items; for (currCM = 0; currCM < numCMs; currCM++) { CMSktArray[currCM].sin_family = AF_INET; CMSktArray[currCM].sin_port = htons(7001); /* Cache Manager port */ he = hostutil_GetHostByName(curr_item->data); if (he == NULL) { fprintf(stderr, "[%s] Can't get host info for '%s'\n", rn, curr_item->data); exit(-1); } memcpy(&(CMSktArray[currCM].sin_addr.s_addr), he->h_addr, 4); /* * Move to the next CM name. */ curr_item = curr_item->next; } /*Get socket info for each Cache Manager */ /* * Create and fill up the array of desired collection IDs. */ if (debugging_on) printf("Allocating %d long(s) for coll ID\n", numCollIDs); if (numCollIDs > 0) collIDP = calloc(numCollIDs, sizeof(afs_int32)); else collIDP = NULL; currCollIDP = collIDP; curr_item = a_s->parms[P_COLL_IDS].items; for (currCollIDIdx = 0; currCollIDIdx < numCollIDs; currCollIDIdx++) { *currCollIDP = (afs_int32) (atoi(curr_item->data)); if (debugging_on) printf("CollID at index %d is %d\n", currCollIDIdx, *currCollIDP); curr_item = curr_item->next; currCollIDP++; }; /* * Crank up the Cache Manager prober, then sit back and have fun. */ printf("\nStarting up the xstat_cm service, "); initFlags = 0; if (debugging_on) { initFlags |= XSTAT_CM_INITFLAG_DEBUGGING; printf("debugging enabled, "); } else printf("no debugging, "); if (one_shot) { initFlags |= XSTAT_CM_INITFLAG_ONE_SHOT; printf("one-shot operation\n"); } else printf("continuous operation\n"); code = xstat_cm_Init(numCMs, /*Num CMs */ CMSktArray, /*File Server socket array */ freq, /*Probe every 30 seconds */ CM_Handler, /*Handler routine */ initFlags, /*Initialization flags */ numCollIDs, /*Number of collection IDs */ collIDP); /*Ptr to collection ID array */ if (code) { fprintf(stderr, "[%s] Error returned by xstat_cm_Init: %d\n", rn, code); xstat_cm_Cleanup(1); /*Get rid of malloc'ed structures */ exit(-1); } /* Wait for the collection complete. */ xstat_cm_Wait(60 * period); /* * We're all done. Clean up, put the last nail in Rx, then * exit happily. */ if (debugging_on) printf("\nYawn, main thread just woke up. Cleaning things out...\n"); xstat_cm_Cleanup(1); /*Get rid of malloc'ed data */ rx_Finalize(); return (0); } /*RunTheTest */