Multiple PMU implementation provide their private getl() implementation. Provide a common implementation to avoid code duplication and improve reuse. Also change the PMU files to reuse the common implementation.
Signed-off-by: Hendrik Brueckner <brueck...@linux.vnet.ibm.com> --- lib/pfmlib_arm.c | 55 +----------------------------------------- lib/pfmlib_common.c | 55 ++++++++++++++++++++++++++++++++++++++++++ lib/pfmlib_mips.c | 55 +----------------------------------------- lib/pfmlib_perf_event_pmu.c | 56 +------------------------------------------ lib/pfmlib_priv.h | 1 + lib/pfmlib_sparc.c | 55 +----------------------------------------- 6 files changed, 60 insertions(+), 217 deletions(-) diff --git a/lib/pfmlib_arm.c b/lib/pfmlib_arm.c index fdd885e..a49ca45 100644 --- a/lib/pfmlib_arm.c +++ b/lib/pfmlib_arm.c @@ -44,59 +44,6 @@ pfm_arm_config_t pfm_arm_cfg; #ifdef CONFIG_PFMLIB_OS_LINUX /* - * getl(): our own equivalent to GNU getline() extension. - * This avoids a dependency on having a C library with - * support for getline(). - */ -static int -getl(char **buffer, size_t *len, FILE *fp) -{ -#define GETL_DFL_LEN 32 - char *b; - int c; - size_t maxsz, maxi, i = 0, d; - - if (!len || !fp || !buffer) - return -1; - - b = *buffer; - - if (!b) - *len = 0; - - maxsz = *len; - maxi = maxsz - 2; - - while ((c = fgetc(fp)) != EOF) { - if (maxsz == 0 || i == maxi) { - if (maxsz == 0) - maxsz = GETL_DFL_LEN; - else - maxsz <<= 1; - - if (*buffer) - d = &b[i] - *buffer; - else - d = 0; - - *buffer = realloc(*buffer, maxsz); - if (!*buffer) - return -1; - - b = *buffer + d; - maxi = maxsz - d - 2; - i = 0; - *len = maxsz; - } - b[i++] = c; - if (c == '\n') - break; - } - b[i] = '\0'; - return c != EOF ? 0 : -1; -} - -/* * helper function to retrieve one value from /proc/cpuinfo * for internal libpfm use only * attr: the attribute (line) to look for @@ -128,7 +75,7 @@ pfmlib_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen) if (fp == NULL) return -1; - while(getl(&buffer, &buf_len, fp) != -1){ + while(pfmlib_getl(&buffer, &buf_len, fp) != -1){ /* skip blank lines */ if (*buffer == '\n') diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c index 77f6030..765f45b 100644 --- a/lib/pfmlib_common.c +++ b/lib/pfmlib_common.c @@ -225,6 +225,61 @@ __pfm_vbprintf(const char *fmt, ...) } /* + * pfmlib_getl: our own equivalent to GNU getline() extension. + * This avoids a dependency on having a C library with + * support for getline(). + */ +int +pfmlib_getl(char **buffer, size_t *len, FILE *fp) +{ +#define GETL_DFL_LEN 32 + char *b; + int c; + size_t maxsz, maxi, d, i = 0; + + if (!len || !fp || !buffer) + return -1; + + b = *buffer; + + if (!b) + *len = 0; + + maxsz = *len; + maxi = maxsz - 2; + + while ((c = fgetc(fp)) != EOF) { + if (maxsz == 0 || i == maxi) { + if (maxsz == 0) + maxsz = GETL_DFL_LEN; + else + maxsz <<= 1; + + if (*buffer) + d = &b[i] - *buffer; + else + d = 0; + + *buffer = realloc(*buffer, maxsz); + if (!*buffer) + return -1; + + b = *buffer + d; + maxi = maxsz - d - 2; + i = 0; + *len = maxsz; + } + b[i++] = c; + if (c == '\n') + break; + } + b[i] = '\0'; + return c != EOF ? 0 : -1; +} + + + +/* * append fmt+args to str such that the string is no * more than max characters incl. null termination */ diff --git a/lib/pfmlib_mips.c b/lib/pfmlib_mips.c index 50a21ed..8357ea5 100644 --- a/lib/pfmlib_mips.c +++ b/lib/pfmlib_mips.c @@ -45,59 +45,6 @@ static const pfmlib_attr_desc_t mips_mods[]={ #ifdef CONFIG_PFMLIB_OS_LINUX /* - * getl(): our own equivalent to GNU getline() extension. - * This avoids a dependency on having a C library with - * support for getline(). - */ -static int -getl(char **buffer, size_t *len, FILE *fp) -{ -#define GETL_DFL_LEN 32 - char *b; - int c; - size_t maxsz, maxi, i = 0, d; - - if (!len || !fp || !buffer) - return -1; - - b = *buffer; - - if (!b) - *len = 0; - - maxsz = *len; - maxi = maxsz - 2; - - while ((c = fgetc(fp)) != EOF) { - if (maxsz == 0 || i == maxi) { - if (maxsz == 0) - maxsz = GETL_DFL_LEN; - else - maxsz <<= 1; - - if (*buffer) - d = &b[i] - *buffer; - else - d = 0; - - *buffer = realloc(*buffer, maxsz); - if (!*buffer) - return -1; - - b = *buffer + d; - maxi = maxsz - d - 2; - i = 0; - *len = maxsz; - } - b[i++] = c; - if (c == '\n') - break; - } - b[i] = '\0'; - return c != EOF ? 0 : -1; -} - -/* * helper function to retrieve one value from /proc/cpuinfo * for internal libpfm use only * attr: the attribute (line) to look for @@ -129,7 +76,7 @@ pfmlib_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen) if (fp == NULL) return -1; - while(getl(&buffer, &buf_len, fp) != -1){ + while(pfmlib_getl(&buffer, &buf_len, fp) != -1){ /* skip blank lines */ if (*buffer == '\n') diff --git a/lib/pfmlib_perf_event_pmu.c b/lib/pfmlib_perf_event_pmu.c index 7fc73fa..f00ac78 100644 --- a/lib/pfmlib_perf_event_pmu.c +++ b/lib/pfmlib_perf_event_pmu.c @@ -163,60 +163,6 @@ perf_attridx2um(int idx, int attr_idx) } /* - * getl(): our own equivalent to GNU getline() extension. - * This avoids a dependency on having a C library with - * support for getline(). - */ -static int -getl(char **buffer, size_t *len, FILE *fp) -{ -#define GETL_DFL_LEN 32 - char *b; - int c; - size_t maxsz, maxi, i = 0, d; - - if (!len || !fp || !buffer) - return -1; - - b = *buffer; - - if (!b) - *len = 0; - - maxsz = *len; - maxi = maxsz - 2; - - while ((c = fgetc(fp)) != EOF) { - if (maxsz == 0 || i == maxi) { - if (maxsz == 0) - maxsz = GETL_DFL_LEN; - else - maxsz <<= 1; - - if (*buffer) - d = &b[i] - *buffer; - else - d = 0; - - *buffer = realloc(*buffer, maxsz); - if (!*buffer) - return -1; - - b = *buffer + d; - maxi = maxsz - d - 2; - i = 0; - *len = maxsz; - } - b[i++] = c; - if (c == '\n') - break; - } - b[i] = '\0'; - return c != EOF ? 0 : -1; -} - - -/* * figure out the mount point of the debugfs filesystem * * returns -1 if none is found @@ -234,7 +180,7 @@ get_debugfs_mnt(void) if (!fp) return -1; - while(getl(&buffer, &len, fp) != -1) { + while(pfmlib_getl(&buffer, &len, fp) != -1) { q = strchr(buffer, ' '); if (!q) diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h index 3f651ab..7fb550a 100644 --- a/lib/pfmlib_priv.h +++ b/lib/pfmlib_priv.h @@ -169,6 +169,7 @@ extern pfmlib_config_t pfm_cfg; extern void __pfm_vbprintf(const char *fmt,...); extern void __pfm_dbprintf(const char *fmt,...); extern void pfmlib_strconcat(char *str, size_t max, const char *fmt, ...); +extern int pfmlib_getl(char **buffer, size_t *len, FILE *fp); extern void pfmlib_compact_pattrs(pfmlib_event_desc_t *e, int i); #define evt_strcat(str, fmt, a...) pfmlib_strconcat(str, PFMLIB_EVT_MAX_NAME_LEN, fmt, a) diff --git a/lib/pfmlib_sparc.c b/lib/pfmlib_sparc.c index 97a4f96..f88b551 100644 --- a/lib/pfmlib_sparc.c +++ b/lib/pfmlib_sparc.c @@ -43,59 +43,6 @@ const pfmlib_attr_desc_t sparc_mods[]={ #ifdef CONFIG_PFMLIB_OS_LINUX /* - * getl(): our own equivalent to GNU getline() extension. - * This avoids a dependency on having a C library with - * support for getline(). - */ -static int -getl(char **buffer, size_t *len, FILE *fp) -{ -#define GETL_DFL_LEN 32 - char *b; - int c; - size_t maxsz, maxi, i = 0, d; - - if (!len || !fp || !buffer) - return -1; - - b = *buffer; - - if (!b) - *len = 0; - - maxsz = *len; - maxi = maxsz - 2; - - while ((c = fgetc(fp)) != EOF) { - if (maxsz == 0 || i == maxi) { - if (maxsz == 0) - maxsz = GETL_DFL_LEN; - else - maxsz <<= 1; - - if (*buffer) - d = &b[i] - *buffer; - else - d = 0; - - *buffer = realloc(*buffer, maxsz); - if (!*buffer) - return -1; - - b = *buffer + d; - maxi = maxsz - d - 2; - i = 0; - *len = maxsz; - } - b[i++] = c; - if (c == '\n') - break; - } - b[i] = '\0'; - return c != EOF ? 0 : -1; -} - -/* * helper function to retrieve one value from /proc/cpuinfo * for internal libpfm use only * attr: the attribute (line) to look for @@ -127,7 +74,7 @@ pfmlib_getcpuinfo_attr(const char *attr, char *ret_buf, size_t maxlen) if (fp == NULL) return -1; - while(getl(&buffer, &buf_len, fp) != -1){ + while(pfmlib_getl(&buffer, &buf_len, fp) != -1){ /* skip blank lines */ if (*buffer == '\n') -- 1.7.5.4 ------------------------------------------------------------------------------ Keep yourself connected to Go Parallel: INSIGHTS What's next for parallel hardware, programming and related areas? Interviews and blogs by thought leaders keep you ahead of the curve. http://goparallel.sourceforge.net _______________________________________________ perfmon2-devel mailing list perfmon2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/perfmon2-devel