# HG changeset patch # User Masataka Kohagura # Date 1399799642 -32400 # Node ID 178cf2dfc45b53217c0e199b66bccf9b7fa5ebe1 # Parent 2a50f327e405bc3a51f9571f080ca1abdd159620 add make test diff -r 2a50f327e405 -r 178cf2dfc45b c/mmap/Makefile --- a/c/mmap/Makefile Sun May 11 03:52:24 2014 +0900 +++ b/c/mmap/Makefile Sun May 11 18:14:02 2014 +0900 @@ -8,3 +8,6 @@ rm -f $(TARGET) rm -r $(TARGET).dSYM rm -f *~ \#* + +test: + ./mmap -file main.cc diff -r 2a50f327e405 -r 178cf2dfc45b c/mmap/main.cc --- a/c/mmap/main.cc Sun May 11 03:52:24 2014 +0900 +++ b/c/mmap/main.cc Sun May 11 18:14:02 2014 +0900 @@ -1,52 +1,23 @@ #include #include +#include #include #include -#include -#include #include -#include #include -#include "read.h" - -static double st_time; -static double ed_time; +#include -/* - * -b : bulk read 一括read - * -d : divide read 分割read (default) - */ -const char *usr_help_str = "Usage : ./read_lseek [-file filename] [-b -d]"; -const int ONE_TASK_READ_SIZE = 4096 * 1; -bool bulk_flag = true; -bool divide_flag = false; -void result_printf(int,char *); -void divide_read(int,char*,read_t); -void bulk_read(int,char*,read_t); - -static double -get_time(){ - struct timeval tv; - gettimeofday(&tv,NULL); - return tv.tv_sec + (double)tv.tv_usec*1e-6; -} +const char *usr_help_str = "Usage : ./mmap [-file filename]"; int main(int argc, char *argv[]){ struct stat sb; - read_t r; char *filename = 0; for (int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-file") == 0){ - filename = argv[i+1]; - }else if(strcmp(argv[i], "-b") == 0){ - bulk_flag = true; - divide_flag = false; - }else if(strcmp(argv[i], "-d") == 0){ - bulk_flag = false; - divide_flag = true; + filename = argv[i+1]; i++; } } @@ -55,8 +26,6 @@ exit(1); } - st_time = get_time(); - int fd = -1; if ((fd=open(filename,O_RDONLY,0666))==0){ fprintf(stderr,"can't open %s\n",filename); @@ -66,54 +35,13 @@ fprintf(stderr,"can't open %s\n",filename); } - r.text_size = sb.st_size; - char *text = (char *)malloc(sizeof(char)*r.text_size); - - r.one_task_read_size = ONE_TASK_READ_SIZE; - - r.task_num = r.text_size / r.one_task_read_size; - r.task_num += ((r.text_size % r.one_task_read_size) != 0); + int text_size = sb.st_size; + char *text = (char *)mmap(0, text_size, PROT_READ, MAP_PRIVATE, fd, 0); - if(bulk_flag == true){ - bulk_read(fd,text,r); - }else if(divide_flag == true){ - divide_read(fd,text,r); - } + printf("%s\n",text); - free(text); + munmap(text, text_size); close(fd); - ed_time = get_time(); - printf("Time: %0.6f\n",ed_time-st_time); - return 0; } - -/* lseekで読む場所を指定してあげないといけないと思ったが、 - * readで読み込むだけでも読み込む場所が変わってくれるらしい。 - */ -void divide_read(int _fd,char* _text,read_t _r){ - for(int i = 0; i < _r.task_num; i++){ - //lseek(_fd, i * _r.one_task_read_size,SEEK_SET); - read(_fd,_text,_r.one_task_read_size); - result_printf(i,_text); - } - puts("divide read"); - printf("text size :%lu\n",_r.text_size); - printf("one task size:%d\n",_r.one_task_read_size); - printf("task num :%d\n",_r.task_num); -} - -void bulk_read(int _fd,char* _text,read_t _r){ - int i = 0; - read(_fd,_text,_r.text_size); - result_printf(i,_text); - puts("bulk read"); - printf("text size :%lu\n",_r.text_size); -} - -void result_printf(int _i,char *_text){ - //printf("-------%d--------\n",_i + 1); - printf("[task No. %d]%s\n",_i,_text); - //printf("-----------------\n\n"); -}