You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by tr...@apache.org on 2009/03/06 01:35:29 UTC
svn commit: r750708 - /apr/apr/trunk/poll/unix/port.c
Author: trawick
Date: Fri Mar 6 00:35:29 2009
New Revision: 750708
URL: http://svn.apache.org/viewvc?rev=750708&view=rev
Log:
elements on the add ring are not currently associated, so only call
port_dissociate (sic) if it isn't on the add ring
when we remove an element from the add ring, we can release it
immediately to the free ring
(elements removed from the query ring are the ones that have to be
placed on the dead ring temporarily)
Modified:
apr/apr/trunk/poll/unix/port.c
Modified: apr/apr/trunk/poll/unix/port.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/poll/unix/port.c?rev=750708&r1=750707&r2=750708&view=diff
==============================================================================
--- apr/apr/trunk/poll/unix/port.c (original)
+++ apr/apr/trunk/poll/unix/port.c Fri Mar 6 00:35:29 2009
@@ -217,19 +217,15 @@
fd = descriptor->desc.f->filedes;
}
- res = port_dissociate(pollset->p->port_fd, PORT_SOURCE_FD, fd);
-
- if (res < 0) {
- err = errno;
- rv = APR_NOTFOUND;
- }
-
/* Search the add ring first. This ring is often shorter,
* and it often contains the descriptor being removed.
* (For the common scenario where apr_pollset_poll()
* returns activity for the descriptor and the descriptor
* is then removed from the pollset, it will have just
* been moved to the add ring by apr_pollset_poll().)
+ *
+ * If it is on the add ring, it isn't associated with the
+ * event port yet/anymore.
*/
found = 0;
for (ep = APR_RING_FIRST(&(pollset->p->add_ring));
@@ -240,16 +236,20 @@
if (descriptor->desc.s == ep->pfd.desc.s) {
found = 1;
APR_RING_REMOVE(ep, link);
- APR_RING_INSERT_TAIL(&(pollset->p->dead_ring),
+ APR_RING_INSERT_TAIL(&(pollset->p->free_ring),
ep, pfd_elem_t, link);
- if (ENOENT == err) {
- rv = APR_SUCCESS;
- }
break;
}
}
if (!found) {
+ res = port_dissociate(pollset->p->port_fd, PORT_SOURCE_FD, fd);
+
+ if (res < 0) {
+ err = errno;
+ rv = APR_NOTFOUND;
+ }
+
for (ep = APR_RING_FIRST(&(pollset->p->query_ring));
ep != APR_RING_SENTINEL(&(pollset->p->query_ring),
pfd_elem_t, link);