forked from Imagelibrary/rtems
@@ -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.
|
||||||
|
|||||||
@@ -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,10 +101,11 @@ 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);
|
item = find_listener(listener, listener_arg);
|
||||||
|
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
item = malloc(sizeof(*item));
|
item = malloc(sizeof(*item));
|
||||||
@@ -130,7 +122,6 @@ rtems_status_code rtems_media_listener_add(
|
|||||||
}
|
}
|
||||||
|
|
||||||
unlock();
|
unlock();
|
||||||
}
|
|
||||||
|
|
||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
@@ -141,10 +132,11 @@ 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);
|
item = find_listener(listener, listener_arg);
|
||||||
|
|
||||||
if (item != NULL) {
|
if (item != NULL) {
|
||||||
rtems_chain_extract_unprotected(&item->node);
|
rtems_chain_extract_unprotected(&item->node);
|
||||||
@@ -154,7 +146,6 @@ rtems_status_code rtems_media_listener_remove(
|
|||||||
}
|
}
|
||||||
|
|
||||||
unlock();
|
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;
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user