Replaced benaphores with mutexes.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25378 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
3bdd7f38f1
commit
adf376c941
63
src/system/kernel/cache/block_cache.cpp
vendored
63
src/system/kernel/cache/block_cache.cpp
vendored
@ -99,7 +99,7 @@ typedef DoublyLinkedList<cache_notification> NotificationList;
|
|||||||
|
|
||||||
struct block_cache : DoublyLinkedListLinkImpl<block_cache> {
|
struct block_cache : DoublyLinkedListLinkImpl<block_cache> {
|
||||||
hash_table *hash;
|
hash_table *hash;
|
||||||
benaphore lock;
|
mutex lock;
|
||||||
int fd;
|
int fd;
|
||||||
off_t max_blocks;
|
off_t max_blocks;
|
||||||
size_t block_size;
|
size_t block_size;
|
||||||
@ -657,9 +657,7 @@ block_cache::block_cache(int _fd, off_t numBlocks, size_t blockSize,
|
|||||||
if (transaction_hash == NULL)
|
if (transaction_hash == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (benaphore_init(&lock, "block cache") < B_OK)
|
mutex_init(&lock, "block cache");
|
||||||
return;
|
|
||||||
|
|
||||||
register_low_memory_handler(&block_cache::LowMemoryHandler, this, 0);
|
register_low_memory_handler(&block_cache::LowMemoryHandler, this, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -671,7 +669,7 @@ block_cache::~block_cache()
|
|||||||
|
|
||||||
unregister_low_memory_handler(&block_cache::LowMemoryHandler, this);
|
unregister_low_memory_handler(&block_cache::LowMemoryHandler, this);
|
||||||
|
|
||||||
benaphore_destroy(&lock);
|
mutex_destroy(&lock);
|
||||||
|
|
||||||
condition_variable.Unpublish();
|
condition_variable.Unpublish();
|
||||||
|
|
||||||
@ -689,9 +687,6 @@ block_cache::~block_cache()
|
|||||||
status_t
|
status_t
|
||||||
block_cache::InitCheck()
|
block_cache::InitCheck()
|
||||||
{
|
{
|
||||||
if (lock.sem < B_OK)
|
|
||||||
return lock.sem;
|
|
||||||
|
|
||||||
if (buffer_cache == NULL || hash == NULL || transaction_hash == NULL)
|
if (buffer_cache == NULL || hash == NULL || transaction_hash == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
@ -834,7 +829,7 @@ void
|
|||||||
block_cache::LowMemoryHandler(void *data, int32 level)
|
block_cache::LowMemoryHandler(void *data, int32 level)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)data;
|
block_cache *cache = (block_cache *)data;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
if (!locker.IsLocked()) {
|
if (!locker.IsLocked()) {
|
||||||
// If our block_cache were deleted, it could be that we had
|
// If our block_cache were deleted, it could be that we had
|
||||||
@ -1457,7 +1452,7 @@ get_next_locked_block_cache(block_cache *last)
|
|||||||
|
|
||||||
block_cache *cache;
|
block_cache *cache;
|
||||||
if (last != NULL) {
|
if (last != NULL) {
|
||||||
benaphore_unlock(&last->lock);
|
mutex_unlock(&last->lock);
|
||||||
|
|
||||||
cache = sCaches.GetNext((block_cache *)&sMarkCache);
|
cache = sCaches.GetNext((block_cache *)&sMarkCache);
|
||||||
sCaches.Remove((block_cache *)&sMarkCache);
|
sCaches.Remove((block_cache *)&sMarkCache);
|
||||||
@ -1471,14 +1466,14 @@ get_next_locked_block_cache(block_cache *last)
|
|||||||
if (cache == NULL)
|
if (cache == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
status_t status = benaphore_lock(&cache->lock);
|
status_t status = mutex_lock(&cache->lock);
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
// can only happen if the cache is being deleted right now
|
// can only happen if the cache is being deleted right now
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cache->deleting) {
|
if (cache->deleting) {
|
||||||
benaphore_unlock(&cache->lock);
|
mutex_unlock(&cache->lock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1667,7 +1662,7 @@ extern "C" int32
|
|||||||
cache_start_transaction(void *_cache)
|
cache_start_transaction(void *_cache)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
if (cache->last_transaction && cache->last_transaction->open) {
|
if (cache->last_transaction && cache->last_transaction->open) {
|
||||||
panic("last transaction (%ld) still open!\n",
|
panic("last transaction (%ld) still open!\n",
|
||||||
@ -1694,7 +1689,7 @@ extern "C" status_t
|
|||||||
cache_sync_transaction(void *_cache, int32 id)
|
cache_sync_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
status_t status = B_ENTRY_NOT_FOUND;
|
status_t status = B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
TRACE(("cache_sync_transaction(id %ld)\n", id));
|
TRACE(("cache_sync_transaction(id %ld)\n", id));
|
||||||
@ -1762,7 +1757,7 @@ cache_end_transaction(void *_cache, int32 id,
|
|||||||
transaction_notification_hook hook, void *data)
|
transaction_notification_hook hook, void *data)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("cache_end_transaction(id = %ld)\n", id));
|
TRACE(("cache_end_transaction(id = %ld)\n", id));
|
||||||
|
|
||||||
@ -1819,7 +1814,7 @@ extern "C" status_t
|
|||||||
cache_abort_transaction(void *_cache, int32 id)
|
cache_abort_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("cache_abort_transaction(id = %ld)\n", id));
|
TRACE(("cache_abort_transaction(id = %ld)\n", id));
|
||||||
|
|
||||||
@ -1870,7 +1865,7 @@ cache_detach_sub_transaction(void *_cache, int32 id,
|
|||||||
transaction_notification_hook hook, void *data)
|
transaction_notification_hook hook, void *data)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("cache_detach_sub_transaction(id = %ld)\n", id));
|
TRACE(("cache_detach_sub_transaction(id = %ld)\n", id));
|
||||||
|
|
||||||
@ -1958,7 +1953,7 @@ extern "C" status_t
|
|||||||
cache_abort_sub_transaction(void *_cache, int32 id)
|
cache_abort_sub_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("cache_abort_sub_transaction(id = %ld)\n", id));
|
TRACE(("cache_abort_sub_transaction(id = %ld)\n", id));
|
||||||
|
|
||||||
@ -2009,7 +2004,7 @@ extern "C" status_t
|
|||||||
cache_start_sub_transaction(void *_cache, int32 id)
|
cache_start_sub_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("cache_start_sub_transaction(id = %ld)\n", id));
|
TRACE(("cache_start_sub_transaction(id = %ld)\n", id));
|
||||||
|
|
||||||
@ -2060,7 +2055,7 @@ cache_add_transaction_listener(void *_cache, int32 id, int32 events,
|
|||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
|
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cache_transaction *transaction = lookup_transaction(cache, id);
|
cache_transaction *transaction = lookup_transaction(cache, id);
|
||||||
if (transaction == NULL)
|
if (transaction == NULL)
|
||||||
@ -2076,7 +2071,7 @@ cache_remove_transaction_listener(void *_cache, int32 id,
|
|||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
|
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cache_transaction *transaction = lookup_transaction(cache, id);
|
cache_transaction *transaction = lookup_transaction(cache, id);
|
||||||
if (transaction == NULL)
|
if (transaction == NULL)
|
||||||
@ -2109,7 +2104,7 @@ cache_next_block_in_transaction(void *_cache, int32 id, bool mainOnly,
|
|||||||
cached_block *block = (cached_block *)*_cookie;
|
cached_block *block = (cached_block *)*_cookie;
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
|
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cache_transaction *transaction = lookup_transaction(cache, id);
|
cache_transaction *transaction = lookup_transaction(cache, id);
|
||||||
if (transaction == NULL || !transaction->open)
|
if (transaction == NULL || !transaction->open)
|
||||||
@ -2145,7 +2140,7 @@ extern "C" int32
|
|||||||
cache_blocks_in_transaction(void *_cache, int32 id)
|
cache_blocks_in_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cache_transaction *transaction = lookup_transaction(cache, id);
|
cache_transaction *transaction = lookup_transaction(cache, id);
|
||||||
if (transaction == NULL)
|
if (transaction == NULL)
|
||||||
@ -2159,7 +2154,7 @@ extern "C" int32
|
|||||||
cache_blocks_in_main_transaction(void *_cache, int32 id)
|
cache_blocks_in_main_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cache_transaction *transaction = lookup_transaction(cache, id);
|
cache_transaction *transaction = lookup_transaction(cache, id);
|
||||||
if (transaction == NULL)
|
if (transaction == NULL)
|
||||||
@ -2173,7 +2168,7 @@ extern "C" int32
|
|||||||
cache_blocks_in_sub_transaction(void *_cache, int32 id)
|
cache_blocks_in_sub_transaction(void *_cache, int32 id)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cache_transaction *transaction = lookup_transaction(cache, id);
|
cache_transaction *transaction = lookup_transaction(cache, id);
|
||||||
if (transaction == NULL)
|
if (transaction == NULL)
|
||||||
@ -2194,7 +2189,7 @@ block_cache_delete(void *_cache, bool allowWrites)
|
|||||||
if (allowWrites)
|
if (allowWrites)
|
||||||
block_cache_sync(cache);
|
block_cache_sync(cache);
|
||||||
|
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
// free all blocks
|
// free all blocks
|
||||||
|
|
||||||
@ -2243,7 +2238,7 @@ block_cache_sync(void *_cache)
|
|||||||
// we will sync all dirty blocks to disk that have a completed
|
// we will sync all dirty blocks to disk that have a completed
|
||||||
// transaction or no transaction only
|
// transaction or no transaction only
|
||||||
|
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
hash_iterator iterator;
|
hash_iterator iterator;
|
||||||
hash_open(cache->hash, &iterator);
|
hash_open(cache->hash, &iterator);
|
||||||
|
|
||||||
@ -2281,7 +2276,7 @@ block_cache_sync_etc(void *_cache, off_t blockNumber, size_t numBlocks)
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
for (; numBlocks > 0; numBlocks--, blockNumber++) {
|
for (; numBlocks > 0; numBlocks--, blockNumber++) {
|
||||||
cached_block *block = (cached_block *)hash_lookup(cache->hash,
|
cached_block *block = (cached_block *)hash_lookup(cache->hash,
|
||||||
@ -2312,7 +2307,7 @@ extern "C" status_t
|
|||||||
block_cache_make_writable(void *_cache, off_t blockNumber, int32 transaction)
|
block_cache_make_writable(void *_cache, off_t blockNumber, int32 transaction)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
if (cache->read_only)
|
if (cache->read_only)
|
||||||
panic("tried to make block writable on a read-only cache!");
|
panic("tried to make block writable on a read-only cache!");
|
||||||
@ -2334,7 +2329,7 @@ block_cache_get_writable_etc(void *_cache, off_t blockNumber, off_t base,
|
|||||||
off_t length, int32 transaction)
|
off_t length, int32 transaction)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("block_cache_get_writable_etc(block = %Ld, transaction = %ld)\n",
|
TRACE(("block_cache_get_writable_etc(block = %Ld, transaction = %ld)\n",
|
||||||
blockNumber, transaction));
|
blockNumber, transaction));
|
||||||
@ -2358,7 +2353,7 @@ extern "C" void *
|
|||||||
block_cache_get_empty(void *_cache, off_t blockNumber, int32 transaction)
|
block_cache_get_empty(void *_cache, off_t blockNumber, int32 transaction)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
TRACE(("block_cache_get_empty(block = %Ld, transaction = %ld)\n",
|
TRACE(("block_cache_get_empty(block = %Ld, transaction = %ld)\n",
|
||||||
blockNumber, transaction));
|
blockNumber, transaction));
|
||||||
@ -2374,7 +2369,7 @@ extern "C" const void *
|
|||||||
block_cache_get_etc(void *_cache, off_t blockNumber, off_t base, off_t length)
|
block_cache_get_etc(void *_cache, off_t blockNumber, off_t base, off_t length)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
bool allocated;
|
bool allocated;
|
||||||
|
|
||||||
cached_block *block = get_cached_block(cache, blockNumber, &allocated);
|
cached_block *block = get_cached_block(cache, blockNumber, &allocated);
|
||||||
@ -2410,7 +2405,7 @@ block_cache_set_dirty(void *_cache, off_t blockNumber, bool dirty,
|
|||||||
int32 transaction)
|
int32 transaction)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
cached_block *block = (cached_block *)hash_lookup(cache->hash,
|
cached_block *block = (cached_block *)hash_lookup(cache->hash,
|
||||||
&blockNumber);
|
&blockNumber);
|
||||||
@ -2433,7 +2428,7 @@ extern "C" void
|
|||||||
block_cache_put(void *_cache, off_t blockNumber)
|
block_cache_put(void *_cache, off_t blockNumber)
|
||||||
{
|
{
|
||||||
block_cache *cache = (block_cache *)_cache;
|
block_cache *cache = (block_cache *)_cache;
|
||||||
BenaphoreLocker locker(&cache->lock);
|
MutexLocker locker(&cache->lock);
|
||||||
|
|
||||||
put_cached_block(cache, blockNumber);
|
put_cached_block(cache, blockNumber);
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ class Inode {
|
|||||||
void SetModificationTime(time_t modificationTime)
|
void SetModificationTime(time_t modificationTime)
|
||||||
{ fModificationTime = modificationTime; }
|
{ fModificationTime = modificationTime; }
|
||||||
|
|
||||||
benaphore *RequestLock() { return &fRequestLock; }
|
mutex *RequestLock() { return &fRequestLock; }
|
||||||
|
|
||||||
status_t WriteDataToBuffer(const void *data, size_t *_length,
|
status_t WriteDataToBuffer(const void *data, size_t *_length,
|
||||||
bool nonBlocking);
|
bool nonBlocking);
|
||||||
@ -168,7 +168,7 @@ class Inode {
|
|||||||
ReadRequestList fReadRequests;
|
ReadRequestList fReadRequests;
|
||||||
WriteRequestList fWriteRequests;
|
WriteRequestList fWriteRequests;
|
||||||
|
|
||||||
benaphore fRequestLock;
|
mutex fRequestLock;
|
||||||
|
|
||||||
ConditionVariable fWriteCondition;
|
ConditionVariable fWriteCondition;
|
||||||
|
|
||||||
@ -306,7 +306,7 @@ Inode::Inode()
|
|||||||
fWriteSelectSyncPool(NULL)
|
fWriteSelectSyncPool(NULL)
|
||||||
{
|
{
|
||||||
fWriteCondition.Publish(this, "pipe");
|
fWriteCondition.Publish(this, "pipe");
|
||||||
benaphore_init(&fRequestLock, "pipe request");
|
mutex_init(&fRequestLock, "pipe request");
|
||||||
|
|
||||||
fCreationTime = fModificationTime = time(NULL);
|
fCreationTime = fModificationTime = time(NULL);
|
||||||
}
|
}
|
||||||
@ -315,22 +315,18 @@ Inode::Inode()
|
|||||||
Inode::~Inode()
|
Inode::~Inode()
|
||||||
{
|
{
|
||||||
fWriteCondition.Unpublish();
|
fWriteCondition.Unpublish();
|
||||||
benaphore_destroy(&fRequestLock);
|
mutex_destroy(&fRequestLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Inode::InitCheck()
|
Inode::InitCheck()
|
||||||
{
|
{
|
||||||
if (fRequestLock.sem < B_OK)
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*! Writes the specified data bytes to the inode's ring buffer. The
|
||||||
Writes the specified data bytes to the inode's ring buffer. The
|
|
||||||
request lock must be held when calling this method.
|
request lock must be held when calling this method.
|
||||||
Notifies readers if necessary, so that blocking readers will get started.
|
Notifies readers if necessary, so that blocking readers will get started.
|
||||||
Returns B_OK for success, B_BAD_ADDRESS if copying from the buffer failed,
|
Returns B_OK for success, B_BAD_ADDRESS if copying from the buffer failed,
|
||||||
@ -367,9 +363,9 @@ Inode::WriteDataToBuffer(const void *_data, size_t *_length, bool nonBlocking)
|
|||||||
WriteRequest request(minToWrite);
|
WriteRequest request(minToWrite);
|
||||||
fWriteRequests.Add(&request);
|
fWriteRequests.Add(&request);
|
||||||
|
|
||||||
benaphore_unlock(&fRequestLock);
|
mutex_unlock(&fRequestLock);
|
||||||
status_t status = entry.Wait();
|
status_t status = entry.Wait();
|
||||||
benaphore_lock(&fRequestLock);
|
mutex_lock(&fRequestLock);
|
||||||
|
|
||||||
fWriteRequests.Remove(&request);
|
fWriteRequests.Remove(&request);
|
||||||
|
|
||||||
@ -475,9 +471,9 @@ Inode::WaitForReadRequest(ReadRequest &request)
|
|||||||
THREAD_BLOCK_TYPE_OTHER, "fifo read request");
|
THREAD_BLOCK_TYPE_OTHER, "fifo read request");
|
||||||
|
|
||||||
// wait
|
// wait
|
||||||
benaphore_unlock(&fRequestLock);
|
mutex_unlock(&fRequestLock);
|
||||||
status_t status = thread_block();
|
status_t status = thread_block();
|
||||||
benaphore_lock(&fRequestLock);
|
mutex_lock(&fRequestLock);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -567,7 +563,7 @@ Inode::NotifyEndClosed(bool writer)
|
|||||||
void
|
void
|
||||||
Inode::Open(int openMode)
|
Inode::Open(int openMode)
|
||||||
{
|
{
|
||||||
BenaphoreLocker locker(RequestLock());
|
MutexLocker locker(RequestLock());
|
||||||
|
|
||||||
if ((openMode & O_ACCMODE) == O_WRONLY)
|
if ((openMode & O_ACCMODE) == O_WRONLY)
|
||||||
fWriterCount++;
|
fWriterCount++;
|
||||||
@ -592,7 +588,7 @@ Inode::Close(int openMode)
|
|||||||
{
|
{
|
||||||
TRACE(("Inode::Close(openMode = %d)\n", openMode));
|
TRACE(("Inode::Close(openMode = %d)\n", openMode));
|
||||||
|
|
||||||
BenaphoreLocker locker(RequestLock());
|
MutexLocker locker(RequestLock());
|
||||||
|
|
||||||
if ((openMode & O_ACCMODE) == O_WRONLY && --fWriterCount == 0)
|
if ((openMode & O_ACCMODE) == O_WRONLY && --fWriterCount == 0)
|
||||||
NotifyEndClosed(true);
|
NotifyEndClosed(true);
|
||||||
@ -761,7 +757,7 @@ fifo_read(fs_volume *_volume, fs_vnode *_node, void *_cookie,
|
|||||||
if ((cookie->open_mode & O_RWMASK) != O_RDONLY)
|
if ((cookie->open_mode & O_RWMASK) != O_RDONLY)
|
||||||
return B_NOT_ALLOWED;
|
return B_NOT_ALLOWED;
|
||||||
|
|
||||||
BenaphoreLocker locker(inode->RequestLock());
|
MutexLocker locker(inode->RequestLock());
|
||||||
|
|
||||||
if (inode->IsActive() && inode->WriterCount() == 0) {
|
if (inode->IsActive() && inode->WriterCount() == 0) {
|
||||||
// as long there is no writer, and the pipe is empty,
|
// as long there is no writer, and the pipe is empty,
|
||||||
@ -805,7 +801,7 @@ fifo_write(fs_volume *_volume, fs_vnode *_node, void *_cookie,
|
|||||||
if ((cookie->open_mode & O_RWMASK) != O_WRONLY)
|
if ((cookie->open_mode & O_RWMASK) != O_WRONLY)
|
||||||
return B_NOT_ALLOWED;
|
return B_NOT_ALLOWED;
|
||||||
|
|
||||||
BenaphoreLocker locker(inode->RequestLock());
|
MutexLocker locker(inode->RequestLock());
|
||||||
|
|
||||||
size_t length = *_length;
|
size_t length = *_length;
|
||||||
if (length == 0)
|
if (length == 0)
|
||||||
@ -837,7 +833,7 @@ fifo_read_stat(fs_volume *volume, fs_vnode *vnode, struct ::stat *st)
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
|
||||||
BenaphoreLocker locker(fifo->RequestLock());
|
MutexLocker locker(fifo->RequestLock());
|
||||||
|
|
||||||
st->st_size = fifo->BytesAvailable();
|
st->st_size = fifo->BytesAvailable();
|
||||||
|
|
||||||
@ -909,7 +905,7 @@ fifo_select(fs_volume *_volume, fs_vnode *_node, void *_cookie,
|
|||||||
if (!inode)
|
if (!inode)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
BenaphoreLocker locker(inode->RequestLock());
|
MutexLocker locker(inode->RequestLock());
|
||||||
return inode->Select(event, sync, cookie->open_mode);
|
return inode->Select(event, sync, cookie->open_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -925,7 +921,7 @@ fifo_deselect(fs_volume *_volume, fs_vnode *_node, void *_cookie,
|
|||||||
if (!inode)
|
if (!inode)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
BenaphoreLocker locker(inode->RequestLock());
|
MutexLocker locker(inode->RequestLock());
|
||||||
return inode->Deselect(event, sync, cookie->open_mode);
|
return inode->Deselect(event, sync, cookie->open_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ static mutex sVnodeMutex;
|
|||||||
The only operation allowed while holding this lock besides getting or
|
The only operation allowed while holding this lock besides getting or
|
||||||
setting the field is inc_vnode_ref_count() on io_context::root.
|
setting the field is inc_vnode_ref_count() on io_context::root.
|
||||||
*/
|
*/
|
||||||
static benaphore sIOContextRootLock;
|
static mutex sIOContextRootLock;
|
||||||
|
|
||||||
#define VNODE_HASH_TABLE_SIZE 1024
|
#define VNODE_HASH_TABLE_SIZE 1024
|
||||||
static hash_table *sVnodeTable;
|
static hash_table *sVnodeTable;
|
||||||
@ -1468,7 +1468,7 @@ replace_vnode_if_disconnected(struct fs_mount* mount,
|
|||||||
struct vnode* fallBack, bool lockRootLock)
|
struct vnode* fallBack, bool lockRootLock)
|
||||||
{
|
{
|
||||||
if (lockRootLock)
|
if (lockRootLock)
|
||||||
benaphore_lock(&sIOContextRootLock);
|
mutex_lock(&sIOContextRootLock);
|
||||||
|
|
||||||
struct vnode* obsoleteVnode = NULL;
|
struct vnode* obsoleteVnode = NULL;
|
||||||
|
|
||||||
@ -1487,7 +1487,7 @@ replace_vnode_if_disconnected(struct fs_mount* mount,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lockRootLock)
|
if (lockRootLock)
|
||||||
benaphore_unlock(&sIOContextRootLock);
|
mutex_unlock(&sIOContextRootLock);
|
||||||
|
|
||||||
if (obsoleteVnode != NULL)
|
if (obsoleteVnode != NULL)
|
||||||
put_vnode(obsoleteVnode);
|
put_vnode(obsoleteVnode);
|
||||||
@ -1601,13 +1601,13 @@ get_root_vnode(bool kernel)
|
|||||||
// Get current working directory from io context
|
// Get current working directory from io context
|
||||||
struct io_context* context = get_current_io_context(kernel);
|
struct io_context* context = get_current_io_context(kernel);
|
||||||
|
|
||||||
benaphore_lock(&sIOContextRootLock);
|
mutex_lock(&sIOContextRootLock);
|
||||||
|
|
||||||
struct vnode* root = context->root;
|
struct vnode* root = context->root;
|
||||||
if (root != NULL)
|
if (root != NULL)
|
||||||
inc_vnode_ref_count(root);
|
inc_vnode_ref_count(root);
|
||||||
|
|
||||||
benaphore_unlock(&sIOContextRootLock);
|
mutex_unlock(&sIOContextRootLock);
|
||||||
|
|
||||||
if (root != NULL)
|
if (root != NULL)
|
||||||
return root;
|
return root;
|
||||||
@ -1971,10 +1971,10 @@ vnode_path_to_vnode(struct vnode *vnode, char *path, bool traverseLeafLink,
|
|||||||
while (*++path == '/')
|
while (*++path == '/')
|
||||||
;
|
;
|
||||||
|
|
||||||
benaphore_lock(&sIOContextRootLock);
|
mutex_lock(&sIOContextRootLock);
|
||||||
vnode = ioContext->root;
|
vnode = ioContext->root;
|
||||||
inc_vnode_ref_count(vnode);
|
inc_vnode_ref_count(vnode);
|
||||||
benaphore_unlock(&sIOContextRootLock);
|
mutex_unlock(&sIOContextRootLock);
|
||||||
|
|
||||||
absoluteSymlink = true;
|
absoluteSymlink = true;
|
||||||
}
|
}
|
||||||
@ -4156,11 +4156,11 @@ vfs_new_io_context(void *_parentContext)
|
|||||||
|
|
||||||
mutex_lock(&parentContext->io_mutex);
|
mutex_lock(&parentContext->io_mutex);
|
||||||
|
|
||||||
benaphore_lock(&sIOContextRootLock);
|
mutex_lock(&sIOContextRootLock);
|
||||||
context->root = parentContext->root;
|
context->root = parentContext->root;
|
||||||
if (context->root)
|
if (context->root)
|
||||||
inc_vnode_ref_count(context->root);
|
inc_vnode_ref_count(context->root);
|
||||||
benaphore_unlock(&sIOContextRootLock);
|
mutex_unlock(&sIOContextRootLock);
|
||||||
|
|
||||||
context->cwd = parentContext->cwd;
|
context->cwd = parentContext->cwd;
|
||||||
if (context->cwd)
|
if (context->cwd)
|
||||||
@ -4413,9 +4413,7 @@ vfs_init(kernel_args *args)
|
|||||||
mutex_init(&sMountMutex, "vfs_mount_lock");
|
mutex_init(&sMountMutex, "vfs_mount_lock");
|
||||||
mutex_init(&sVnodeCoveredByMutex, "vfs_vnode_covered_by_lock");
|
mutex_init(&sVnodeCoveredByMutex, "vfs_vnode_covered_by_lock");
|
||||||
mutex_init(&sVnodeMutex, "vfs_vnode_lock");
|
mutex_init(&sVnodeMutex, "vfs_vnode_lock");
|
||||||
|
mutex_init(&sIOContextRootLock, "io_context::root lock");
|
||||||
if (benaphore_init(&sIOContextRootLock, "io_context::root lock") < 0)
|
|
||||||
panic("vfs_init: error allocating io_context::root lock\n");
|
|
||||||
|
|
||||||
if (block_cache_init() != B_OK)
|
if (block_cache_init() != B_OK)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
@ -6470,9 +6468,9 @@ fs_mount(char *path, const char *device, const char *fsName, uint32 flags,
|
|||||||
|
|
||||||
if (!sRoot) {
|
if (!sRoot) {
|
||||||
sRoot = mount->root_vnode;
|
sRoot = mount->root_vnode;
|
||||||
benaphore_lock(&sIOContextRootLock);
|
mutex_lock(&sIOContextRootLock);
|
||||||
get_current_io_context(true)->root = sRoot;
|
get_current_io_context(true)->root = sRoot;
|
||||||
benaphore_unlock(&sIOContextRootLock);
|
mutex_unlock(&sIOContextRootLock);
|
||||||
inc_vnode_ref_count(sRoot);
|
inc_vnode_ref_count(sRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8705,10 +8703,10 @@ _user_change_root(const char *userPath)
|
|||||||
|
|
||||||
// set the new root
|
// set the new root
|
||||||
struct io_context* context = get_current_io_context(false);
|
struct io_context* context = get_current_io_context(false);
|
||||||
benaphore_lock(&sIOContextRootLock);
|
mutex_lock(&sIOContextRootLock);
|
||||||
struct vnode* oldRoot = context->root;
|
struct vnode* oldRoot = context->root;
|
||||||
context->root = vnode;
|
context->root = vnode;
|
||||||
benaphore_unlock(&sIOContextRootLock);
|
mutex_unlock(&sIOContextRootLock);
|
||||||
|
|
||||||
put_vnode(oldRoot);
|
put_vnode(oldRoot);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user