]> git.saurik.com Git - apple/xnu.git/blame - tools/tests/perf_index/stress_file_write.c
xnu-2422.1.72.tar.gz
[apple/xnu.git] / tools / tests / perf_index / stress_file_write.c
CommitLineData
39236c6e
A
1#include <fcntl.h>
2#include "perf_index.h"
3#include <errno.h>
4
5#define MAXFILESIZE 8589934592L
6
7static int *fds = NULL;
8static char writebuff[4096];
9
10void stress_file_write_init(const char *fs_path, int num_threads, long long length) {
11 int i;
12 char filepath[MAXPATHLEN];
13
14 if(fds == NULL)
15 fds = (int*)malloc(sizeof(int)*num_threads);
16 for(i=0; i<num_threads; i++) {
17 snprintf(filepath, sizeof(filepath), "%s/file_write-%d", fs_path, i);
18 fds[i] = open(filepath, O_CREAT | O_EXCL | O_WRONLY, 0644);
19 assert(fds[i] > 0);
20 }
21 bzero(writebuff, sizeof(writebuff));
22}
23
24void stress_file_write(const char *fs_path, int thread_id, int num_threads, long long length, long long max_file_size) {
25 long long left;
26 size_t file_offset = 0;
27 int writelen;
28 char filepath[MAXPATHLEN];
29 int fd = fds[thread_id];
30
31 if(max_file_size == 0)
32 max_file_size = MAXFILESIZE;
33
34 for(left=length; left>0;) {
35 writelen = sizeof(writebuff) < left ? sizeof(writebuff) : left;
36 assert(write(fd, writebuff, writelen) == writelen);
37 left -= writelen;
38 file_offset += writelen;
39 if(file_offset>max_file_size/num_threads) {
40 lseek(fd, 0, SEEK_SET);
41 file_offset = 0;
42 }
43 }
44 snprintf(filepath, sizeof(filepath), "%s/file_write-%d", fs_path, thread_id);
45 assert(unlink(filepath)>=0);
46}