Exemple #1
0
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);
}