| 2421 | } |
| 2422 | |
| 2423 | int |
| 2424 | kevent(int kq, const struct kevent *changelist, int nchanges, |
| 2425 | struct kevent *eventlist, int nevents, |
| 2426 | const struct timespec *timeout) |
| 2427 | { |
| 2428 | int i; |
| 2429 | int maxevents = nevents; |
| 2430 | struct kevent *kev; |
| 2431 | |
| 2432 | DEBUG_LOG("kq:%d, nchanges:%d, nevents:%d\n", kq, nchanges, nevents); |
| 2433 | |
| 2434 | if (unlikely(inited == 0 && ff_adapter_init() < 0)) { |
| 2435 | errno = ENOSYS; |
| 2436 | return -1; |
| 2437 | } |
| 2438 | |
| 2439 | kq = restore_fstack_fd(kq); |
| 2440 | |
| 2441 | DEFINE_REQ_ARGS_STATIC(kevent); |
| 2442 | static __thread struct kevent *sh_changelist = NULL; |
| 2443 | static __thread int sh_changelist_len = 0; |
| 2444 | static __thread struct kevent *sh_eventlist = NULL; |
| 2445 | static __thread int sh_eventlist_len = 0; |
| 2446 | |
| 2447 | if (changelist != NULL && nchanges > 0) { |
| 2448 | if (sh_changelist == NULL || sh_changelist_len < nchanges) { |
| 2449 | if (sh_changelist) { |
| 2450 | share_mem_free(sh_changelist); |
| 2451 | } |
| 2452 | |
| 2453 | sh_changelist_len = nchanges; |
| 2454 | sh_changelist = share_mem_alloc(sizeof(struct kevent) * sh_changelist_len); |
| 2455 | if (sh_changelist == NULL) { |
| 2456 | RETURN_ERROR_NOFREE(ENOMEM); |
| 2457 | } |
| 2458 | } |
| 2459 | rte_memcpy(sh_changelist, changelist, sizeof(struct kevent) * nchanges); |
| 2460 | |
| 2461 | for(i = 0; i < nchanges; i++) { |
| 2462 | kev = (struct kevent *)&sh_changelist[i]; |
| 2463 | switch (kev->filter) { |
| 2464 | case EVFILT_READ: |
| 2465 | case EVFILT_WRITE: |
| 2466 | case EVFILT_VNODE: |
| 2467 | kev->ident = restore_fstack_fd(kev->ident); |
| 2468 | break; |
| 2469 | default: |
| 2470 | break; |
| 2471 | } |
| 2472 | } |
| 2473 | args->changelist = sh_changelist; |
| 2474 | args->nchanges = nchanges; |
| 2475 | } else { |
| 2476 | args->changelist = NULL; |
| 2477 | args->nchanges = 0; |
| 2478 | } |
| 2479 | |
| 2480 | if (eventlist != NULL && nevents > 0) { |
nothing calls this directly
no test coverage detected