X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/143464d58d2bd6378e74eec636961ceb0d32fb91..fe8ab488e9161c46dd9885d58fc52996dc0249ff:/tools/tests/perf_index/test_file_helper.c?ds=inline diff --git a/tools/tests/perf_index/test_file_helper.c b/tools/tests/perf_index/test_file_helper.c new file mode 100644 index 000000000..792a023d6 --- /dev/null +++ b/tools/tests/perf_index/test_file_helper.c @@ -0,0 +1,189 @@ +#include "test_file_helper.h" +#include "fail.h" +#include +#include +#include +#include +#include +#include +#include +#include + +static char readbuff[4096]; +static char writebuff[4096]; +static int* fds = NULL; + +char* setup_tempdir(char* buf) { + strcpy(buf, "/tmp/perfindex.XXXXXX"); + return mkdtemp(buf); +} + +int cleanup_tempdir(char* path) { + return rmdir(path); +} + +int test_file_create(char* path, int thread_id, int num_threads, long long length) { + long long i; + int fd; + int retval; + char filepath[MAXPATHLEN]; + + for(i=0; i= 0, "open failed"); + + close(fd); + } + + for(i=0; i= 0, "open failed"); + + bzero(readbuff, sizeof(readbuff)); + + while(left > 0) { + writelen = sizeof(readbuff) < left ? sizeof(readbuff) : left; + retval = write(fd, readbuff, writelen); + VERIFY(retval == writelen, "write failed"); + left -= writelen; + } + + return PERFINDEX_SUCCESS; +} + +int test_file_read(char* path, int thread_id, int num_threads, long long length, long long max_file_size) { + long long left; + size_t file_offset = 0; + int readlen; + int fd; + int retval; + char filepath[MAXPATHLEN]; + long long filesize; + + + if(max_file_size == 0) + max_file_size = MAXFILESIZE; + filesize = MIN(length, max_file_size/num_threads); + + snprintf(filepath, sizeof(filepath), "%s/file_read", path); + fd = open(filepath, O_RDONLY); + VERIFY(fd >= 0, "open failed"); + + for(left=length; left>0;) { + readlen = sizeof(readbuff) < left ? sizeof(readbuff) : left; + if(file_offset+readlen > filesize) { + retval = lseek(fd, 0, SEEK_SET); + + + VERIFY(retval >= 0, "lseek failed"); + + file_offset = 0; + continue; + } + retval = read(fd, readbuff, readlen); + VERIFY(retval == readlen, "read failed"); + left -= readlen; + file_offset += readlen; + } + return PERFINDEX_SUCCESS; +} + +int test_file_read_cleanup(char* path, int num_threads, long long length) { + char filepath[MAXPATHLEN]; + int retval; + + snprintf(filepath, sizeof(filepath), "%s/file_read", path); + retval = unlink(filepath); + VERIFY(retval == 0, "unlink failed"); + + return PERFINDEX_SUCCESS; +} + +int test_file_write_setup(char* path, int num_threads, long long length) { + int i; + char filepath[MAXPATHLEN]; + + if(fds == NULL) { + fds = (int*)malloc(sizeof(int)*num_threads); + VERIFY(fds, "malloc failed"); + } + + for(i=0; i0;) { + writelen = sizeof(writebuff) < left ? sizeof(writebuff) : left; + retval = write(fd, writebuff, writelen); + VERIFY(retval == writelen, "write failed"); + + left -= writelen; + file_offset += writelen; + if(file_offset>max_file_size/num_threads) { + retval = lseek(fd, 0, SEEK_SET); + VERIFY(retval >= 0, "leeks failed"); + file_offset = 0; + } + } + + return PERFINDEX_SUCCESS; +} + + +int test_file_write_cleanup(char* path, int num_threads, long long length) { + int i; + char filepath[MAXPATHLEN]; + int retval; + + for(i=0; i