1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00

bug fixing

This commit is contained in:
stefanocasazza 2015-07-30 14:39:53 +02:00
parent b2c141588b
commit 60d9f37186
4 changed files with 69 additions and 62 deletions

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -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