mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-09-28 19:05:55 +08:00
bug fixing
This commit is contained in:
parent
b2c141588b
commit
60d9f37186
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user