libblock: Add SMP support

This commit is contained in:
Sebastian Huber
2013-08-14 11:06:02 +02:00
parent 4180a9bb04
commit 9de9b7d237

View File

@@ -57,6 +57,8 @@ static rtems_id diskdevs_mutex;
*/ */
static volatile bool diskdevs_protected; static volatile bool diskdevs_protected;
static rtems_interrupt_lock diskdevs_lock;
static rtems_status_code static rtems_status_code
disk_lock(void) disk_lock(void)
{ {
@@ -435,13 +437,13 @@ rtems_disk_obtain(dev_t dev)
rtems_disk_device *dd = NULL; rtems_disk_device *dd = NULL;
rtems_interrupt_level level; rtems_interrupt_level level;
rtems_interrupt_disable(level); rtems_interrupt_lock_acquire(&diskdevs_lock, level);
if (!diskdevs_protected) { if (!diskdevs_protected) {
/* Frequent and quickest case */ /* Frequent and quickest case */
dd = get_disk_entry(dev, false); dd = get_disk_entry(dev, false);
rtems_interrupt_enable(level); rtems_interrupt_lock_release(&diskdevs_lock, level);
} else { } else {
rtems_interrupt_enable(level); rtems_interrupt_lock_release(&diskdevs_lock, level);
sc = disk_lock(); sc = disk_lock();
if (sc == RTEMS_SUCCESSFUL) { if (sc == RTEMS_SUCCESSFUL) {
@@ -461,10 +463,10 @@ rtems_disk_release(rtems_disk_device *dd)
unsigned uses = 0; unsigned uses = 0;
bool deleted = false; bool deleted = false;
rtems_interrupt_disable(level); rtems_interrupt_lock_acquire(&diskdevs_lock, level);
uses = --dd->uses; uses = --dd->uses;
deleted = dd->deleted; deleted = dd->deleted;
rtems_interrupt_enable(level); rtems_interrupt_lock_release(&diskdevs_lock, level);
if (uses == 0 && deleted) { if (uses == 0 && deleted) {
rtems_disk_delete(dev); rtems_disk_delete(dev);