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 long time_between_request, time_run;
|
||||||
static uint32_t ncount, nrequest, resto, uri_offset;
|
static uint32_t ncount, nrequest, resto, uri_offset;
|
||||||
|
|
||||||
static void endRequest();
|
|
||||||
static bool startRequest();
|
|
||||||
|
|
||||||
static void resetReadBuffer();
|
static void resetReadBuffer();
|
||||||
static void resetWriteBuffer();
|
static void resetWriteBuffer();
|
||||||
static void saveRequestResponse();
|
static void saveRequestResponse();
|
||||||
static void manageReadBufferResize(uint32_t n);
|
static void manageReadBufferResize(uint32_t n);
|
||||||
|
|
||||||
|
static void endRequest();
|
||||||
|
static bool startRequest();
|
||||||
|
|
||||||
#ifndef U_CACHE_REQUEST_DISABLE
|
#ifndef U_CACHE_REQUEST_DISABLE
|
||||||
static bool isRequestCacheable() __pure;
|
static bool isRequestCacheable() __pure;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
# endif
|
# endif
|
||||||
#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
|
# define U_EPOLLET_POSTPONE_STRATEGY
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -578,37 +578,6 @@ int UClientImage_Base::handlerTimeout()
|
||||||
U_RETURN(U_NOTIFIER_DELETE);
|
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)
|
const char* UClientImage_Base::getRequestUri(uint32_t& sz)
|
||||||
{
|
{
|
||||||
U_TRACE(0, "UClientImage_Base::getRequestUri(%p)", &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)
|
# define U_IOV_TO_SAVE (sizeof(struct iovec) * 4)
|
||||||
#endif
|
#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()
|
void UClientImage_Base::endRequest()
|
||||||
{
|
{
|
||||||
U_TRACE(0, "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)
|
U_INTERNAL_ASSERT_EQUALS(socket->iSockDesc, UEventFd::fd)
|
||||||
|
|
||||||
#if defined(DEBUG) || defined(U_SERVER_CHECK_TIME_BETWEEN_REQUEST)
|
#if !defined(DEBUG) && !defined(U_SERVER_CHECK_TIME_BETWEEN_REQUEST)
|
||||||
bool advise_for_parallelization =
|
U_gettimeofday; // NB: optimization if it is enough a time resolution of one second...
|
||||||
#else
|
#else
|
||||||
(void)
|
bool advise_for_parallelization = startRequest();
|
||||||
#endif
|
#endif
|
||||||
startRequest();
|
|
||||||
|
|
||||||
request->clear(); // reset buffer before read
|
request->clear(); // reset buffer before read
|
||||||
|
|
||||||
U_INTERNAL_DUMP("rbuffer(%u) = %V", rbuffer->size(), rbuffer->rep)
|
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)
|
if (data_pending)
|
||||||
{
|
{
|
||||||
|
|
|
@ -663,10 +663,11 @@ void UNotifier::waitForEvent(UEventTime* timeout)
|
||||||
if (LIKELY(nfd_ready > 0))
|
if (LIKELY(nfd_ready > 0))
|
||||||
{
|
{
|
||||||
# ifdef HAVE_EPOLL_WAIT
|
# ifdef HAVE_EPOLL_WAIT
|
||||||
|
int i = 0;
|
||||||
pevents = events;
|
pevents = events;
|
||||||
int i = 0, ret = 0x00ff;
|
|
||||||
|
|
||||||
# ifdef U_EPOLLET_POSTPONE_STRATEGY
|
# ifdef U_EPOLLET_POSTPONE_STRATEGY
|
||||||
|
bool bloop1 = false;
|
||||||
bepollet = (nfd_ready >= 10);
|
bepollet = (nfd_ready >= 10);
|
||||||
|
|
||||||
U_INTERNAL_DUMP("bepollet = %b nfd_ready = %d", bepollet, nfd_ready)
|
U_INTERNAL_DUMP("bepollet = %b nfd_ready = %d", bepollet, nfd_ready)
|
||||||
|
@ -701,7 +702,7 @@ loop: U_INTERNAL_ASSERT_POINTER(pevents->data.ptr)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (UNLIKELY((pevents->events & (EPOLLERR | EPOLLHUP)) != 0) ||
|
if (UNLIKELY((pevents->events & (EPOLLERR | EPOLLHUP)) != 0) ||
|
||||||
(LIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) != 0) ? (ret = handler_event->handlerRead())
|
(LIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) != 0) ? handler_event->handlerRead()
|
||||||
: handler_event->handlerWrite()) == U_NOTIFIER_DELETE)
|
: handler_event->handlerWrite()) == U_NOTIFIER_DELETE)
|
||||||
{
|
{
|
||||||
handlerDelete(handler_event);
|
handlerDelete(handler_event);
|
||||||
|
@ -712,12 +713,18 @@ loop: U_INTERNAL_ASSERT_POINTER(pevents->data.ptr)
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
# ifdef U_EPOLLET_POSTPONE_STRATEGY
|
# ifdef U_EPOLLET_POSTPONE_STRATEGY
|
||||||
else if (bepollet &&
|
else if (bepollet)
|
||||||
(U_ClientImage_state == U_PLUGIN_HANDLER_AGAIN ||
|
{
|
||||||
UNLIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) == 0)))
|
if (U_ClientImage_state != U_PLUGIN_HANDLER_AGAIN &&
|
||||||
|
LIKELY((pevents->events & (EPOLLIN | EPOLLRDHUP)) != 0))
|
||||||
|
{
|
||||||
|
bloop1 = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
pevents->events = 0;
|
pevents->events = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -729,11 +736,12 @@ loop: U_INTERNAL_ASSERT_POINTER(pevents->data.ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef U_EPOLLET_POSTPONE_STRATEGY
|
# ifdef U_EPOLLET_POSTPONE_STRATEGY
|
||||||
if (bepollet &&
|
while (bloop1)
|
||||||
ret != 0x00ff)
|
|
||||||
{
|
{
|
||||||
loop1: ret = 0x00ff;
|
U_INTERNAL_ASSERT(bepollet)
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
bloop1 = false;
|
||||||
pevents = events;
|
pevents = events;
|
||||||
|
|
||||||
loop2: if (pevents->events)
|
loop2: if (pevents->events)
|
||||||
|
@ -744,17 +752,19 @@ loop2: if (pevents->events)
|
||||||
|
|
||||||
U_INTERNAL_ASSERT_DIFFERS(handler_event->fd, -1)
|
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);
|
handlerDelete(handler_event);
|
||||||
handler_event->fd = -1;
|
handler_event->fd = -1;
|
||||||
}
|
|
||||||
else if (U_ClientImage_state == U_PLUGIN_HANDLER_AGAIN)
|
|
||||||
{
|
|
||||||
pevents->events = 0;
|
pevents->events = 0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (U_ClientImage_state != U_PLUGIN_HANDLER_AGAIN) bloop1 = true;
|
||||||
|
else pevents->events = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (++i < nfd_ready)
|
if (++i < nfd_ready)
|
||||||
{
|
{
|
||||||
|
@ -762,9 +772,6 @@ loop2: if (pevents->events)
|
||||||
|
|
||||||
goto loop2;
|
goto loop2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != 0x00ff) goto loop1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
|
|
Loading…
Reference in New Issue
Block a user