12 #include <sys/types.h>
14 static pthread_barrier_t barrier;
16 static unsigned long extent_size;
17 static unsigned long num_extents;
19 struct dio_thread_data {
24 static void *dio_thread(void *arg)
26 struct dio_thread_data *data = arg;
31 if ((errno = posix_memalign(&buf, extent_size / 2, extent_size / 2))) {
35 memset(buf, 0, extent_size / 2);
37 off = (num_extents - 1) * extent_size;
39 off += extent_size / 2;
41 pthread_barrier_wait(&barrier);
43 ret = pread(data->fd, buf, extent_size / 2, off);
54 int main(int argc, char **argv)
56 struct dio_thread_data data[2];
61 fprintf(stderr, "usage: %s EXTENT_SIZE NUM_EXTENTS PATH\n",
66 extent_size = strtoul(argv[1], NULL, 0);
67 num_extents = strtoul(argv[2], NULL, 0);
69 errno = pthread_barrier_init(&barrier, NULL, 2);
71 perror("pthread_barrier_init");
75 fd = open(argv[3], O_RDONLY | O_DIRECT);
82 data[0].thread_id = 0;
83 errno = pthread_create(&thread, NULL, dio_thread, &data[0]);
85 perror("pthread_create");
91 data[1].thread_id = 1;
94 pthread_join(thread, NULL);