From dab62fa391ea4aca5e0aded1f390a8e7553e1c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sat, 9 Nov 2002 02:02:31 +0000 Subject: [PATCH] Fixed a big stupid bug that can cause lots of trouble: all locks created weren't moved to the kernel (as owner), so they would be deleted after the team which almost randomly created them died. Benaphores are now only used if USE_BENAPHORES is defined - I have renamed the Benaphore class to Semaphore to take the changed behaviour into account. Added a Status() method to the Locker class. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1885 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/file_systems/bfs/BlockAllocator.h | 2 +- .../kernel/file_systems/bfs/BufferPool.cpp | 5 ++ src/add-ons/kernel/file_systems/bfs/Journal.h | 2 +- src/add-ons/kernel/file_systems/bfs/Lock.h | 58 ++++++++++++++----- src/add-ons/kernel/file_systems/bfs/Volume.h | 6 +- 5 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h index f05923e29d..1eaeaaaad4 100644 --- a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h +++ b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h @@ -47,7 +47,7 @@ class BlockAllocator { static status_t initialize(BlockAllocator *); Volume *fVolume; - Benaphore fLock; + Semaphore fLock; AllocationGroup *fGroups; int32 fNumGroups, fBlocksPerGroup; uint32 *fCheckBitmap; diff --git a/src/add-ons/kernel/file_systems/bfs/BufferPool.cpp b/src/add-ons/kernel/file_systems/bfs/BufferPool.cpp index d4e86e0f39..f9305d40ed 100644 --- a/src/add-ons/kernel/file_systems/bfs/BufferPool.cpp +++ b/src/add-ons/kernel/file_systems/bfs/BufferPool.cpp @@ -20,6 +20,11 @@ BufferPool::BufferPool() { fLock = create_sem(1, "buffer lock"); fFreeBuffers = create_sem(0, "free buffers"); + +#ifndef USER + set_sem_owner(fLock, B_SYSTEM_TEAM); + set_sem_owner(fFreeBuffers, B_SYSTEM_TEAM); +#endif } diff --git a/src/add-ons/kernel/file_systems/bfs/Journal.h b/src/add-ons/kernel/file_systems/bfs/Journal.h index 55e6dc96eb..18159436ea 100644 --- a/src/add-ons/kernel/file_systems/bfs/Journal.h +++ b/src/add-ons/kernel/file_systems/bfs/Journal.h @@ -69,7 +69,7 @@ class Journal { status_t TransactionDone(bool success); Volume *fVolume; - Benaphore fLock; + Semaphore fLock; Transaction *fOwner; thread_id fOwningThread; BlockArray fArray; diff --git a/src/add-ons/kernel/file_systems/bfs/Lock.h b/src/add-ons/kernel/file_systems/bfs/Lock.h index 8ffd9dc133..0073faa107 100644 --- a/src/add-ons/kernel/file_systems/bfs/Lock.h +++ b/src/add-ons/kernel/file_systems/bfs/Lock.h @@ -1,6 +1,6 @@ #ifndef LOCK_H #define LOCK_H -/* Lock - benaphores, read/write lock implementation +/* Lock - simple semaphores, read/write lock implementation ** ** Initial version by Axel Dörfler, axeld@pinc-software.de ** Roughly based on a Be sample code written by Nathan Schrenk. @@ -12,16 +12,27 @@ #include -class Benaphore { +// configure here if and when real benaphores should be used +#ifdef USER +# define USE_BENAPHORE 1 +#endif + + +class Semaphore { public: - Benaphore(const char *name = "bfs benaphore") + Semaphore(const char *name = "bfs sem") : - fSemaphore(create_sem(0, name)), - fCount(1) + fSemaphore(create_sem(0, name)) +#ifdef USE_BENAPHORE + , fCount(1) +#endif { +#ifndef USER + set_sem_owner(fSemaphore, B_SYSTEM_TEAM); +#endif } - ~Benaphore() + ~Semaphore() { delete_sem(fSemaphore); } @@ -36,28 +47,38 @@ class Benaphore { status_t Lock() { +#ifdef USE_BENAPHORE if (atomic_add(&fCount, -1) <= 0) +#endif return acquire_sem(fSemaphore); - +#ifdef USE_BENAPHORE return B_OK; +#endif } - void Unlock() + status_t Unlock() { +#ifdef USE_BENAPHORE if (atomic_add(&fCount, 1) < 0) - release_sem(fSemaphore); +#endif + return release_sem(fSemaphore); +#ifdef USE_BENAPHORE + return B_OK; +#endif } private: sem_id fSemaphore; +#ifdef USE_BENAPHORE vint32 fCount; +#endif }; // a convenience class to lock the benaphore class Locker { public: - Locker(Benaphore &lock) + Locker(Semaphore &lock) : fLock(lock) { fStatus = lock.Lock(); @@ -68,9 +89,14 @@ class Locker { if (fStatus == B_OK) fLock.Unlock(); } - + + status_t Status() const + { + return fStatus; + } + private: - Benaphore &fLock; + Semaphore &fLock; status_t fStatus; }; @@ -118,6 +144,9 @@ class ReadWriteLock { fCount(MAX_READERS), fWriteLock() { +#ifndef USER + set_sem_owner(fSemaphore, B_SYSTEM_TEAM); +#endif } ~ReadWriteLock() @@ -181,7 +210,7 @@ class ReadWriteLock { sem_id fSemaphore; vint32 fCount; - Benaphore fWriteLock; + Semaphore fWriteLock; }; #else // FAST_LOCK class ReadWriteLock { @@ -190,6 +219,9 @@ class ReadWriteLock { : fSemaphore(create_sem(MAX_READERS, name)) { +#ifndef USER + set_sem_owner(fSemaphore, B_SYSTEM_TEAM); +#endif } ~ReadWriteLock() diff --git a/src/add-ons/kernel/file_systems/bfs/Volume.h b/src/add-ons/kernel/file_systems/bfs/Volume.h index d75c28edf1..118a472a11 100644 --- a/src/add-ons/kernel/file_systems/bfs/Volume.h +++ b/src/add-ons/kernel/file_systems/bfs/Volume.h @@ -43,7 +43,7 @@ class Volume { bool IsValidSuperBlock(); bool IsReadOnly() const; void Panic(); - Benaphore &Lock(); + Semaphore &Lock(); block_run Root() const { return fSuperBlock.root_dir; } Inode *RootNode() const { return fRootNode; } @@ -114,7 +114,7 @@ class Volume { int fDevice; disk_super_block fSuperBlock; BlockAllocator fBlockAllocator; - Benaphore fLock; + Semaphore fLock; Journal *fJournal; vint32 fLogStart, fLogEnd; @@ -142,7 +142,7 @@ Volume::IsReadOnly() const } -inline Benaphore & +inline Semaphore & Volume::Lock() { return fLock;