Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4563 → Rev 4564

/trunk/uspace/srv/bd/rd/rd.c
50,7 → 50,7
#include <async.h>
#include <align.h>
#include <async.h>
#include <futex.h>
#include <fibril_sync.h>
#include <stdio.h>
#include <devmap.h>
#include <ipc/bd.h>
63,12 → 63,12
static size_t rd_size;
 
/**
* This futex protects the ramdisk's data.
* This rwlock protects the ramdisk's data.
* If we were to serve multiple requests (read + write or several writes)
* concurrently (i.e. from two or more threads), each read and write needs to be
* protected by this futex.
* protected by this rwlock.
*/
atomic_t rd_futex = FUTEX_INITIALIZER;
fibril_rwlock_t rd_lock;
 
/** Handle one connection to ramdisk.
*
139,9 → 139,9
retval = ELIMIT;
break;
}
futex_down(&rd_futex);
fibril_rwlock_read_lock(&rd_lock);
memcpy(fs_va, rd_addr + offset * block_size, block_size);
futex_up(&rd_futex);
fibril_rwlock_read_unlock(&rd_lock);
retval = EOK;
break;
case BD_WRITE_BLOCK:
161,9 → 161,9
retval = ELIMIT;
break;
}
futex_up(&rd_futex);
fibril_rwlock_write_lock(&rd_lock);
memcpy(rd_addr + offset * block_size, fs_va, block_size);
futex_down(&rd_futex);
fibril_rwlock_write_unlock(&rd_lock);
retval = EOK;
break;
default:
216,6 → 216,8
printf(NAME ": Unable to register device\n");
return false;
}
 
fibril_rwlock_initialize(&rd_lock);
return true;
}