void * consume(void *arg_) { struct consume_arg *arg = arg_; struct queue *q = arg->q; struct kmp_table *t = arg->t; char buffer[BUFFER_SIZE]; for (;;) { char *path = dequeue(q); int pos = 0; int file; int bytes_read = 0; struct kmp_result r; if (!path) { return (NULL); } file = checked_open(path, O_RDONLY); if (file == -1) { fprintf_ts(stderr, "Cannot open %s\n", path); free(path); continue; } while ((bytes_read = checked_read(file, buffer, BUFFER_SIZE)) > 0) { int i; for (i = 0; i < bytes_read; i++) { advance(t, &r, buffer[i], pos); pos = r.pos; if (r.match) { fprintf_ts(stdout, "%s\n", path); break; } } if (r.match) { break; } } free(path); checked_close(file); } }
int main(int argc, char *argv[]) { int nr = 2; char c; int mapflag = MAP_SHARED; unsigned long memsize = 0; int hugetlbfd1; char *phugetlbfile1; unsigned long address = ADDR_INPUT; char *filename; while ((c = getopt(argc, argv, "h:f:n:v")) != -1) { switch(c) { case 'h': HPS = strtoul(optarg, NULL, 10) * 1024; break; case 'f': filename = optarg; break; case 'n': nr = strtoul(optarg, NULL, 10); break; case 'v': verbose = 1; break; } } if (!filename) { errmsg("need to specify file path with -f\n"); } validate_hugepage_size(HPS); memsize = nr * HPS; signal(SIGUSR1, sig_handle); Dprintf("memsize = 0x%x, hpsize = %d, mapflag = 0x%x\n", memsize, HPS, mapflag); hugetlbfd1 = checked_open(filename, O_CREAT|O_RDWR); phugetlbfile1 = checked_mmap((void *)address, memsize, MMAP_PROT, mapflag, hugetlbfd1, 0); Dprintf("p %p\n", phugetlbfile1); memset(phugetlbfile1, 'a', memsize); munmap(phugetlbfile1, memsize); checked_close(hugetlbfd1); pprintf("%s exit\n", argv[0]); exit(EXIT_SUCCESS); }