From 2e115f468fd39e9d5b8fd6771642cf49f24bccdd Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Wed, 11 Jul 2012 21:05:50 +0200 Subject: [PATCH] nfs4: Fix issues with renewal thread --- src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp | 12 ++++++++++-- src/add-ons/kernel/file_systems/nfs4/NFS4Server.h | 5 +++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp index 2ed40353b6..f3ea764525 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp @@ -16,7 +16,7 @@ NFS4Server::NFS4Server(RPC::Server* serv) : fThreadCancel(true), - fWaitCancel(create_sem(1, NULL)), + fWaitCancel(create_sem(0, NULL)), fLeaseTime(0), fClientIdLastUse(0), fUseCount(0), @@ -25,6 +25,8 @@ NFS4Server::NFS4Server(RPC::Server* serv) { mutex_init(&fClientIdLock, NULL); mutex_init(&fFSLock, NULL); + mutex_init(&fThreadStartLock, NULL); + } @@ -39,6 +41,7 @@ NFS4Server::~NFS4Server() delete_sem(fWaitCancel); mutex_destroy(&fClientIdLock); mutex_destroy(&fFSLock); + mutex_destroy(&fThreadStartLock); } @@ -166,7 +169,7 @@ NFS4Server::AddFileSystem(FileSystem* fs) fFileSystems->fPrev = fs; fFileSystems = fs; fUseCount += fs->OpenFilesCount(); - if (fs->OpenFilesCount() > 0 && fThreadCancel) + if (fs->OpenFilesCount() > 0) _StartRenewing(); } @@ -274,6 +277,11 @@ NFS4Server::_GetLeaseTime() status_t NFS4Server::_StartRenewing() { + if (!fThreadCancel) + return B_OK; + + MutexLocker _(fThreadStartLock); + if (!fThreadCancel) return B_OK; diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h index 210e3fa153..46134e8b1b 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h @@ -43,9 +43,11 @@ private: status_t _StartRenewing(); status_t _Renewal(); static status_t _RenewalThreadStart(void* ptr); + thread_id fThread; bool fThreadCancel; sem_id fWaitCancel; + mutex fThreadStartLock; uint32 fLeaseTime; @@ -67,8 +69,7 @@ NFS4Server::IncUsage() { MutexLocker _(fFSLock); fUseCount++; - if (fThreadCancel) - _StartRenewing(); + _StartRenewing(); fClientIdLastUse = time(NULL); }