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 2013/04/02 23:36:23 UTC
[06/15] git commit: TS-1067 Remove the UDPWorkContinuation code
TS-1067 Remove the UDPWorkContinuation code
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/f8a6791b
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/f8a6791b
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/f8a6791b
Branch: refs/heads/master
Commit: f8a6791be894ae8b1db6ce41a31b5e9fbc7a90f2
Parents: 9bb4afb
Author: Leif Hedstrom <zw...@apache.org>
Authored: Tue Mar 26 08:39:06 2013 -0600
Committer: Leif Hedstrom <zw...@apache.org>
Committed: Tue Apr 2 13:52:33 2013 -0600
----------------------------------------------------------------------
iocore/net/I_UDPConnection.h | 9 +-
iocore/net/I_UDPNet.h | 8 --
iocore/net/P_UDPNet.h | 34 -------
iocore/net/UnixUDPNet.cc | 199 -------------------------------------
4 files changed, 4 insertions(+), 246 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f8a6791b/iocore/net/I_UDPConnection.h
----------------------------------------------------------------------
diff --git a/iocore/net/I_UDPConnection.h b/iocore/net/I_UDPConnection.h
index ab55181..045f376 100644
--- a/iocore/net/I_UDPConnection.h
+++ b/iocore/net/I_UDPConnection.h
@@ -97,12 +97,11 @@ public:
/**
Put socket on net queue for read/write polling.
- Not required for UDPConnections created with
- UDPNetProcessor::UDPBind
+ Not required for UDPConnections created with UDPNetProcessor::UDPBind
- Required for UDPNetProcessor::UDPCreatePortPairs and
- UDPNetProcessor::CreateUDPSocket. They don't do bindToThread()
- automatically so that the sockets can be passed to other Continuations.
+ Required for and UDPNetProcessor::CreateUDPSocket. They don't do
+ bindToThread() automatically so that the sockets can be passed to
+ other Continuations.
*/
void bindToThread(Continuation * c);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f8a6791b/iocore/net/I_UDPNet.h
----------------------------------------------------------------------
diff --git a/iocore/net/I_UDPNet.h b/iocore/net/I_UDPNet.h
index d9dc38b..5497fbd 100644
--- a/iocore/net/I_UDPNet.h
+++ b/iocore/net/I_UDPNet.h
@@ -84,14 +84,6 @@ public:
// The mess again: the complier won't let me stick UDPConnection here.
void UDPClassifyConnection(Continuation * udpConn, IpAddr const& addr);
- // create pairs of UDPConnections in which the first connection is
- // on a even-#'ed port and the second connection is on the next
- // odd-#'ed port. Create "nPairs" of such connections.
- Action *UDPCreatePortPairs(Continuation *, int nPairs,
- sockaddr const* local_addr,
- sockaddr const* remote_addr,
- int send_bufsize = 0, int recv_bufsize = 0);
-
// Regarding sendto_re, sendmsg_re, recvfrom_re:
// * You may be called back on 'c' with completion or error status.
// * 'token' is an opaque which can be used by caller to match up the I/O
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f8a6791b/iocore/net/P_UDPNet.h
----------------------------------------------------------------------
diff --git a/iocore/net/P_UDPNet.h b/iocore/net/P_UDPNet.h
index 8a3cfb8..31a2492 100644
--- a/iocore/net/P_UDPNet.h
+++ b/iocore/net/P_UDPNet.h
@@ -386,38 +386,4 @@ struct InkPipeInfo
extern InkPipeInfo G_inkPipeInfo;
-class UDPWorkContinuation:public Continuation
-{
-public:
- UDPWorkContinuation():cont(NULL), numPairs(0),
- sendbufsize(0), recvbufsize(0), udpConns(NULL), resultCode(NET_EVENT_DATAGRAM_OPEN)
- {
- memset(&local_ip, 0, sizeof(local_ip));
- memset(&remote_ip, 0, sizeof(remote_ip));
- };
- ~UDPWorkContinuation() {
- };
- void init(Continuation * c, int num_pairs,
- sockaddr const* local_ip,
- sockaddr const* remote_ip,
- int s_bufsize, int r_bufsize);
- int StateCreatePortPairs(int event, void *data);
- int StateDoCallback(int event, void *data);
-
- Action action;
-
-private:
- Continuation * cont;
- int numPairs;
- IpEndpoint local_ip; ///< replaces myIP.
- IpEndpoint remote_ip; ///< replaces destIP.
- int sendbufsize, recvbufsize;
- UnixUDPConnection **udpConns;
- int resultCode;
-};
-
-typedef int (UDPWorkContinuation::*UDPWorkContinuation_Handler) (int, void *);
-
-inkcoreapi extern ClassAllocator<UDPWorkContinuation> udpWorkContinuationAllocator;
-
#endif //__P_UDPNET_H_
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f8a6791b/iocore/net/UnixUDPNet.cc
----------------------------------------------------------------------
diff --git a/iocore/net/UnixUDPNet.cc b/iocore/net/UnixUDPNet.cc
index 73dc0f6..79dd8da 100644
--- a/iocore/net/UnixUDPNet.cc
+++ b/iocore/net/UnixUDPNet.cc
@@ -35,9 +35,6 @@
typedef int (UDPNetHandler::*UDPNetContHandler) (int, void *);
inkcoreapi ClassAllocator<UDPPacketInternal> udpPacketAllocator("udpPacketAllocator");
-
-inkcoreapi ClassAllocator<UDPWorkContinuation> udpWorkContinuationAllocator("udpWorkContinuationAllocator");
-
EventType ET_UDP;
#if defined(linux) && !defined(DEBUG)
@@ -514,23 +511,6 @@ UDPNetProcessor::sendto_re(Continuation * cont,
}
}
-Action *
-UDPNetProcessor::UDPCreatePortPairs(
- Continuation * cont,
- int nPairs,
- sockaddr const* local_addr,
- sockaddr const* remote_addr,
- int send_bufsize, int recv_bufsize
-) {
-
- UDPWorkContinuation *worker = udpWorkContinuationAllocator.alloc();
- // UDPWorkContinuation *worker = NEW(new UDPWorkContinuation);
-
- worker->init(cont, nPairs, local_addr, remote_addr, send_bufsize, recv_bufsize);
- eventProcessor.schedule_imm(worker, ET_UDP);
- return &(worker->action);
-}
-
bool
UDPNetProcessor::CreateUDPSocket(
@@ -1135,182 +1115,3 @@ UDPNetHandler::mainNetEvent(int event, Event * e)
return EVENT_CONT;
}
-
-/////////////////////////////////////////////////////////////////////
-//
-// A helper continuation that creates a pair of UDP ports in a non-blocking
-// way. This continuation runs on the UDP thread; a run lasts for at most 500ms.
-//
-/////////////////////////////////////////////////////////////////////
-
-void
-UDPWorkContinuation::init(Continuation * c, int num_pairs,
- sockaddr const* local_addr,
- sockaddr const* remote_addr,
- int s_bufsize, int r_bufsize
-) {
- mutex = c->mutex;
- cont = c;
- action = c;
- numPairs = num_pairs;
- ats_ip_copy(&local_ip, local_addr);
- ats_ip_copy(&remote_ip, remote_addr);
- sendbufsize = s_bufsize;
- recvbufsize = r_bufsize;
- udpConns = NULL;
- SET_HANDLER((UDPWorkContinuation_Handler) & UDPWorkContinuation::StateCreatePortPairs);
-}
-
-int
-UDPWorkContinuation::StateCreatePortPairs(int event, void *data)
-{
- NOWARN_UNUSED(event);
- NOWARN_UNUSED(data);
-// int res = 0;
- int numUdpPorts = 2 * numPairs;
- int fd1 = -1, fd2 = -1;
- IpEndpoint target;
- IpEndpoint myaddr1, myaddr2;
- int portNum, i;
-// int myaddr_len = sizeof(myaddr1);
- static int lastAllocPort = 10000;
- ink_hrtime startTime, endTime;
- Action *status;
- //epoll changes
-
- PollCont *pc = NULL;
- //epoll changes ends here
- ink_debug_assert(mutex->thread_holding == this_ethread());
-
- if (action.cancelled) {
- action = NULL;
- mutex = NULL;
- udpWorkContinuationAllocator.free(this);
- return EVENT_CONT;
- }
-
- startTime = ink_get_hrtime_internal();
- ats_ip_copy(&target, &remote_ip);
-
- udpConns = NEW(new UnixUDPConnection *[numUdpPorts]);
- for (i = 0; i < numUdpPorts; i++)
- udpConns[i] = NULL;
- ink_atomic_swap(&portNum, lastAllocPort);
- portNum %= 50000;
- if (portNum == 0)
- portNum = 10000;
-
- i = 0;
- while (i < numUdpPorts) {
-
- int myaddr1_len = sizeof(myaddr1);
- int myaddr2_len = sizeof(myaddr2);
- ats_ip_port_cast(&target) = htons(portNum);
- if (udpNet.CreateUDPSocket(&fd1,
- &target.sa,
- &myaddr1.sa,
- &myaddr1_len,
- &status, sendbufsize, recvbufsize)) {
- ats_ip_port_cast(&target) = htons(portNum + 1);
- if (udpNet.CreateUDPSocket(&fd2,
- &target.sa,
- &myaddr2.sa,
- &myaddr2_len,
- &status, sendbufsize, recvbufsize)) {
- udpConns[i] = NEW(new UnixUDPConnection(fd1)); // new_UnixUDPConnection(fd1);
- udpConns[i]->setBinding(&myaddr1.sa);
- i++;
- udpConns[i] = NEW(new UnixUDPConnection(fd2)); // new_UnixUDPConnection(fd2);
- udpConns[i]->setBinding(&myaddr2.sa);
- i++;
- // remember the last alloc'ed port
- ink_atomic_swap(&lastAllocPort, portNum + 2);
- } else {
- if (fd1 != NO_FD)
- socketManager.close(fd1);
- if (status == ACTION_IO_ERROR)
- goto Lerror;
- }
- Debug("udpnet", "Created port pair with ports = %d, %d", portNum, portNum + 1);
- } else if (status == ACTION_IO_ERROR)
- goto Lerror;
- // pick the next port pair value
- portNum += 2;
- // wrap around at 50K
- portNum %= 50000;
- if (portNum == 0)
- portNum = 10000;
- endTime = ink_get_hrtime_internal();
- // if we spend more than 500 ms. bail!
- if (ink_hrtime_to_msec(endTime - startTime) > 500) {
- status = ACTION_IO_ERROR;
- goto Lerror;
- }
-
- }
-
- for (i = 0; i < numUdpPorts; i++) {
- udpNet.UDPClassifyConnection(udpConns[i], IpAddr(target));
- Debug("udpnet-pipe", "Adding (port = %d) to Pipe class: %d",
- udpConns[i]->getPortNum(), udpConns[i]->pipe_class);
- }
-
- // assert should *never* fire; we check for this at the begin of the func.
- ink_assert(!action.cancelled);
-
- // Bind to threads only on a success. Currently, after you have
- // bound to have a thread, the only way to remove a UDPConnection is
- // to call destroy(); the thread to which the UDPConnection will
- // remove the connection from a linked list and call delete.
-
- for (i = 0; i < numUdpPorts; i++) {
- udpConns[i]->bindToThread(cont);
- pc = get_UDPPollCont(udpConns[i]->ethread);
- udpConns[i]->ep.start(pc->pollDescriptor, udpConns[i], EVENTIO_READ);
- }
-
- resultCode = NET_EVENT_DATAGRAM_OPEN;
- goto out;
-
-Lerror:
- resultCode = NET_EVENT_DATAGRAM_ERROR;
- for (i = 0; i < numUdpPorts; i++)
- delete udpConns[i];
- delete[] udpConns;
- udpConns = NULL;
-
-out:
- SET_HANDLER((UDPWorkContinuation_Handler) & UDPWorkContinuation::StateDoCallback);
- return StateDoCallback(0, NULL);
-}
-
-int
-UDPWorkContinuation::StateDoCallback(int event, void *data)
-{
- NOWARN_UNUSED(event);
- NOWARN_UNUSED(data);
- MUTEX_TRY_LOCK(lock, action.mutex, this_ethread());
- if (!lock) {
- this_ethread()->schedule_in(this, MUTEX_RETRY_DELAY);
- return EVENT_CONT;
- }
- if (!action.cancelled) {
- action.continuation->handleEvent(resultCode, udpConns);
- } else {
- // else action.cancelled
- if (resultCode == NET_EVENT_DATAGRAM_OPEN) {
- for (int i = 0; i < numPairs * 2; i++)
- // don't call delete on individual connections; the udp thread will do
- // that when it cleans up an fd.
- udpConns[i]->destroy();
- delete[]udpConns; // I think this is OK to delete the array, what we shouldn't do is loop over
- udpConns = NULL; // the conns and and do delete udpConns[i].
- }
- }
-
- action = NULL;
- mutex = NULL;
- udpWorkContinuationAllocator.free(this);
-
- return EVENT_CONT;
-}