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]