Mercurial > hg > Members > shinya > pyrect
view pyrect/translator/template/grep.c @ 56:ee9945561f80
add parallel I/O grep (per line) with pthread. but it's very slow. really slow..
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 27 Oct 2010 20:46:41 +0900 |
parents | 7f4221018adf |
children | 81b44ae1cd73 |
line wrap: on
line source
typedef struct _thread_arg { unsigned char *buf; int match; } thread_arg_t; void* thread_dfa(void *arg) { thread_arg_t* targ = (thread_arg_t*)arg; targ->match = DFA(targ->buf); return NULL; } int paragrep(char *regexp, FILE *f, char *name) { int nmatch, used_buf = 0, reading = 1; char lbuf[THREAD_NUM][LINEBUFSIZE]; pthread_t hundle[THREAD_NUM]; thread_arg_t targ[THREAD_NUM]; int i, j, n, m; do { for (i = 0; i < THREAD_NUM; i++) { if (fgets(lbuf[i], sizeof lbuf[i], f) == NULL) { reading = 0; break; } else { n = strlen(lbuf[i]); if (n > 0 && lbuf[i][n-1] == '\n') lbuf[i][n-1] = '\0'; } } for (j = 0; j < i; j++) { targ[j].buf = (unsigned char *)lbuf[j]; pthread_create(&hundle[j], NULL, (void *)thread_dfa, (void *)&targ[j]); } for (j = 0; j < i; j++) { pthread_join(hundle[j], NULL); if (targ[j].match) { nmatch++; if (name != NULL) printf("%s:", name); printf("%s\n", targ[j].buf); } } } while (i != 0); return nmatch; } int grep(char *regexp, FILE *f, char *name) { int n, nmatch; char lbuf[LINEBUFSIZE]; buf = (unsigned char *)lbuf; nmatch = 0; while (fgets(lbuf, sizeof lbuf, f) != NULL) { n = strlen(lbuf); if (n > 0 && buf[n-1] == '\n') lbuf[n-1] = '\0'; if (DFA(buf)) { nmatch++; if (name != NULL) printf("%s:", name); printf("%s\n", lbuf); } } return nmatch; } int main(int argc, char* argv[]) { int i, nmatch; FILE *f; if (argc < 2) { fprintf(stderr, "usage: grep regexp [file ...]"); exit(0); } nmatch = 0; if (argc == 2) { if (GREP(argv[1], stdin, NULL)) nmatch++; } else { for (i = 2; i < argc; i++) { f = fopen(argv[i], "r"); if (f == NULL) { fprintf(stderr, "can't open %s:", argv[i]); continue; } if (READBUFSIZE > 0) setvbuf(f, readbuf, _IOFBF, READBUFSIZE); if (GREP(argv[1], f, argc > 3 ? argv[i] : NULL) > 0) nmatch++; fclose(f); } } return nmatch; }