ramfs: Add lock for NodeListeners.
This is only needed on add/remove; when the lists are actually iterated we should already have a write lock.
This commit is contained in:
@@ -140,6 +140,7 @@ Volume::Volume(fs_volume* volume)
|
|||||||
fMounted(false)
|
fMounted(false)
|
||||||
{
|
{
|
||||||
rw_lock_init(&fLocker, "ramfs volume");
|
rw_lock_init(&fLocker, "ramfs volume");
|
||||||
|
recursive_lock_init(&fListenersLock, "ramfs listeners");
|
||||||
recursive_lock_init(&fIteratorLock, "ramfs iterators");
|
recursive_lock_init(&fIteratorLock, "ramfs iterators");
|
||||||
recursive_lock_init(&fAttributeIteratorLock, "ramfs attribute iterators");
|
recursive_lock_init(&fAttributeIteratorLock, "ramfs attribute iterators");
|
||||||
recursive_lock_init(&fQueryLocker, "ramfs queries");
|
recursive_lock_init(&fQueryLocker, "ramfs queries");
|
||||||
@@ -153,6 +154,7 @@ Volume::~Volume()
|
|||||||
recursive_lock_destroy(&fAttributeIteratorLock);
|
recursive_lock_destroy(&fAttributeIteratorLock);
|
||||||
recursive_lock_destroy(&fIteratorLock);
|
recursive_lock_destroy(&fIteratorLock);
|
||||||
recursive_lock_destroy(&fQueryLocker);
|
recursive_lock_destroy(&fQueryLocker);
|
||||||
|
recursive_lock_destroy(&fListenersLock);
|
||||||
rw_lock_destroy(&fLocker);
|
rw_lock_destroy(&fLocker);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,7 +463,9 @@ Volume::AddNodeListener(NodeListener *listener, Node *node, uint32 flags)
|
|||||||
|| !(flags & NODE_LISTEN_ALL)) {
|
|| !(flags & NODE_LISTEN_ALL)) {
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the listener to the right container
|
// add the listener to the right container
|
||||||
|
RecursiveLocker locker(fListenersLock);
|
||||||
status_t error = B_OK;
|
status_t error = B_OK;
|
||||||
NodeListenerValue value(listener, node, flags);
|
NodeListenerValue value(listener, node, flags);
|
||||||
if (flags & NODE_LISTEN_ANY_NODE) {
|
if (flags & NODE_LISTEN_ANY_NODE) {
|
||||||
@@ -478,6 +482,8 @@ Volume::RemoveNodeListener(NodeListener *listener, Node *node)
|
|||||||
{
|
{
|
||||||
if (!listener)
|
if (!listener)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
RecursiveLocker locker(fListenersLock);
|
||||||
status_t error = B_OK;
|
status_t error = B_OK;
|
||||||
if (node)
|
if (node)
|
||||||
error = fNodeListeners->Remove(node, listener);
|
error = fNodeListeners->Remove(node, listener);
|
||||||
@@ -573,7 +579,9 @@ Volume::AddEntryListener(EntryListener *listener, Entry *entry, uint32 flags)
|
|||||||
|| !(flags & ENTRY_LISTEN_ALL)) {
|
|| !(flags & ENTRY_LISTEN_ALL)) {
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the listener to the right container
|
// add the listener to the right container
|
||||||
|
RecursiveLocker locker(fListenersLock);
|
||||||
status_t error = B_OK;
|
status_t error = B_OK;
|
||||||
EntryListenerValue value(listener, entry, flags);
|
EntryListenerValue value(listener, entry, flags);
|
||||||
if (flags & ENTRY_LISTEN_ANY_ENTRY) {
|
if (flags & ENTRY_LISTEN_ANY_ENTRY) {
|
||||||
@@ -590,6 +598,8 @@ Volume::RemoveEntryListener(EntryListener *listener, Entry *entry)
|
|||||||
{
|
{
|
||||||
if (!listener)
|
if (!listener)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
RecursiveLocker locker(fListenersLock);
|
||||||
status_t error = B_OK;
|
status_t error = B_OK;
|
||||||
if (entry)
|
if (entry)
|
||||||
error = fEntryListeners->Remove(entry, listener);
|
error = fEntryListeners->Remove(entry, listener);
|
||||||
|
|||||||
@@ -181,6 +181,8 @@ private:
|
|||||||
DirectoryEntryTable *fDirectoryEntryTable;
|
DirectoryEntryTable *fDirectoryEntryTable;
|
||||||
IndexDirectory *fIndexDirectory;
|
IndexDirectory *fIndexDirectory;
|
||||||
Directory *fRootDirectory;
|
Directory *fRootDirectory;
|
||||||
|
|
||||||
|
recursive_lock fListenersLock;
|
||||||
NodeListenerTree *fNodeListeners;
|
NodeListenerTree *fNodeListeners;
|
||||||
NodeListenerList fAnyNodeListeners;
|
NodeListenerList fAnyNodeListeners;
|
||||||
EntryListenerTree *fEntryListeners;
|
EntryListenerTree *fEntryListeners;
|
||||||
|
|||||||
Reference in New Issue
Block a user