Changeset a59a6182 in rtems


Ignore:
Timestamp:
Jan 2, 2018, 3:47:14 PM (19 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
0a593c2d
Parents:
868ca746
git-author:
Sebastian Huber <sebastian.huber@…> (01/02/18 15:47:14)
git-committer:
Sebastian Huber <sebastian.huber@…> (02/07/18 07:58:30)
Message:

libblock: Use self-contained mutex for media

Update #2843.

Location:
cpukit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpukit/include/rtems/media.h

    r868ca746 ra59a6182  
    325325 * @retval RTEMS_NO_MEMORY Not enough resources.
    326326 */
    327 rtems_status_code rtems_media_initialize(void);
     327RTEMS_INLINE_ROUTINE rtems_status_code rtems_media_initialize(void)
     328{
     329  return RTEMS_SUCCESSFUL;
     330}
    328331
    329332/**
  • cpukit/libblock/src/media.c

    r868ca746 ra59a6182  
    2626#include <unistd.h>
    2727
     28#include <rtems/media.h>
     29
    2830#include <rtems.h>
    2931#include <rtems/bdbuf.h>
     
    3234#include <rtems/libio.h>
    3335#include <rtems/dosfs.h>
    34 
    35 #include <rtems/media.h>
     36#include <rtems/thread.h>
    3637
    3738typedef struct {
     
    6364static RTEMS_CHAIN_DEFINE_EMPTY(media_item_chain);
    6465
    65 static rtems_id media_mutex = RTEMS_ID_NONE;
    66 
    67 static rtems_status_code lock(void)
    68 {
    69   rtems_status_code sc = RTEMS_SUCCESSFUL;
    70 
    71   sc = rtems_semaphore_obtain(media_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
    72   if (sc != RTEMS_SUCCESSFUL) {
    73     sc = RTEMS_NOT_CONFIGURED;
    74   }
    75 
    76   return sc;
     66static rtems_mutex media_mutex = RTEMS_MUTEX_INITIALIZER("Media");
     67
     68static void lock(void)
     69{
     70  rtems_mutex_lock(&media_mutex);
    7771}
    7872
    7973static void unlock(void)
    8074{
    81   rtems_status_code sc = RTEMS_SUCCESSFUL;
    82 
    83   sc = rtems_semaphore_release(media_mutex);
    84   assert(sc == RTEMS_SUCCESSFUL);
     75  rtems_mutex_unlock(&media_mutex);
    8576}
    8677
     
    111102{
    112103  rtems_status_code sc = RTEMS_SUCCESSFUL;
    113 
    114   sc = lock();
    115   if (sc == RTEMS_SUCCESSFUL) {
    116     listener_item *item = find_listener(listener, listener_arg);
    117 
    118     if (item == NULL) {
    119       item = malloc(sizeof(*item));
    120       if (item != NULL) {
    121         item->listener = listener;
    122         item->listener_arg = listener_arg;
    123         rtems_chain_initialize_node(&item->node);
    124         rtems_chain_append_unprotected(&listener_item_chain, &item->node);
    125       } else {
    126         sc = RTEMS_NO_MEMORY;
    127       }
     104  listener_item *item;
     105
     106  lock();
     107
     108  item = find_listener(listener, listener_arg);
     109
     110  if (item == NULL) {
     111    item = malloc(sizeof(*item));
     112    if (item != NULL) {
     113      item->listener = listener;
     114      item->listener_arg = listener_arg;
     115      rtems_chain_initialize_node(&item->node);
     116      rtems_chain_append_unprotected(&listener_item_chain, &item->node);
    128117    } else {
    129       sc = RTEMS_TOO_MANY;
    130     }
    131 
    132     unlock();
    133   }
     118      sc = RTEMS_NO_MEMORY;
     119    }
     120  } else {
     121    sc = RTEMS_TOO_MANY;
     122  }
     123
     124  unlock();
    134125
    135126  return sc;
     
    142133{
    143134  rtems_status_code sc = RTEMS_SUCCESSFUL;
    144 
    145   sc = lock();
    146   if (sc == RTEMS_SUCCESSFUL) {
    147     listener_item *item = find_listener(listener, listener_arg);
    148 
    149     if (item != NULL) {
    150       rtems_chain_extract_unprotected(&item->node);
    151       free(item);
    152     } else {
    153       sc = RTEMS_INVALID_ID;
    154     }
    155 
    156     unlock();
    157   }
     135  listener_item *item;
     136
     137  lock();
     138
     139  item = find_listener(listener, listener_arg);
     140
     141  if (item != NULL) {
     142    rtems_chain_extract_unprotected(&item->node);
     143    free(item);
     144  } else {
     145    sc = RTEMS_INVALID_ID;
     146  }
     147
     148  unlock();
    158149
    159150  return sc;
     
    930921  rtems_status_code sc = RTEMS_SUCCESSFUL;
    931922
    932   sc = lock();
    933   if (sc != RTEMS_SUCCESSFUL) {
    934     return sc;
    935   }
     923  lock();
    936924
    937925  switch (event) {
     
    966954  return sc;
    967955}
    968 
    969 rtems_status_code rtems_media_initialize(void)
    970 {
    971   rtems_status_code sc = RTEMS_SUCCESSFUL;
    972 
    973   if (media_mutex == RTEMS_ID_NONE) {
    974     sc = rtems_semaphore_create(
    975       rtems_build_name('M', 'D', 'I', 'A'),
    976       1,
    977       RTEMS_LOCAL | RTEMS_PRIORITY
    978         | RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE,
    979       0,
    980       &media_mutex
    981     );
    982     if (sc != RTEMS_SUCCESSFUL) {
    983       sc = RTEMS_NO_MEMORY;
    984     }
    985   }
    986 
    987   return sc;
    988 }
Note: See TracChangeset for help on using the changeset viewer.