libblock: Use self-contained mutex for media

Update #2843.
This commit is contained in:
Sebastian Huber
2018-01-02 16:47:14 +01:00
parent 868ca746c2
commit a59a61828b
2 changed files with 38 additions and 68 deletions

View File

@@ -324,7 +324,10 @@ typedef rtems_status_code (*rtems_media_worker)(
* @retval RTEMS_SUCCESSFUL Successful operation. * @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_NO_MEMORY Not enough resources. * @retval RTEMS_NO_MEMORY Not enough resources.
*/ */
rtems_status_code rtems_media_initialize(void); RTEMS_INLINE_ROUTINE rtems_status_code rtems_media_initialize(void)
{
return RTEMS_SUCCESSFUL;
}
/** /**
* @brief Adds the @a listener with argument @a listener_arg. * @brief Adds the @a listener with argument @a listener_arg.

View File

@@ -25,14 +25,15 @@
#include <assert.h> #include <assert.h>
#include <unistd.h> #include <unistd.h>
#include <rtems/media.h>
#include <rtems.h> #include <rtems.h>
#include <rtems/bdbuf.h> #include <rtems/bdbuf.h>
#include <rtems/blkdev.h> #include <rtems/blkdev.h>
#include <rtems/bdpart.h> #include <rtems/bdpart.h>
#include <rtems/libio.h> #include <rtems/libio.h>
#include <rtems/dosfs.h> #include <rtems/dosfs.h>
#include <rtems/thread.h>
#include <rtems/media.h>
typedef struct { typedef struct {
rtems_bdpart_partition *partitions; rtems_bdpart_partition *partitions;
@@ -62,26 +63,16 @@ static RTEMS_CHAIN_DEFINE_EMPTY(listener_item_chain);
static RTEMS_CHAIN_DEFINE_EMPTY(media_item_chain); static RTEMS_CHAIN_DEFINE_EMPTY(media_item_chain);
static rtems_id media_mutex = RTEMS_ID_NONE; static rtems_mutex media_mutex = RTEMS_MUTEX_INITIALIZER("Media");
static rtems_status_code lock(void) static void lock(void)
{ {
rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_mutex_lock(&media_mutex);
sc = rtems_semaphore_obtain(media_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
sc = RTEMS_NOT_CONFIGURED;
}
return sc;
} }
static void unlock(void) static void unlock(void)
{ {
rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_mutex_unlock(&media_mutex);
sc = rtems_semaphore_release(media_mutex);
assert(sc == RTEMS_SUCCESSFUL);
} }
static listener_item *find_listener( static listener_item *find_listener(
@@ -110,28 +101,28 @@ rtems_status_code rtems_media_listener_add(
) )
{ {
rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_status_code sc = RTEMS_SUCCESSFUL;
listener_item *item;
sc = lock(); lock();
if (sc == RTEMS_SUCCESSFUL) {
listener_item *item = find_listener(listener, listener_arg);
if (item == NULL) { item = find_listener(listener, listener_arg);
item = malloc(sizeof(*item));
if (item != NULL) { if (item == NULL) {
item->listener = listener; item = malloc(sizeof(*item));
item->listener_arg = listener_arg; if (item != NULL) {
rtems_chain_initialize_node(&item->node); item->listener = listener;
rtems_chain_append_unprotected(&listener_item_chain, &item->node); item->listener_arg = listener_arg;
} else { rtems_chain_initialize_node(&item->node);
sc = RTEMS_NO_MEMORY; rtems_chain_append_unprotected(&listener_item_chain, &item->node);
}
} else { } else {
sc = RTEMS_TOO_MANY; sc = RTEMS_NO_MEMORY;
} }
} else {
unlock(); sc = RTEMS_TOO_MANY;
} }
unlock();
return sc; return sc;
} }
@@ -141,21 +132,21 @@ rtems_status_code rtems_media_listener_remove(
) )
{ {
rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_status_code sc = RTEMS_SUCCESSFUL;
listener_item *item;
sc = lock(); lock();
if (sc == RTEMS_SUCCESSFUL) {
listener_item *item = find_listener(listener, listener_arg);
if (item != NULL) { item = find_listener(listener, listener_arg);
rtems_chain_extract_unprotected(&item->node);
free(item);
} else {
sc = RTEMS_INVALID_ID;
}
unlock(); if (item != NULL) {
rtems_chain_extract_unprotected(&item->node);
free(item);
} else {
sc = RTEMS_INVALID_ID;
} }
unlock();
return sc; return sc;
} }
@@ -929,10 +920,7 @@ rtems_status_code rtems_media_post_event(
{ {
rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_status_code sc = RTEMS_SUCCESSFUL;
sc = lock(); lock();
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
switch (event) { switch (event) {
case RTEMS_MEDIA_EVENT_DISK_ATTACH: case RTEMS_MEDIA_EVENT_DISK_ATTACH:
@@ -965,24 +953,3 @@ rtems_status_code rtems_media_post_event(
return sc; return sc;
} }
rtems_status_code rtems_media_initialize(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (media_mutex == RTEMS_ID_NONE) {
sc = rtems_semaphore_create(
rtems_build_name('M', 'D', 'I', 'A'),
1,
RTEMS_LOCAL | RTEMS_PRIORITY
| RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE,
0,
&media_mutex
);
if (sc != RTEMS_SUCCESSFUL) {
sc = RTEMS_NO_MEMORY;
}
}
return sc;
}