The assertion takes place in socket.c at line 1663:

static void
dispatch_send(isc_socket_t *sock) {
        intev_t *iev;
        isc_socketevent_t *ev;

        INSIST(!sock->pending_send); // <<-- here


The backtrace posted above shows that there were three threads active at
the time of the crash. This means that a packet was to be sent although
the previous packet had not been transferred.

"pending_send" is only cleared in socket.c and nowhere else:

internal_send:2096

"dispatch_send" is indirectly called by the eventqueuehandler and this
only in "process_fds:2193".

The sourcecode shows that a dispatch_send() is called without checking
the state of pending_send of the socket.

if (!SOCK_DEAD(sock)) {
      if (sock->connecting)
                 dispatch_connect(sock);
       else
                 dispatch_send(sock);
}


Now if a wakeup event occurres the socket would be dispatched for
processing regardless which kind of event (timer?) triggered the wakeup.
At least I did not find any sanity checks in process_fds() except
SOCK_DEAD(sock).

This leads to the following situation: The sock is not dead yet but it
is still pending when it is dispatched again.

I would now check sock->pending_send before calling dispatch_send().This
 would at least prevent the assertion failure - well knowing that the
situation described above ( not dead but still pending and alerting ) is
not a very pleasant one - until someone comes up with a better solution.

Can anybody confirm this?


t++



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to