You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/02/22 18:52:04 UTC
svn commit: r914987 - in /incubator/trafficserver/traffic/trunk:
iocore/eventsystem/ iocore/net/ libinktomi++/
Author: zwoop
Date: Mon Feb 22 17:52:04 2010
New Revision: 914987
URL: http://svn.apache.org/viewvc?rev=914987&view=rev
Log:
TS-164: using pipe fd as signal between netthreads (and less timeout)
Author: Vijaya Bhaskar Mamidi
Bug fix on patch submission: George P.
Review: Leif
Modified:
incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h
incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h
incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h
incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h
incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h
incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc
incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h
Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h Mon Feb 22 17:52:04 2010
@@ -325,7 +325,7 @@
unsigned int event_types;
bool is_event_type(EventType et);
void set_event_type(EventType et);
-
+ int getEventFd();
// Private Interface
void execute();
Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h Mon Feb 22 17:52:04 2010
@@ -48,11 +48,18 @@
Event *dequeue_local();
void dequeue_timed(ink_hrtime cur_time, ink_hrtime timeout, bool sleep);
+ void setWriteFd(int );
+ void setReadFd(int );
+ int getReadFd();
+
InkAtomicList al;
ink_mutex lock;
ink_cond might_have_data;
Que(Event, link) localQueue;
+ int write_pipe_fd;
+ int read_pipe_fd;
+
ProtectedQueue();
};
Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h Mon Feb 22 17:52:04 2010
@@ -34,7 +34,7 @@
INK_INLINE
-ProtectedQueue::ProtectedQueue()
+ProtectedQueue::ProtectedQueue():write_pipe_fd(-1),read_pipe_fd(-1)
{
Event e;
ink_mutex_init(&lock, "ProtectedQueue");
@@ -46,21 +46,39 @@
ProtectedQueue::signal()
{
// Need to get the lock before you can signal the thread
- ink_mutex_acquire(&lock);
- ink_cond_signal(&might_have_data);
- ink_mutex_release(&lock);
+ if(write_pipe_fd!=-1) {
+ int retVal = socketManager.write(write_pipe_fd,(void*)"W",1);
+ if(retVal <= 0) {
+ int fd = write_pipe_fd;
+ socketManager.close(fd);
+ }
+ } else {
+ ink_mutex_acquire(&lock);
+ ink_cond_signal(&might_have_data);
+ ink_mutex_release(&lock);
+ }
}
INK_INLINE int
ProtectedQueue::try_signal()
{
// Need to get the lock before you can signal the thread
- if (ink_mutex_try_acquire(&lock)) {
- ink_cond_signal(&might_have_data);
- ink_mutex_release(&lock);
+ if(write_pipe_fd!=-1) {
+ int retVal = socketManager.write(write_pipe_fd,(void*)"W",1);
+ if(retVal <= 0) {
+ int fd = write_pipe_fd;
+ write_pipe_fd = read_pipe_fd = -1;
+ socketManager.close(fd);
+ }
return 1;
} else {
- return 0;
+ if (ink_mutex_try_acquire(&lock)) {
+ ink_cond_signal(&might_have_data);
+ ink_mutex_release(&lock);
+ return 1;
+ } else {
+ return 0;
+ }
}
}
@@ -93,4 +111,26 @@
return e;
}
+INK_INLINE void
+ProtectedQueue::setReadFd(int fd)
+{
+ read_pipe_fd = fd;
+}
+
+INK_INLINE void
+ProtectedQueue::setWriteFd(int fd)
+{
+ write_pipe_fd = fd;
+}
+
+INK_INLINE int
+ProtectedQueue::getReadFd()
+{
+ int pfd[2] = {-1,-1};
+ ink_create_pipe(pfd);
+ setReadFd(pfd[0]);
+ setWriteFd(pfd[1]);
+ return pfd[0];
+}
+
#endif
Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h Mon Feb 22 17:52:04 2010
@@ -168,5 +168,10 @@
EVENT_FREE(e, eventAllocator, this);
}
+INK_INLINE int
+EThread::getEventFd()
+{
+ return EventQueueExternal.getReadFd();
+}
#endif /*_EThread_h_*/
Modified: incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h Mon Feb 22 17:52:04 2010
@@ -40,6 +40,7 @@
DNSConnection *dnscon;
NetAccept *na;
UnixUDPConnection *uc;
+ int fd;
} data;
};
@@ -52,6 +53,7 @@
#define EPOLL_READWRITE_VC 2
#define EPOLL_DNS_CONNECTION 3
#define EPOLL_UDP_CONNECTION 4
+#define EVENTFD 5
struct UnixNetVConnection;
struct NetHandler;
@@ -104,7 +106,7 @@
#define MAX_EPOLL_ARRAY_SIZE (1024*16)
#define MAX_EPOLL_TIMEOUT 50 /* mseconds */
#define DEFAULT_EPOLL_TIMEOUT 10 /* mseconds */
-#define REAL_DEFAULT_EPOLL_TIMEOUT 3 /* the define above is old code [ebalsa] -- this directly effects latency of the connections. */
+#define REAL_DEFAULT_EPOLL_TIMEOUT 1 /* the define above is old code [ebalsa] -- this directly effects latency of the connections. */
#define NET_THROTTLE_DELAY 50 /* mseconds */
#define INK_MIN_PRIORITY 0
Modified: incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h Mon Feb 22 17:52:04 2010
@@ -110,6 +110,7 @@
// accept such events by the EventProcesor.
//
extern void initialize_thread_for_net(EThread * thread, int thread_index);
+extern void initialize_eventfd(EThread * thread);
//#include "UnixNet.h"
#endif
Modified: incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc (original)
+++ incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc Mon Feb 22 17:52:04 2010
@@ -119,6 +119,7 @@
new((ink_dummy_for_new *) get_NetHandler(thread)) NetHandler();
new((ink_dummy_for_new *) get_PollCont(thread)) PollCont(thread->mutex, get_NetHandler(thread));
get_NetHandler(thread)->mutex = new_ProxyMutex();
+ initialize_eventfd(thread);
thread->schedule_imm(get_NetHandler(thread));
#ifndef INACTIVITY_TIMEOUT
@@ -127,6 +128,26 @@
#endif
}
+void initialize_eventfd(EThread *thread) {
+
+ int fd = thread->getEventFd();
+ PollDescriptor *pd = get_PollDescriptor(thread);
+ struct epoll_data_ptr *eptr;
+ eptr = (struct epoll_data_ptr *) xmalloc(sizeof(struct epoll_data_ptr));
+ eptr->type = EVENTFD;
+ eptr->data.fd = fd;
+
+
+ struct epoll_event ev;
+ memset(&ev, 0, sizeof(struct epoll_event));
+
+ ev.events = EPOLLIN | EPOLLET;
+ ev.data.ptr = eptr;
+ if (epoll_ctl(pd->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
+ Debug("iocore_net", "acceptEvent : Failed to add event add to list epoll list\n");
+ }
+}
+
// NetHandler method definitions
NetHandler::NetHandler():Continuation(NULL), trigger_event(0)
@@ -246,6 +267,16 @@
} else if (epd->type == EPOLL_DNS_CONNECTION) {
if (epd->data.dnscon != NULL)
dnsqueue.enqueue(epd->data.dnscon);
+ } else if (epd->type == EVENTFD) {
+ char buf[1024];
+ int retVal=-1;
+ do {
+ retVal = socketManager.read(epd->data.fd,&buf,1024);
+ } while(retVal == 1024);
+ if (retVal <=0) {
+ socketManager.close(epd->data.fd);
+ initialize_eventfd(e->ethread);
+ }
}
}
Modified: incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/libinktomi%2B%2B/ink_thread.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h (original)
+++ incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h Mon Feb 22 17:52:04 2010
@@ -279,6 +279,12 @@
pthread_exit(status);
}
+static inline void
+ink_create_pipe( int pfd[2])
+{
+ ink_assert(pipe(pfd)==0);
+}
+
#endif /* #if defined(POSIX_THREAD) */
#endif /*_INK_THREAD_H*/