[PATCH 3/3] libblock: Use beacon instead of events
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Oct 16 14:45:29 UTC 2012
The usage of events for transfer and synchronization requests is bad
because this may interfere with the event usage of application tasks.
Typical errors result in stack corruption.
---
cpukit/libblock/src/bdbuf.c | 27 ++++++++++++++++++++++-----
1 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/cpukit/libblock/src/bdbuf.c b/cpukit/libblock/src/bdbuf.c
index 3f4915b..70c7ba0 100644
--- a/cpukit/libblock/src/bdbuf.c
+++ b/cpukit/libblock/src/bdbuf.c
@@ -181,12 +181,13 @@ typedef struct rtems_bdbuf_cache
#define RTEMS_BLKDEV_FATAL_BDBUF_STATE_1 RTEMS_BLKDEV_FATAL_ERROR(29)
#define RTEMS_BLKDEV_FATAL_BDBUF_STATE_2 RTEMS_BLKDEV_FATAL_ERROR(30)
#define RTEMS_BLKDEV_FATAL_BDBUF_RA_WAKE_UP RTEMS_BLKDEV_FATAL_ERROR(31)
+#define RTEMS_BLKDEV_FATAL_BDBUF_WATCH_BEACON RTEMS_BLKDEV_FATAL_ERROR(32)
+#define RTEMS_BLKDEV_FATAL_BDBUF_CLEAR_BEACON RTEMS_BLKDEV_FATAL_ERROR(33)
/**
* The events used in this code. These should be system events rather than
* application events.
*/
-#define RTEMS_BDBUF_TRANSFER_SYNC RTEMS_EVENT_1
#define RTEMS_BDBUF_SWAPOUT_SYNC RTEMS_EVENT_2
#define RTEMS_BDBUF_READ_AHEAD_WAKE_UP RTEMS_EVENT_1
@@ -1549,6 +1550,22 @@ rtems_bdbuf_wait_for_event (rtems_event_set event)
}
static void
+rtems_bdbuf_wait_for_beacon (rtems_id *task_id)
+{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+
+ sc = rtems_beacon_watch (RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ if (sc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred (RTEMS_BLKDEV_FATAL_BDBUF_WATCH_BEACON);
+
+ *task_id = 0;
+
+ sc = rtems_beacon_clear ();
+ if (sc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred (RTEMS_BLKDEV_FATAL_BDBUF_CLEAR_BEACON);
+}
+
+static void
rtems_bdbuf_wait_for_access (rtems_bdbuf_buffer *bd)
{
while (true)
@@ -1867,7 +1884,7 @@ rtems_bdbuf_transfer_done (void* arg, rtems_status_code status)
req->status = status;
- rtems_event_send (req->io_task, RTEMS_BDBUF_TRANSFER_SYNC);
+ rtems_beacon_signal (req->io_task);
}
static rtems_status_code
@@ -1888,7 +1905,7 @@ rtems_bdbuf_execute_transfer_request (rtems_disk_device *dd,
if (result == 0)
{
- rtems_bdbuf_wait_for_event (RTEMS_BDBUF_TRANSFER_SYNC);
+ rtems_bdbuf_wait_for_beacon (&req->io_task);
sc = req->status;
}
else
@@ -2268,7 +2285,7 @@ rtems_bdbuf_syncdev (rtems_disk_device *dd)
rtems_bdbuf_wake_swapper ();
rtems_bdbuf_unlock_cache ();
- rtems_bdbuf_wait_for_event (RTEMS_BDBUF_TRANSFER_SYNC);
+ rtems_bdbuf_wait_for_beacon (&bdbuf_cache.sync_requester);
rtems_bdbuf_unlock_sync ();
return RTEMS_SUCCESSFUL;
@@ -2617,7 +2634,7 @@ rtems_bdbuf_swapout_processing (unsigned long timer_delta,
bdbuf_cache.sync_requester = 0;
rtems_bdbuf_unlock_cache ();
if (sync_requester)
- rtems_event_send (sync_requester, RTEMS_BDBUF_TRANSFER_SYNC);
+ rtems_beacon_signal (sync_requester);
}
return transfered_buffers;
--
1.7.7
More information about the devel
mailing list