diff --git a/include/ulib/net/server/client_image.h b/include/ulib/net/server/client_image.h index 41a95723..80d9a5ea 100644 --- a/include/ulib/net/server/client_image.h +++ b/include/ulib/net/server/client_image.h @@ -368,14 +368,14 @@ protected: static long time_between_request, time_run; static uint32_t ncount, nrequest, resto, uri_offset; - static void endRequest(); - static bool startRequest(); - static void resetReadBuffer(); static void resetWriteBuffer(); static void saveRequestResponse(); static void manageReadBufferResize(uint32_t n); + static void endRequest(); + static bool startRequest(); + #ifndef U_CACHE_REQUEST_DISABLE static bool isRequestCacheable() __pure; #endif diff --git a/include/ulib/notifier.h b/include/ulib/notifier.h index 8625f39b..a0255e10 100644 --- a/include/ulib/notifier.h +++ b/include/ulib/notifier.h @@ -33,7 +33,7 @@ # endif #endif -#if defined(HAVE_EPOLL_WAIT) && !defined(USE_LIBEVENT) +#if defined(HAVE_EPOLL_WAIT) && !defined(USE_LIBEVENT) && !defined(U_SERVER_CAPTIVE_PORTAL) # define U_EPOLLET_POSTPONE_STRATEGY #endif diff --git a/src/ulib/net/server/client_image.cpp b/src/ulib/net/server/client_image.cpp index 291ea52f..2c48cbde 100644 --- a/src/ulib/net/server/client_image.cpp +++ b/src/ulib/net/server/client_image.cpp @@ -578,37 +578,6 @@ int UClientImage_Base::handlerTimeout() U_RETURN(U_NOTIFIER_DELETE); } -bool UClientImage_Base::startRequest() -{ - U_TRACE(0, "UClientImage_Base::startRequest()") - -#if !defined(DEBUG) && !defined(U_SERVER_CHECK_TIME_BETWEEN_REQUEST) - U_gettimeofday; // NB: optimization if it is enough a time resolution of one second... -#else - long tmp = chronometer->restart(); - - U_INTERNAL_DUMP("U_ClientImage_pipeline = %b time_between_request = %ld time_run = %ld U_ClientImage_request_is_cached = %b csfd = %d", - U_ClientImage_pipeline, time_between_request, time_run, U_ClientImage_request_is_cached, csfd) - - if (U_ClientImage_pipeline == false && - U_ClientImage_parallelization == 0) - { - time_between_request = tmp; - -# ifndef U_CACHE_REQUEST_DISABLE - if (U_ClientImage_request_is_cached) U_RETURN(false); -# endif -# ifdef USE_LIBSSL - if (UServer_Base::bssl) U_RETURN(false); -# endif - - if ((time_run - time_between_request) > 10) U_RETURN(true); - } -#endif - - U_RETURN(false); -} - const char* UClientImage_Base::getRequestUri(uint32_t& sz) { U_TRACE(0, "UClientImage_Base::getRequestUri(%p)", &sz) @@ -647,6 +616,35 @@ const char* UClientImage_Base::getRequestUri(uint32_t& sz) # define U_IOV_TO_SAVE (sizeof(struct iovec) * 4) #endif +bool UClientImage_Base::startRequest() +{ + U_TRACE(0, "UClientImage_Base::startRequest()") + +#if defined(DEBUG) || defined(U_SERVER_CHECK_TIME_BETWEEN_REQUEST) + long tmp = chronometer->restart(); + + U_INTERNAL_DUMP("U_ClientImage_pipeline = %b time_between_request = %ld time_run = %ld U_ClientImage_request_is_cached = %b csfd = %d", + U_ClientImage_pipeline, time_between_request, time_run, U_ClientImage_request_is_cached, csfd) + + if (U_ClientImage_pipeline == false && + U_ClientImage_parallelization == 0) + { + time_between_request = tmp; + +# ifndef U_CACHE_REQUEST_DISABLE + if (U_ClientImage_request_is_cached) U_RETURN(false); +# endif +# ifdef USE_LIBSSL + if (UServer_Base::bssl) U_RETURN(false); +# endif + + if ((time_run-time_between_request) > 10) U_RETURN(true); + } +#endif + + U_RETURN(false); +} + void UClientImage_Base::endRequest() { U_TRACE(0, "UClientImage_Base::endRequest()") @@ -919,18 +917,20 @@ bool UClientImage_Base::genericRead() U_INTERNAL_ASSERT_EQUALS(socket->iSockDesc, UEventFd::fd) -#if defined(DEBUG) || defined(U_SERVER_CHECK_TIME_BETWEEN_REQUEST) - bool advise_for_parallelization = +#if !defined(DEBUG) && !defined(U_SERVER_CHECK_TIME_BETWEEN_REQUEST) + U_gettimeofday; // NB: optimization if it is enough a time resolution of one second... #else - (void) + bool advise_for_parallelization = startRequest(); #endif - startRequest(); request->clear(); // reset buffer before read U_INTERNAL_DUMP("rbuffer(%u) = %V", rbuffer->size(), rbuffer->rep) - rbuffer->setBuffer(U_CAPACITY); // NB: this string can be referenced more than one (often if U_SUBSTR_INC_REF is defined)... + // NB: rbuffer string can be referenced more than one (often if U_SUBSTR_INC_REF is defined)... + + if (rbuffer->uniq()) rbuffer->rep->_length = 0; + else rbuffer->_set(UStringRep::create(0U, U_CAPACITY, 0)); if (data_pending) { diff --git a/src/ulib/notifier.cpp b/src/ulib/notifier.cpp index d120539a..8e88fdd9 100644 --- a/src/ulib/notifier.cpp +++ b/src/ulib/notifier.cpp @@ -663,10 +663,11 @@ void UNotifier::waitForEvent(UEventTime* timeout) if (LIKELY(nfd_ready > 0)) { # ifdef HAVE_EPOLL_WAIT + int i = 0; pevents = events; - int i = 0, ret = 0x00ff; # ifdef U_EPOLLET_POSTPONE_STRATEGY + bool bloop1 = false; bepollet = (nfd_ready >= 10); U_INTERNAL_DUMP("bepollet = %b nfd_ready = %d", bepollet, nfd_ready) @@ -701,8 +702,8 @@ loop: U_INTERNAL_ASSERT_POINTER(pevents->data.ptr) */ if (UNLIKELY((pevents->events & (EPOLLERR | EPOLLHUP)) != 0) || - (LIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) != 0) ? (ret = handler_event->handlerRead()) - : handler_event->handlerWrite()) == U_NOTIFIER_DELETE) + (LIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) != 0) ? handler_event->handlerRead() + : handler_event->handlerWrite()) == U_NOTIFIER_DELETE) { handlerDelete(handler_event); handler_event->fd = -1; @@ -712,11 +713,17 @@ loop: U_INTERNAL_ASSERT_POINTER(pevents->data.ptr) # endif } # ifdef U_EPOLLET_POSTPONE_STRATEGY - else if (bepollet && - (U_ClientImage_state == U_PLUGIN_HANDLER_AGAIN || - UNLIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) == 0))) + else if (bepollet) { - pevents->events = 0; + if (U_ClientImage_state != U_PLUGIN_HANDLER_AGAIN && + LIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) != 0)) + { + bloop1 = true; + } + else + { + pevents->events = 0; + } } # endif } @@ -729,11 +736,12 @@ loop: U_INTERNAL_ASSERT_POINTER(pevents->data.ptr) } # ifdef U_EPOLLET_POSTPONE_STRATEGY - if (bepollet && - ret != 0x00ff) + while (bloop1) { -loop1: ret = 0x00ff; + U_INTERNAL_ASSERT(bepollet) + i = 0; + bloop1 = false; pevents = events; loop2: if (pevents->events) @@ -744,26 +752,25 @@ loop2: if (pevents->events) U_INTERNAL_ASSERT_DIFFERS(handler_event->fd, -1) - if ((ret = handler_event->handlerRead()) == U_NOTIFIER_DELETE) + if (handler_event->handlerRead() == U_NOTIFIER_DELETE) { - pevents->events = 0; - handlerDelete(handler_event); handler_event->fd = -1; - } - else if (U_ClientImage_state == U_PLUGIN_HANDLER_AGAIN) - { + pevents->events = 0; } - - if (++i < nfd_ready) + else { - ++pevents; - - goto loop2; + if (U_ClientImage_state != U_PLUGIN_HANDLER_AGAIN) bloop1 = true; + else pevents->events = 0; } + } - if (ret != 0x00ff) goto loop1; + if (++i < nfd_ready) + { + ++pevents; + + goto loop2; } } # endif