Hook the system API to create one kqueue fd.
| 367 | |
| 368 | // Hook the system API to create one kqueue fd. |
| 369 | int kqueue(void) |
| 370 | { |
| 371 | EVENT *ev; |
| 372 | KQUEUE *kq; |
| 373 | int sys_kqfd, kqfd; |
| 374 | |
| 375 | if (sys_kqueue == NULL) { |
| 376 | hook_once(); |
| 377 | } |
| 378 | |
| 379 | if (!var_hook_sys_api) { |
| 380 | return sys_kqueue ? (*sys_kqueue)() : -1; |
| 381 | } |
| 382 | |
| 383 | ev = fiber_io_event(); |
| 384 | assert(ev); |
| 385 | |
| 386 | // Get the current thread's kqueue fd. |
| 387 | sys_kqfd = (int) event_handle(ev); |
| 388 | if (sys_kqfd < 0) { |
| 389 | msg_info("%s(%d), %s: no event_handle %d", |
| 390 | __FILE__, __LINE__, __FUNCTION__, sys_kqfd); |
| 391 | } |
| 392 | |
| 393 | // Duplicate sys_kqfd and return a new fd to the caller. |
| 394 | kqfd = sys_kqfd >= 0 ? dup(sys_kqfd) : socket(AF_INET, SOCK_STREAM, 0); |
| 395 | if (kqfd < 0) { |
| 396 | msg_error("%s(%d): create fd error: %s", |
| 397 | __FILE__, __LINE__, last_serror()); |
| 398 | return -1; |
| 399 | } |
| 400 | |
| 401 | kq = kqueue_alloc(kqfd); |
| 402 | if (kq == NULL) { |
| 403 | msg_error("%s(%d): can't alloc KQUEUE for kqfd=%d", |
| 404 | __FUNCTION__, __LINE__, kqfd); |
| 405 | return -1; |
| 406 | } |
| 407 | |
| 408 | return kq->kqfd; |
| 409 | } |
| 410 | |
| 411 | // Event callback for readable fd in kqueue hook mode. |
| 412 | static void read_callback(EVENT *ev, FILE_EVENT *fe) |
searching dependent graphs…