summaryrefslogtreecommitdiffstats
path: root/cpukit/libblock
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-08-25 08:44:14 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-08-25 08:44:14 +0000
commitd4d6bd813f1dce6837004b2e7ce7cca8289331ab (patch)
tree60a906d7cbab67f009ebec99a21090b9cf2081e8 /cpukit/libblock
parent2010-08-25 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-d4d6bd813f1dce6837004b2e7ce7cca8289331ab.tar.bz2
2010-08-25 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libblock/include/rtems/media.h, libblock/src/media-server.c: Use chains instead of a message queue.
Diffstat (limited to 'cpukit/libblock')
-rw-r--r--cpukit/libblock/include/rtems/media.h10
-rw-r--r--cpukit/libblock/src/media-server.c124
2 files changed, 62 insertions, 72 deletions
diff --git a/cpukit/libblock/include/rtems/media.h b/cpukit/libblock/include/rtems/media.h
index df37342fd6..038357c16d 100644
--- a/cpukit/libblock/include/rtems/media.h
+++ b/cpukit/libblock/include/rtems/media.h
@@ -387,9 +387,6 @@ rtems_status_code rtems_media_post_event(
* It creates a server task with the @a priority, @a stack_size, @a modes, and
* @a attributes parameters.
*
- * A message queue will be used for communication with the server task which
- * may buffer up to @a message_count messages.
- *
* Calling this function more than once will have no effects. There is no
* protection against concurrent access.
*
@@ -400,8 +397,7 @@ rtems_status_code rtems_media_server_initialize(
rtems_task_priority priority,
size_t stack_size,
rtems_mode modes,
- rtems_attribute attributes,
- uint32_t message_count
+ rtems_attribute attributes
);
/**
@@ -410,8 +406,8 @@ rtems_status_code rtems_media_server_initialize(
* @see See rtems_media_post_event().
*
* @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_UNSATISFIED Message queue is full.
- * @retval RTEMS_NO_MEMORY Not enough memory for the message.
+ * @retval RTEMS_NO_MEMORY Not enough resources to notify the media server.
+ * @retval RTEMS_NOT_CONFIGURED Media server is not initialized.
*/
rtems_status_code rtems_media_server_post_event(
rtems_media_event event,
diff --git a/cpukit/libblock/src/media-server.c b/cpukit/libblock/src/media-server.c
index 85b2a6db08..66f46abee9 100644
--- a/cpukit/libblock/src/media-server.c
+++ b/cpukit/libblock/src/media-server.c
@@ -21,91 +21,83 @@
*/
#include <string.h>
-#include <stdio.h>
#include <stdlib.h>
+#include <assert.h>
#include <rtems.h>
#include <rtems/chain.h>
-
#include <rtems/media.h>
+#define EVENT RTEMS_EVENT_13
+
typedef struct {
+ rtems_chain_node node;
rtems_media_event event;
- char *src;
+ const char *src;
rtems_media_worker worker;
- void *arg;
-} media_server_event;
+ void *worker_arg;
+} message;
+
+static RTEMS_CHAIN_DEFINE_EMPTY(message_chain);
-static rtems_id message_queue_id = RTEMS_ID_NONE;
+static rtems_id server_id = RTEMS_ID_NONE;
-static void rtems_media_server(rtems_task_argument arg __attribute__((unused)))
+static void media_server(rtems_task_argument arg __attribute__((unused)))
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
while (true) {
- media_server_event msg;
- size_t msg_size = sizeof(msg);
-
- sc = rtems_message_queue_receive(
- message_queue_id,
- &msg,
- &msg_size,
- RTEMS_WAIT,
- RTEMS_NO_TIMEOUT
- );
- if (sc != RTEMS_SUCCESSFUL) {
- break;
- }
+ message *msg = NULL;
- rtems_media_post_event(msg.event, msg.src, NULL, msg.worker, msg.arg);
+ sc = rtems_chain_get_with_wait(
+ &message_chain,
+ EVENT,
+ RTEMS_NO_TIMEOUT,
+ (rtems_chain_node **) &msg
+ );
+ assert(sc == RTEMS_SUCCESSFUL);
+ assert(msg != NULL);
+
+ rtems_media_post_event(
+ msg->event,
+ msg->src,
+ NULL,
+ msg->worker,
+ msg->worker_arg
+ );
- free(msg.src);
+ free(msg);
}
-
- rtems_task_delete(RTEMS_SELF);
}
rtems_status_code rtems_media_server_initialize(
rtems_task_priority priority,
size_t stack_size,
rtems_mode modes,
- rtems_attribute attributes,
- uint32_t message_count
+ rtems_attribute attributes
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- rtems_id task_id = RTEMS_ID_NONE;
- if (message_queue_id == RTEMS_ID_NONE) {
+ if (server_id == RTEMS_ID_NONE) {
sc = rtems_media_initialize();
if (sc != RTEMS_SUCCESSFUL) {
goto error;
}
- sc = rtems_message_queue_create(
- rtems_build_name('M', 'D', 'I', 'A'),
- message_count,
- sizeof(media_server_event),
- RTEMS_DEFAULT_ATTRIBUTES,
- &message_queue_id
- );
- if (sc != RTEMS_SUCCESSFUL) {
- goto error;
- }
-
sc = rtems_task_create(
rtems_build_name('M', 'D', 'I', 'A'),
priority,
stack_size,
modes,
attributes,
- &task_id
+ &server_id
);
if (sc != RTEMS_SUCCESSFUL) {
goto error;
}
- sc = rtems_task_start(task_id, rtems_media_server, 0);
+ sc = rtems_task_start(server_id, media_server, 0);
if (sc != RTEMS_SUCCESSFUL) {
goto error;
}
@@ -115,12 +107,10 @@ rtems_status_code rtems_media_server_initialize(
error:
- if (task_id != RTEMS_ID_NONE) {
- rtems_task_delete(task_id);
+ if (server_id != RTEMS_ID_NONE) {
+ rtems_task_delete(server_id);
}
- rtems_message_queue_delete(message_queue_id);
-
return RTEMS_NO_MEMORY;
}
@@ -128,31 +118,35 @@ rtems_status_code rtems_media_server_post_event(
rtems_media_event event,
const char *src,
rtems_media_worker worker,
- void *arg
+ void *worker_arg
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
- media_server_event msg = {
- .event = event,
- .src = strdup(src),
- .worker = worker,
- .arg = arg
- };
-
- if (msg.src == NULL) {
- return RTEMS_NO_MEMORY;
- }
+ size_t src_size = strlen(src) + 1;
+ message *msg = malloc(sizeof(*msg) + src_size);
+
+ if (msg != NULL) {
+ char *s = (char *) msg + sizeof(*msg);
- sc = rtems_message_queue_send(
- message_queue_id,
- &msg,
- sizeof(msg)
- );
- if (sc != RTEMS_SUCCESSFUL) {
- free(msg.src);
+ memcpy(s, src, src_size);
- return RTEMS_UNSATISFIED;
+ msg->event = event;
+ msg->src = s;
+ msg->worker = worker;
+ msg->worker_arg = worker_arg;
+
+ sc = rtems_chain_append_with_notification(
+ &message_chain,
+ &msg->node,
+ server_id,
+ EVENT
+ );
+ if (sc != RTEMS_SUCCESSFUL) {
+ sc = RTEMS_NOT_CONFIGURED;
+ }
+ } else {
+ sc = RTEMS_NO_MEMORY;
}
- return RTEMS_SUCCESSFUL;
+ return sc;
}