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

View File

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

View File

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

View File

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