Oknet Xu created TS-4203:
----------------------------

             Summary: Multiple PD init/alloc in PollCont
                 Key: TS-4203
                 URL: https://issues.apache.org/jira/browse/TS-4203
             Project: Traffic Server
          Issue Type: Bug
          Components: Core
            Reporter: Oknet Xu


{code}
struct PollDescriptor {
  int result; // result of poll
.
.
.
  PollDescriptor *
  init()
  {
    result = 0;
#if TS_USE_EPOLL
    nfds = 0;
    epoll_fd = epoll_create(POLL_DESCRIPTOR_SIZE);
    memset(ePoll_Triggered_Events, 0, sizeof(ePoll_Triggered_Events));
    memset(pfd, 0, sizeof(pfd));
#endif
#if TS_USE_KQUEUE
    kqueue_fd = kqueue();
    memset(kq_Triggered_Events, 0, sizeof(kq_Triggered_Events));
#endif
#if TS_USE_PORT
    port_fd = port_create();
    memset(Port_Triggered_Events, 0, sizeof(Port_Triggered_Events));
#endif
    return this;
  }
  PollDescriptor() { init(); }
};
{code}

the construct function of PollDescriptor calls init() to create a `epoll_fd'.

the below code create PollDescriptor object then call init() again.
{code}
source: iocore/net/UnixNet.cc
PollCont::PollCont(ProxyMutex *m, NetHandler *nh, int pt)
  : Continuation(m), net_handler(nh), nextPollDescriptor(NULL), poll_timeout(pt)
{
  pollDescriptor = new PollDescriptor;
  pollDescriptor->init();
  SET_HANDLER(&PollCont::pollEvent);
}
{code}

{code}
source: iocore/net/UnixUDPNet.cc
  if (pc->nextPollDescriptor == NULL) {
    pc->nextPollDescriptor = new PollDescriptor;
    pc->nextPollDescriptor->init();
  }
{code}

The 2nd init() did not close epoll_fd if it is already opened.

solution: simplely remove 2nd `init()'.

do we need to transfer `init()' to private in the PollDescriptor ?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to