nfs4: Avoid conflicts between threads attempting to repair TCP connection

This commit is contained in:
Pawel Dziepak
2013-01-02 20:17:57 +01:00
parent 8837efd025
commit 47e68f1c7a
2 changed files with 18 additions and 1 deletions
@@ -81,12 +81,14 @@ Server::Server(Connection* connection, PeerAddress* address)
fAddress(address),
fPrivateData(NULL),
fCallback(NULL),
fRepairCount(0),
fXID(rand() << 1)
{
ASSERT(connection != NULL);
ASSERT(address != NULL);
mutex_init(&fCallbackLock, NULL);
mutex_init(&fRepairLock, NULL);
_StartListening();
}
@@ -98,6 +100,7 @@ Server::~Server()
gRPCCallbackServer->UnregisterCallback(fCallback);
delete fCallback;
mutex_destroy(&fCallbackLock);
mutex_destroy(&fRepairLock);
delete fPrivateData;
@@ -229,6 +232,12 @@ Server::WakeCall(Request* request)
status_t
Server::Repair()
{
uint32 thisRepair = fRepairCount;
MutexLocker _(fRepairLock);
if (fRepairCount == thisRepair)
return B_OK;
fThreadCancel = true;
status_t result = fConnection->Reconnect();
@@ -236,7 +245,12 @@ Server::Repair()
return result;
wait_for_thread(fThread, &result);
return _StartListening();
result = _StartListening();
if (result == B_OK)
fRepairCount++;
return result;
}
@@ -103,6 +103,9 @@ private:
mutex fCallbackLock;
Callback* fCallback;
uint32 fRepairCount;
mutex fRepairLock;
vint32 fXID;
static const bigtime_t kWaitTime = 1000000;
};