diff options
author | hunt <hunt> | 2005-06-28 17:57:28 +0000 |
---|---|---|
committer | hunt <hunt> | 2005-06-28 17:57:28 +0000 |
commit | 8a32c18d30dcd9dd664df74cd0c647ddfc060171 (patch) | |
tree | adbd0e4f348f412e14b27ff5a56e18d3e363dc4f /runtime/stpd/librelay.c | |
parent | 63e9752cb5df26bc1a195feff92ad09f6d07482a (diff) | |
download | systemtap-steved-8a32c18d30dcd9dd664df74cd0c647ddfc060171.tar.gz systemtap-steved-8a32c18d30dcd9dd664df74cd0c647ddfc060171.tar.xz systemtap-steved-8a32c18d30dcd9dd664df74cd0c647ddfc060171.zip |
2005-06-28 Martin Hunt <hunt@redhat.com>
* librelay.c (merge_output): Use unlocked stdio
to improve speed.
* stp_merge.c: New file.
* Makefile: Add stp_merge.
Diffstat (limited to 'runtime/stpd/librelay.c')
-rw-r--r-- | runtime/stpd/librelay.c | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/runtime/stpd/librelay.c b/runtime/stpd/librelay.c index dd475239..f997981b 100644 --- a/runtime/stpd/librelay.c +++ b/runtime/stpd/librelay.c @@ -508,21 +508,15 @@ int init_stp(const char *modname, static int merge_output(void) { int c, i, j, dropped=0; - long count=0, min, num[NR_CPUS]; - char *ptr, tmp[PATH_MAX]; - FILE *ofp, *fp[NR_CPUS]; + long count=0, min, num[ncpus]; + char buf[32], tmp[PATH_MAX]; + FILE *ofp, *fp[ncpus]; - char *buf = malloc (MERGE_BUF_SIZE); - if (!buf) { - perror("malloc in merge_ouptut:"); - return -1; - } - for (i = 0; i < ncpus; i++) { - sprintf(tmp, "%s%d", percpu_tmpfilebase, i); - fp[i] = fopen(tmp, "r"); + sprintf (tmp, "%s%d", percpu_tmpfilebase, i); + fp[i] = fopen (tmp, "r"); if (!fp[i]) { - fprintf(stderr, "error opening file %s.\n", tmp); + fprintf (stderr, "error opening file %s.\n", tmp); return -1; } if (fread (buf, TIMESTAMP_SIZE, 1, fp[i])) @@ -530,9 +524,10 @@ static int merge_output(void) else num[i] = 0; } - ofp = fopen(outfile_name, "w"); + + ofp = fopen (outfile_name, "w"); if (!ofp) { - fprintf(stderr, "ERROR: couldn't open output file %s: errcode = %s\n", + fprintf (stderr, "ERROR: couldn't open output file %s: errcode = %s\n", outfile_name, strerror(errno)); return -1; } @@ -547,12 +542,14 @@ static int merge_output(void) } } - ptr = buf; while (1) { - c = fgetc(fp[j]); + c = fgetc_unlocked (fp[j]); if (c == 0 || c == EOF) break; - *ptr++ = c; + if (!quiet) + fputc_unlocked (c, stdout); + if (!print_only) + fputc_unlocked (c, ofp); } if (min && ++count != min) { // fprintf(stderr, "got %ld. expected %ld\n", min, count); @@ -560,12 +557,6 @@ static int merge_output(void) dropped++ ; } - *ptr = 0; - if (!quiet) - fputs (buf, stdout); - if (!print_only) - fputs (buf, ofp); - if (fread (buf, TIMESTAMP_SIZE, 1, fp[j])) num[j] = strtoul (buf, NULL, 10); else @@ -595,7 +586,7 @@ static void postprocess_and_exit(void) if (!streaming() && merge) { close_all_relayfs_files(); merge_output(); - delete_percpu_files(); + //delete_percpu_files(); } close(control_channel); |