drop-h-lock-around-putconn-20041027
authorDerrick Brashear <shadow@dementia.org>
Thu, 28 Oct 2004 19:08:06 +0000 (19:08 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 28 Oct 2004 19:08:06 +0000 (19:08 +0000)
the problem with rx_PutConnection is h_FreeConnection uses the host global lock

====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================

the problem with rx_PutConnection is h_FreeConnection uses the host global lock
but it shouldn't matter (callback conn should be a client not server conn and
thus not h_FreeConnection on cleanup)

further, we should free the conns we GetConnection'd not the ones still in
the host struct at the end.

src/viced/callback.c

index 90d684d..fc45bb3 100644 (file)
@@ -855,11 +855,20 @@ MultiBreakCallBack_r(struct cbstruct cba[], int ncbas,
        struct host *hp;
        hp = cba[i].hp;
        if (hp && xhost != hp) {
-           rx_PutConnection(hp->callback_rxcon);
            h_Release_r(hp);
        }
     }
 
+    /* H_UNLOCK around this so h_FreeConnection does not deadlock.
+       h_FreeConnection should *never* be called on a callback connection,
+       but on 10/27/04 a deadlock occurred where it was, when we know why,
+       this should be reverted. -- shadow */
+    H_UNLOCK;
+    for (i = 0; i < j; i++) {
+       rx_PutConnection(conns[i]);
+    }
+    H_LOCK;
+
     return;
 }