[PATCH 12/45] Filesystem: Use lock for deferred release
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri May 15 11:41:12 UTC 2015
---
cpukit/libcsupport/src/sup_fs_location.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/cpukit/libcsupport/src/sup_fs_location.c b/cpukit/libcsupport/src/sup_fs_location.c
index 545dfe1..ddda4d1 100644
--- a/cpukit/libcsupport/src/sup_fs_location.c
+++ b/cpukit/libcsupport/src/sup_fs_location.c
@@ -6,10 +6,10 @@
*/
/*
- * Copyright (c) 2012 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2012-2015 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
- * Obere Lagerstr. 30
+ * Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems at embedded-brains.de>
@@ -31,6 +31,12 @@
rtems_interrupt_lock rtems_filesystem_mt_entry_lock_control =
RTEMS_INTERRUPT_LOCK_INITIALIZER("mount table entry");
+RTEMS_INTERRUPT_LOCK_DEFINE(
+ static,
+ deferred_release_lock,
+ "Filesystem Deferred Release"
+)
+
static rtems_filesystem_global_location_t *deferred_released_global_locations;
rtems_filesystem_location_info_t *rtems_filesystem_location_copy(
@@ -134,9 +140,10 @@ static void deferred_release(void)
rtems_filesystem_global_location_t *current = NULL;
do {
+ rtems_interrupt_lock_context lock_context;
int count = 0;
- _Thread_Disable_dispatch();
+ rtems_interrupt_lock_acquire(&deferred_release_lock, &lock_context);
current = deferred_released_global_locations;
if (current != NULL) {
deferred_released_global_locations = current->deferred_released_next;
@@ -144,7 +151,7 @@ static void deferred_release(void)
current->deferred_released_next = NULL;
current->deferred_released_count = 0;
}
- _Thread_Enable_dispatch();
+ rtems_interrupt_lock_release(&deferred_release_lock, &lock_context);
if (current != NULL) {
release_with_count(current, count);
@@ -182,6 +189,10 @@ void rtems_filesystem_global_location_release(
if (_Thread_Dispatch_is_enabled()) {
release_with_count(global_loc, 1);
} else {
+ rtems_interrupt_lock_context lock_context;
+
+ rtems_interrupt_lock_acquire(&deferred_release_lock, &lock_context);
+
if (global_loc->deferred_released_count == 0) {
rtems_filesystem_global_location_t *head =
deferred_released_global_locations;
@@ -192,6 +203,8 @@ void rtems_filesystem_global_location_release(
} else {
++global_loc->deferred_released_count;
}
+
+ rtems_interrupt_lock_release(&deferred_release_lock, &lock_context);
}
}
--
1.8.4.5
More information about the devel
mailing list