diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp index 49099c6c3a..2e0f002c99 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp @@ -21,6 +21,19 @@ using namespace RPC; +Request::Request() +{ + mutex_init(&fEventLock, "nfs4 Request"); +} + + +Request::~Request() +{ + mutex_lock(&fEventLock); + mutex_destroy(&fEventLock); +} + + RequestManager::RequestManager() : fQueueHead(NULL), @@ -203,7 +216,10 @@ Server::WakeCall(Request* request) request->fError = B_IO_ERROR; *request->fReply = NULL; request->fDone = true; + mutex_lock(&request->fEventLock); + // don't let the sending thread free request->fEvent until NotifyAll returns request->fEvent.NotifyAll(); + mutex_unlock(&request->fEventLock); return B_OK; } @@ -294,7 +310,10 @@ Server::_Listener() if (req != NULL) { *req->fReply = reply; req->fDone = true; + mutex_lock(&req->fEventLock); + // don't let the sending thread free req->fEvent until NotifyAll returns req->fEvent.NotifyAll(); + mutex_unlock(&req->fEventLock); } else delete reply; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h index 50e218b813..28c1945c7c 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h @@ -21,8 +21,12 @@ namespace RPC { struct Request { + Request(); + ~Request(); + uint32 fXID; ConditionVariable fEvent; + mutex fEventLock; bool fDone; Reply** fReply;