7
7
8
8
#define QD 64
9
9
#define BS (4 *1024 )
10
- #define NR_THREAD 2
10
+ #define NR_THREAD 10
11
11
12
12
struct TestEnv {
13
13
int index;
@@ -20,6 +20,7 @@ int queueIo(TestEnv *env, off_t offset, off_t len, bool isRead, void *buf, IocbF
20
20
if (!task)
21
21
return -1 ;
22
22
23
+ task->index = env->index ;
23
24
task->fd = env->fd ;
24
25
25
26
task->isRead = isRead;
@@ -30,7 +31,7 @@ int queueIo(TestEnv *env, off_t offset, off_t len, bool isRead, void *buf, IocbF
30
31
task->iov .iov_len = len;
31
32
32
33
task->cb = cb;
33
- task->arg = arg ;
34
+ task->arg = env-> submitter ;
34
35
task->res = -1 ;
35
36
36
37
env->submitter ->Push (task);
@@ -39,36 +40,66 @@ int queueIo(TestEnv *env, off_t offset, off_t len, bool isRead, void *buf, IocbF
39
40
}
40
41
41
42
void cb1 (IoTask *task) {
42
- assert (task->isRead );
43
- std::cout << " read data: " << (static_cast <char *>(task->iov .iov_base ))[0 ]
44
- << std::endl;
43
+ assert (!task->isRead );
44
+ unsigned num = ((char *)(task->iov .iov_base ))[0 ];
45
+ std::cout << " reaper: write for thread " << task->index <<" done, data="
46
+ << std::hex << num << " , res=" << task->res << std::endl;
45
47
46
48
delete task;
47
49
}
48
50
51
+
52
+ void cb0 (IoTask *task) {
53
+ assert (task->isRead );
54
+ unsigned num = ((char *)(task->iov .iov_base ))[0 ];
55
+ std::cout << " reaper: read from thread " << task->index << " done, data="
56
+ << std::hex << num << " , res=" << task->res << std::endl;
57
+ num++;
58
+ std::cout << " reaper: send write I/O for thread " << task->index << " , data="
59
+ << std::hex << num << std::endl;
60
+ // send write I/O
61
+ task->isRead = false ;
62
+ memset (task->iov .iov_base , num, BS);
63
+ task->cb = cb1;
64
+ task->res = -1 ;
65
+ Submitter *submitter = (Submitter *)task->arg ;
66
+ submitter->Push (task);
67
+ }
68
+
49
69
void *SendIo (void *arg) {
50
70
TestEnv *env = (TestEnv *)arg;
51
71
int idx = env->index ;
52
- int fd = env->fd ;
53
-
54
- std::string data (BS, 0 );
55
- switch (idx) {
56
- case 0 :
57
- data.assign (BS, ' 1' );
58
- queueIo (env, 0 , BS, false , (void *)(data.c_str ()), nullptr , nullptr );
59
- case 1 :
60
- sleep (10 );
61
- queueIo (env, 0 , BS, true , (void *)data.c_str (), cb1, nullptr );
62
- }
63
- sleep (20 );
72
+ char *data = nullptr ;
73
+ posix_memalign ((void **)&data, getpagesize (), BS);
74
+ memset (data, 0 , BS);
75
+ std::cout << " thread " << env->index << " : read testfile" << std::endl;
76
+ queueIo (env, 0 , BS, true , data, cb0, nullptr );
64
77
78
+ sleep (3 );
65
79
return nullptr ;
66
80
}
67
81
68
-
69
82
int main (int argc, const char * argv[]) {
70
83
int ret = 0 ;
71
- Submitter submitter (IoEngine::IO_ENGINE_URING, QD);
84
+
85
+ if (argc != 2 ) {
86
+ std::cout << " usage: " << argv[0 ] << " [option]" << std::endl;
87
+ std::cout << " option: libaio or uring" << std::endl;
88
+ return -1 ;
89
+ }
90
+
91
+ IoEngine engine = IoEngine::IO_ENGINE_NONE;
92
+ if (!strncmp (argv[1 ], " libaio" , 7 ))
93
+ engine = IoEngine::IO_ENGINE_LIBAIO;
94
+ else if (!strncmp (argv[1 ], " uring" , 6 ))
95
+ engine = IoEngine::IO_ENGINE_URING;
96
+ else {
97
+ std::cout << " usage: " << argv[0 ] << " [option]" << std::endl;
98
+ std::cout << " option: libaio or uring" << std::endl;
99
+ return -1 ;
100
+ }
101
+
102
+ Submitter submitter (engine, QD);
72
103
if (submitter.Run ())
73
104
return -1 ;
74
105
@@ -103,6 +134,8 @@ int main(int argc, const char* argv[]) {
103
134
pthread_join (tidp[i], nullptr );
104
135
reaper.Finish ();
105
136
submitter.Finish ();
137
+ fsync (fd);
138
+ close (fd);
106
139
107
140
return ret;
108
141
}
0 commit comments