lock_ObtainMutex(&tsp->mx);
tsp->waitCount--;
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
lock_ReleaseMutex(&tsp->mx);
return;
}
- tsp->flags |= CM_SERVERFLAG_PINGING;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
wasDown = tsp->flags & CM_SERVERFLAG_DOWN;
afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
lock_ReleaseMutex(&tsp->mx);
lock_ObtainMutex(&tsp->mx);
if (code >= 0 || code == RXGEN_OPCODE) {
/* mark server as up */
- tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
tsp->downTime = 0;
/* we currently handle 32-bits of capabilities */
} else {
/* mark server as down */
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
if (code != VRESTARTING) {
}
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
lock_ReleaseMutex(&tsp->mx);
continue;
}
- tsp->flags |= CM_SERVERFLAG_PINGING;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
lock_ReleaseMutex(&tsp->mx);
serversp[nconns] = tsp;
if (results[i] >= 0 || results[i] == RXGEN_OPCODE) {
/* mark server as up */
- tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
tsp->downTime = 0;
/* we currently handle 32-bits of capabilities */
} else {
/* mark server as down */
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
if (code != VRESTARTING) {
}
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
continue;
}
- tsp->flags |= CM_SERVERFLAG_PINGING;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
lock_ReleaseMutex(&tsp->mx);
serversp[nconns] = tsp;
if (results[i] >= 0) {
/* mark server as up */
- tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
tsp->downTime = 0;
tsp->capabilities = 0;
} else {
/* mark server as down */
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
if (code != VRESTARTING) {
}
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
{
lock_ObtainMutex(&serverp->mx);
if (no64bit)
- serverp->flags |= CM_SERVERFLAG_NO64BIT;
+ _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NO64BIT);
else
- serverp->flags &= ~CM_SERVERFLAG_NO64BIT;
+ _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NO64BIT);
lock_ReleaseMutex(&serverp->mx);
}
{
lock_ObtainMutex(&serverp->mx);
if (no)
- serverp->flags |= CM_SERVERFLAG_NOINLINEBULK;
+ _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NOINLINEBULK);
else
- serverp->flags &= ~CM_SERVERFLAG_NOINLINEBULK;
+ _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NOINLINEBULK);
lock_ReleaseMutex(&serverp->mx);
}
osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family");
+ lock_ObtainWrite(&cm_serverLock); /* get server lock */
+ tsp = cm_FindServer(socketp, type, TRUE);
+ if (tsp) {
+ /* we might have found a server created by set server prefs */
+ if (uuidp && !afs_uuid_is_nil(uuidp) &&
+ !(tsp->flags & CM_SERVERFLAG_UUID))
+ {
+ tsp->uuid = *uuidp;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
+ }
+ lock_ReleaseWrite(&cm_serverLock);
+ return tsp;
+ }
+
tsp = malloc(sizeof(*tsp));
if (tsp) {
memset(tsp, 0, sizeof(*tsp));
tsp->cellp = cellp;
if (uuidp && !afs_uuid_is_nil(uuidp)) {
tsp->uuid = *uuidp;
- tsp->flags |= CM_SERVERFLAG_UUID;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
}
tsp->refCount = 1;
lock_InitializeMutex(&tsp->mx, "cm_server_t mutex", LOCK_HIERARCHY_SERVER);
cm_SetServerPrefs(tsp);
- lock_ObtainWrite(&cm_serverLock); /* get server lock */
tsp->allNextp = cm_allServersp;
cm_allServersp = tsp;
cm_numFileServers++;
break;
}
+ }
+ lock_ReleaseWrite(&cm_serverLock); /* release server lock */
- lock_ReleaseWrite(&cm_serverLock); /* release server lock */
-
- if ( !(flags & CM_FLAG_NOPROBE) ) {
- tsp->flags |= CM_SERVERFLAG_DOWN; /* assume down; ping will mark up if available */
- cm_PingServer(tsp); /* Obtain Capabilities and check up/down state */
- }
+ if (!(flags & CM_FLAG_NOPROBE) && tsp) {
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); /* assume down; ping will mark up if available */
+ cm_PingServer(tsp); /* Obtain Capabilities and check up/down state */
}
+
return tsp;
}
cm_server_t *
-cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type)
+cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type, int locked)
{
cm_server_t *tsp;
- lock_ObtainRead(&cm_serverLock);
+ if (!locked)
+ lock_ObtainRead(&cm_serverLock);
+
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
if (tsp->type == type &&
tsp->addr.sin_addr.S_un.S_addr == ipaddr &&
if (tsp)
cm_GetServerNoLock(tsp);
- lock_ReleaseRead(&cm_serverLock);
+ if (!locked)
+ lock_ReleaseRead(&cm_serverLock);
return tsp;
}
cm_server_t *
-cm_FindServerByUuid(afsUUID *serverUuid, int type)
+cm_FindServerByUuid(afsUUID *serverUuid, int type, int locked)
{
cm_server_t *tsp;
- lock_ObtainRead(&cm_serverLock);
+ if (locked)
+ lock_ObtainRead(&cm_serverLock);
+
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
if (tsp->type == type && !afs_uuid_equal(&tsp->uuid, serverUuid))
break;
if (tsp)
cm_GetServerNoLock(tsp);
- lock_ReleaseRead(&cm_serverLock);
+ if (!locked)
+ lock_ReleaseRead(&cm_serverLock);
return tsp;
}
/* find a server based on its properties */
-cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type)
+cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked)
{
- cm_server_t *tsp;
-
osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
- lock_ObtainRead(&cm_serverLock);
- for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {
- if (tsp->type == type &&
- tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr &&
- (tsp->addr.sin_port == addrp->sin_port || tsp->addr.sin_port == 0))
- break;
- }
-
- /* bump ref count if we found the server */
- if (tsp)
- cm_GetServerNoLock(tsp);
-
- /* drop big table lock */
- lock_ReleaseRead(&cm_serverLock);
-
- /* return what we found */
- return tsp;
+ return cm_FindServerByIP(addrp->sin_addr.s_addr, addrp->sin_port, type, locked);
}
cm_server_vols_t *cm_NewServerVols(void) {