--- /var/tmp/p_rdiff_a02jtQ/callback.c Fri Dec 1 16:11:40 2000 +++ src/libpcp_pmda/src/callback.c Fri Dec 1 12:57:04 2000 @@ -273,9 +273,6 @@ int pmdaFetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda) { - static int maxnpmids = 0; - static pmResult *res = NULL; - int i; /* over pmidlist[] */ int j; /* over metatab and vset->vlist[] */ int sts; @@ -288,20 +285,21 @@ pmdaMetric *metap; pmAtomValue atom; int type; + e_ext_t *extp = (e_ext_t *)pmda->e_ext; - if (numpmid > maxnpmids) { - if (res != NULL) - free(res); + if (numpmid > extp->maxnpmids) { + if (extp->res != NULL) + free(extp->res); /* (numpmid - 1) because there's room for one valueSet in a pmResult */ need = (int)sizeof(pmResult) + (numpmid - 1) * (int)sizeof(pmValueSet *); - if ((res = (pmResult *) malloc(need)) == NULL) + if ((extp->res = (pmResult *) malloc(need)) == NULL) return -errno; - maxnpmids = numpmid; + extp->maxnpmids = numpmid; } - res->timestamp.tv_sec = 0; - res->timestamp.tv_usec = 0; - res->numpmid = numpmid; + extp->res->timestamp.tv_sec = 0; + extp->res->timestamp.tv_usec = 0; + extp->res->numpmid = numpmid; for (i = 0; i < numpmid; i++) { @@ -360,13 +358,13 @@ /* Must use individual malloc()s because of pmFreeResult() */ if (numval == 1) - res->vset[i] = vset = (pmValueSet *) + extp->res->vset[i] = vset = (pmValueSet *) __pmPoolAlloc(sizeof(pmValueSet)); else if (numval > 1) - res->vset[i] = vset = (pmValueSet *)malloc(sizeof(pmValueSet) + + extp->res->vset[i] = vset = (pmValueSet *)malloc(sizeof(pmValueSet) + (numval - 1)*sizeof(pmValue)); else - res->vset[i] = vset = (pmValueSet *)malloc(sizeof(pmValueSet) - + extp->res->vset[i] = vset = (pmValueSet *)malloc(sizeof(pmValueSet) - sizeof(pmValue)); if (vset == NULL) { sts = -errno; @@ -390,7 +388,7 @@ if (j == numval) { /* more instances than expected! */ numval++; - res->vset[i] = vset = (pmValueSet *)realloc(vset, + extp->res->vset[i] = vset = (pmValueSet *)realloc(vset, sizeof(pmValueSet) + (numval - 1)*sizeof(pmValue)); if (vset == NULL) { sts = -errno; @@ -427,8 +425,6 @@ * == 0 => no values * > 0 => OK */ - e_ext_t *extp = (e_ext_t *)pmda->e_ext; - if (extp->pmda_interface == PMDA_INTERFACE_2 || (extp->pmda_interface == PMDA_INTERFACE_3 && sts > 0)) { @@ -452,14 +448,14 @@ vset->numval = j; } - *resp = res; + *resp = extp->res; return 0; error: if (i) { - res->numpmid = i; - __pmFreeResultValues(res); + extp->res->numpmid = i; + __pmFreeResultValues(extp->res); } return sts; } --- /var/tmp/p_rdiff_a02kUs/libdefs.h Fri Dec 1 16:12:05 2000 +++ src/libpcp_pmda/src/libdefs.h Fri Dec 1 12:50:35 2000 @@ -40,10 +40,13 @@ /* * Auxilliary structure used to save data from pmdaDSO or pmdaDaemon and - * make it available to the other methods. + * make it available to the other methods, also as private per PMDA data + * when multiple DSO PMDAs are in use */ typedef struct { int pmda_interface; + pmResult *res; /* high-water allocation for */ + int maxnpmids; /* pmResult for each PMDA */ } e_ext_t; #endif /* LIBDEFS_H */ --- /var/tmp/p_rdiff_a02kHO/open.c Fri Dec 1 16:12:24 2000 +++ src/libpcp_pmda/src/open.c Fri Dec 1 12:57:53 2000 @@ -660,6 +660,8 @@ return; } extp->pmda_interface = interface; + extp->res = NULL; + extp->maxnpmids = 0; pmda->e_ext = (void *)extp; pmdaSetResultCallBack(dispatch, __pmFreeResultValues);