| 206 | } |
| 207 | |
| 208 | TEST(DispatcherTest, dispatch_tasks) { |
| 209 | client_stop = false; |
| 210 | server_stop = false; |
| 211 | |
| 212 | const size_t NEPOLL = 1; |
| 213 | const size_t NCLIENT = 16; |
| 214 | |
| 215 | int epfd[NEPOLL]; |
| 216 | bthread_t eth[NEPOLL]; |
| 217 | EpollMeta* em[NEPOLL]; |
| 218 | int fds[2 * NCLIENT]; |
| 219 | pthread_t cth[NCLIENT]; |
| 220 | ClientMeta* cm[NCLIENT]; |
| 221 | SocketMeta* sm[NCLIENT]; |
| 222 | |
| 223 | for (size_t i = 0; i < NEPOLL; ++i) { |
| 224 | #if defined(OS_LINUX) |
| 225 | epfd[i] = epoll_create(1024); |
| 226 | #elif defined(OS_MACOSX) |
| 227 | epfd[i] = kqueue(); |
| 228 | #endif |
| 229 | ASSERT_GT(epfd[i], 0); |
| 230 | } |
| 231 | |
| 232 | for (size_t i = 0; i < NCLIENT; ++i) { |
| 233 | ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, fds + 2 * i)); |
| 234 | SocketMeta* m = new SocketMeta; |
| 235 | m->fd = fds[i * 2]; |
| 236 | m->epfd = epfd[fmix32(i) % NEPOLL]; |
| 237 | m->req = 0; |
| 238 | m->buf_cap = 32768; |
| 239 | m->buf = (char*)malloc(m->buf_cap); |
| 240 | m->bytes = 0; |
| 241 | m->times = 0; |
| 242 | ASSERT_EQ(0, butil::make_non_blocking(m->fd)); |
| 243 | sm[i] = m; |
| 244 | |
| 245 | #if defined(OS_LINUX) |
| 246 | epoll_event evt = { (uint32_t)(EPOLLIN | EPOLLET), { m } }; |
| 247 | ASSERT_EQ(0, epoll_ctl(m->epfd, EPOLL_CTL_ADD, m->fd, &evt)); |
| 248 | #elif defined(OS_MACOSX) |
| 249 | struct kevent kqueue_event; |
| 250 | EV_SET(&kqueue_event, m->fd, EVFILT_READ, EV_ADD | EV_ENABLE | EV_CLEAR, 0, 0, m); |
| 251 | ASSERT_EQ(0, kevent(m->epfd, &kqueue_event, 1, NULL, 0, NULL)); |
| 252 | #endif |
| 253 | |
| 254 | cm[i] = new ClientMeta; |
| 255 | cm[i]->fd = fds[i * 2 + 1]; |
| 256 | cm[i]->times = 0; |
| 257 | cm[i]->bytes = 0; |
| 258 | ASSERT_EQ(0, pthread_create(&cth[i], NULL, client_thread, cm[i])); |
| 259 | } |
| 260 | |
| 261 | ProfilerStart("dispatcher.prof"); |
| 262 | butil::Timer tm; |
| 263 | tm.start(); |
| 264 | |
| 265 | for (size_t i = 0; i < NEPOLL; ++i) { |
nothing calls this directly
no test coverage detected