/* Wait for I/O on all registered file descriptors. Timeout is in milliseconds. Return the number of events detected. */ PUBLIC void mprWaitForIO(MprWaitService *ws, MprTicks timeout) { struct epoll_event events[ME_MAX_EVENTS]; int nevents; if (timeout < 0 || timeout > MAXINT) { timeout = MAXINT; } #if ME_DEBUG if (mprGetDebugMode() && timeout > 30000) { timeout = 30000; } #endif if (ws->needRecall) { mprDoWaitRecall(ws); return; } mprYield(MPR_YIELD_STICKY); if ((nevents = epoll_wait(ws->epoll, events, sizeof(events) / sizeof(struct epoll_event), timeout)) < 0) { if (errno != EINTR) { mprLog("error mpr event", 0, "epoll returned %d, errno %d", nevents, mprGetOsError()); } } mprClearWaiting(); mprResetYield(); if (nevents > 0) { serviceIO(ws, events, nevents); } ws->wakeRequested = 0; }
/* Wait for I/O on all registered descriptors. Timeout is in milliseconds. Return the number of events serviced. Should only be called by the thread that calls mprServiceEvents */ PUBLIC void mprWaitForIO(MprWaitService *ws, MprTicks timeout) { MSG msg; assert(ws->hwnd); if (timeout < 0 || timeout > MAXINT) { timeout = MAXINT; } #if BIT_DEBUG if (mprGetDebugMode() && timeout > 30000) { timeout = 30000; } #endif if (ws->needRecall) { mprDoWaitRecall(ws); return; } SetTimer(ws->hwnd, 0, (UINT) timeout, NULL); mprYield(MPR_YIELD_STICKY); if (GetMessage(&msg, NULL, 0, 0) == 0) { mprResetYield(); mprTerminate(MPR_EXIT_DEFAULT, -1); } else { mprClearWaiting(); mprResetYield(); TranslateMessage(&msg); DispatchMessage(&msg); } ws->wakeRequested = 0; }