summaryrefslogtreecommitdiffstats
path: root/c/src/lib/librtems++/rtemsMessageQueue.cc
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1997-07-31 22:13:29 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1997-07-31 22:13:29 +0000
commit0074691a67f857c9b3f880fb581e0af1d5673337 (patch)
treef80fd23129ad62236ee4f64eeaf537f53bbaa0b8 /c/src/lib/librtems++/rtemsMessageQueue.cc
parentMerged very large and much appreciated patch from Chris Johns (diff)
downloadrtems-0074691a67f857c9b3f880fb581e0af1d5673337.tar.bz2
Merged very large and much appreciated patch from Chris Johns
<cjohns@plessey.com.au>. This patch includes the ods68302 bsp, the RTEMS++ class library, and the rtems++ test.
Diffstat (limited to 'c/src/lib/librtems++/rtemsMessageQueue.cc')
-rw-r--r--c/src/lib/librtems++/rtemsMessageQueue.cc164
1 files changed, 164 insertions, 0 deletions
diff --git a/c/src/lib/librtems++/rtemsMessageQueue.cc b/c/src/lib/librtems++/rtemsMessageQueue.cc
new file mode 100644
index 0000000000..1978e1c6ec
--- /dev/null
+++ b/c/src/lib/librtems++/rtemsMessageQueue.cc
@@ -0,0 +1,164 @@
+/*
+ ------------------------------------------------------------------------
+ $Id$
+ ------------------------------------------------------------------------
+
+ COPYRIGHT (c) 1997
+ Objective Design Systems Ltd Pty (ODS)
+ All rights reserved (R) Objective Design Systems Ltd Pty
+
+ The license and distribution terms for this file may be found in the
+ file LICENSE in this distribution or at
+ http://www.OARcorp.com/rtems/license.html.
+
+ ------------------------------------------------------------------------
+
+ See header file.
+
+ ------------------------------------------------------------------------
+*/
+
+#include <rtems++/rtemsMessageQueue.h>
+
+/* ----
+ rtemsMessageQueue
+*/
+
+rtemsMessageQueue::rtemsMessageQueue(const char* mqname,
+ const rtems_unsigned32 count,
+ const rtems_unsigned32 max_message_size,
+ const WaitMode wait_mode,
+ const Scope scope)
+ : name(0),
+ owner(true),
+ id(0)
+{
+ strcpy(name_str, "NOID");
+ create(mqname, count, max_message_size, wait_mode, scope);
+}
+
+rtemsMessageQueue::rtemsMessageQueue(const char *mqname,
+ const rtems_unsigned32 node)
+ : name(0),
+ owner(false),
+ id(0)
+{
+ strcpy(name_str, "NOID");
+ connect(mqname, node);
+}
+
+rtemsMessageQueue::rtemsMessageQueue(const rtemsMessageQueue& message_queue)
+ : name(0),
+ owner(false),
+ id(0)
+{
+ name = message_queue.name;
+ strcpy(name_str, message_queue.name_str);
+ id = message_queue.id;
+}
+
+rtemsMessageQueue::rtemsMessageQueue()
+ : name(0),
+ owner(false),
+ id(0)
+{
+ strcpy(name_str, "NOID");
+}
+
+rtemsMessageQueue::~rtemsMessageQueue()
+{
+ destroy();
+}
+
+void rtemsMessageQueue::make_invalid()
+{
+ strcpy(name_str, "NOID");
+ name = 0;
+ id = 0;
+ owner = false;
+}
+
+const rtems_status_code rtemsMessageQueue::create(const char* mqname,
+ const rtems_unsigned32 count,
+ const rtems_unsigned32 max_message_size,
+ const WaitMode wait_mode,
+ const Scope scope)
+{
+ if (id)
+ return set_status_code(RTEMS_ILLEGAL_ON_SELF);
+
+ owner = true;
+
+ strcpy(name_str, " ");
+ for (int c = 0; (c < 4) && (mqname[c] != '\0'); c++)
+ name_str[c] = mqname[c];
+ name = rtems_build_name(name_str[0],
+ name_str[1],
+ name_str[2],
+ name_str[3]);
+
+ set_status_code(rtems_message_queue_create(name,
+ count,
+ max_message_size,
+ scope | wait_mode,
+ &id));
+
+ if (unsuccessful())
+ {
+ make_invalid();
+ }
+
+ return last_status_code();
+}
+
+const rtems_status_code rtemsMessageQueue::destroy()
+{
+ if (id && owner)
+ {
+ set_status_code(rtems_message_queue_delete(id));
+ make_invalid();
+ }
+ else
+ set_status_code(RTEMS_NOT_OWNER_OF_RESOURCE);
+
+ return last_status_code();
+}
+
+const rtemsMessageQueue& rtemsMessageQueue::operator=(const rtemsMessageQueue& message_queue)
+{
+ if (!owner)
+ {
+ name = message_queue.name;
+ strcpy(name_str, message_queue.name_str);
+ id = message_queue.id;
+ }
+
+ return *this;
+}
+
+const rtems_status_code rtemsMessageQueue::connect(const char *mqname,
+ const rtems_unsigned32 node)
+{
+ if (id && owner)
+ return set_status_code(RTEMS_UNSATISFIED);
+
+ // change state to not owner
+ owner = false;
+
+ strcpy(name_str, " ");
+ for (int c = 0; (c < 4) && (mqname[c] != '\0'); c++)
+ name_str[c] = mqname[c];
+ name = rtems_build_name(name_str[0],
+ name_str[1],
+ name_str[2],
+ name_str[3]);
+
+ set_status_code(rtems_message_queue_ident(name, node, &id));
+
+ if (unsuccessful())
+ {
+ make_invalid();
+ }
+
+ return last_status_code();
+}