for (i = 0; i < nids; i++, vd++) {
if (!*vd)
continue;
- client = h_ID2Client(*vd); /* returns client write locked, or NULL */
+ client = h_ID2Client(*vd); /* returns write locked and refCounted, or NULL */
if (!client)
continue;
client->CPS.prlist_len = 0;
}
ReleaseWriteLock(&client->lock);
+ PutClient(&client);
}
addr = addrs->IPAddrs_val;
}
/* We can't protect this without dropping the H_LOCK */
client->CPS.prlist_len = 0;
- if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
+ if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val)
free(client->CPS.prlist_val);
- client->CPS.prlist_val = NULL;
- }
+ client->CPS.prlist_val = NULL;
if (client->tcon) {
rx_SetSpecific(client->tcon, rxcon_client_key, (void *)0);
}
/*MapName*/
-/* NOTE: this returns the client with a Write lock */
+/* NOTE: this returns the client with a Write lock and a refCount */
struct client *
h_ID2Client(afs_int32 vid)
{
client->refCount++;
H_UNLOCK;
ObtainWriteLock(&client->lock);
- H_LOCK;
- client->refCount--;
- H_UNLOCK;
return client;
}
}
client->prfail = fail;
if (!(client->CPS.prlist_val) || (viceid != client->ViceId)) {
- if (client->CPS.prlist_val && (client->ViceId != ANONYMOUSID)) {
+ client->CPS.prlist_len = 0;
+ if (client->CPS.prlist_val && (client->ViceId != ANONYMOUSID))
free(client->CPS.prlist_val);
- }
client->CPS.prlist_val = NULL;
- client->CPS.prlist_len = 0;
client->ViceId = viceid;
client->expTime = expTime;
afs_inet_ntoa_r(rxr_HostOf(tcon), hoststr),
ntohs(rxr_PortOf(tcon)),
oldClient, oldClient->sid));
- if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
+ if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val)
free(client->CPS.prlist_val);
- client->CPS.prlist_val = NULL;
- }
+ client->CPS.prlist_val = NULL;
client->CPS.prlist_len = 0;
if (client->tcon) {
rx_SetSpecific(client->tcon, rxcon_client_key, (void *)0);