#define MEGABYTE (0x100000L) #define RECORD_THRESHOLD (5*1024) #include #include #include #include #include #include #include #include int main() { int fd; off_t file_location; struct stat file_info; char *dummy_ptr; char filename[100]; unsigned char *block_end_thresh; long int record_threshold; long int file_offset = 0; long int mmapsize = 0; fd = open(filename, O_RDONLY ); if (fd == -1) { } if (-1 == fstat(filename , &file_info)) { } /* * Need to make the mmap scroll along with the file. Use block_end_ptr and * block_end_thresh to do so. */ record_threshold = sysconf(_SC_PAGE_SIZE); file_offset = 0; file_location = file_info.st_size; if (file_location >= MEGABYTE) { mmapsize = MEGABYTE; } else { mmapsize = env_ptr ->input_file_size; } block_ptr = mmap(0,mmapsize,PROT_READ,MAP_PRIVATE,env_ptr->input_file,0); if (block_ptr == MAP_FAILED) { /* mmap failed */ } block_end_ptr = block_ptr + mmapsize; block_end_thresh = block_ptr + mmapsize - record_threshold; dummy_ptr = block_ptr; while ((!end_reached) && (dummy_ptr < block_end_ptr)) { if (dummy_ptr > block_end_thresh) { /* need to slide mmap window */ int processing_last_block = 0; int dummy_offset = dummy_ptr - block_end_thresh; file_offset += (mmapsize - record_threshold); munmap(block_ptr,mmapsize); if ((env_ptr ->input_file_size - file_offset) >= MEGABYTE) { mmapsize = MEGABYTE; } else { processing_last_block = 1; mmapsize = env_ptr ->input_file_size - file_offset; } block_ptr = mmap(0,mmapsize,PROT_READ,MAP_PRIVATE,env_ptr->input_file,file_offset); if (block_ptr == MAP_FAILED) { /* ERROR CHECKING */ return -1; } block_end_ptr = block_ptr + mmapsize; if (processing_last_block) block_end_thresh = block_ptr + mmapsize; else block_end_thresh = block_ptr + mmapsize - record_threshold; dummy_ptr = block_ptr + dummy_offset; } /* your code */ dummy_ptr++; } if (block_ptr != NULL) { munmap(block_ptr,mmapsize); } }