Reduce the number of ChoppedVector index operations.
This commit is contained in:
parent
30f614a7ff
commit
b2b072dd80
|
@ -265,13 +265,14 @@ package class PosixEventLoop {
|
||||||
|
|
||||||
package void clearFD(FD fd)
|
package void clearFD(FD fd)
|
||||||
{
|
{
|
||||||
if (m_fds[fd.value].common.userDataDestructor)
|
auto slot = () @trusted { return &m_fds[fd.value]; } ();
|
||||||
() @trusted { m_fds[fd.value].common.userDataDestructor(m_fds[fd.value].common.userData.ptr); } ();
|
if (slot.common.userDataDestructor)
|
||||||
if (!(m_fds[fd.value].common.flags & FDFlags.internal))
|
() @trusted { slot.common.userDataDestructor(slot.common.userData.ptr); } ();
|
||||||
foreach (cb; m_fds[fd.value].common.callback)
|
if (!(slot.common.flags & FDFlags.internal))
|
||||||
|
foreach (cb; slot.common.callback)
|
||||||
if (cb !is null)
|
if (cb !is null)
|
||||||
m_waiterCount--;
|
m_waiterCount--;
|
||||||
m_fds[fd.value] = m_fds.FullField.init;
|
*slot = m_fds.FullField.init;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -803,10 +803,11 @@ final class PosixEventDriverSockets(Loop : PosixEventLoop) : EventDriverSockets
|
||||||
final override bool releaseRef(SocketFD fd)
|
final override bool releaseRef(SocketFD fd)
|
||||||
{
|
{
|
||||||
import taggedalgebraic : hasType;
|
import taggedalgebraic : hasType;
|
||||||
assert(m_loop.m_fds[fd].common.refCount > 0, "Releasing reference to unreferenced socket FD.");
|
auto slot = () @trusted { return &m_loop.m_fds[fd]; } ();
|
||||||
|
assert(slot.common.refCount > 0, "Releasing reference to unreferenced socket FD.");
|
||||||
// listening sockets have an incremented the reference count because of setNotifyCallback
|
// listening sockets have an incremented the reference count because of setNotifyCallback
|
||||||
int base_refcount = m_loop.m_fds[fd].specific.hasType!StreamListenSocketSlot ? 1 : 0;
|
int base_refcount = slot.specific.hasType!StreamListenSocketSlot ? 1 : 0;
|
||||||
if (--m_loop.m_fds[fd].common.refCount == base_refcount) {
|
if (--slot.common.refCount == base_refcount) {
|
||||||
m_loop.unregisterFD(fd, EventMask.read|EventMask.write|EventMask.status);
|
m_loop.unregisterFD(fd, EventMask.read|EventMask.write|EventMask.status);
|
||||||
m_loop.clearFD(fd);
|
m_loop.clearFD(fd);
|
||||||
closeSocket(cast(sock_t)fd);
|
closeSocket(cast(sock_t)fd);
|
||||||
|
|
Loading…
Reference in a new issue