diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-08-25 08:44:14 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-08-25 08:44:14 +0000 |
commit | d4d6bd813f1dce6837004b2e7ce7cca8289331ab (patch) | |
tree | 60a906d7cbab67f009ebec99a21090b9cf2081e8 /cpukit | |
parent | 2010-08-25 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-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')
-rw-r--r-- | cpukit/ChangeLog | 5 | ||||
-rw-r--r-- | cpukit/libblock/include/rtems/media.h | 10 | ||||
-rw-r--r-- | cpukit/libblock/src/media-server.c | 124 |
3 files changed, 67 insertions, 72 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index eb8db8cb42..e59f8ecda8 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,5 +1,10 @@ 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. + +2010-08-25 Sebastian Huber <sebastian.huber@embedded-brains.de> + CID 114/SECURE_CODING * libblock/src/media.c: Avoid strcpy(). 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; } |