source: rtems/c/src/librtems++/src/rtemsMessageQueue.cc @ c499856

4.115
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on Mar 20, 2014 at 9:10:47 PM

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/*
2  ------------------------------------------------------------------------
3
4  COPYRIGHT (c) 1997
5  Objective Design Systems Ltd Pty (ODS)
6  All rights reserved (R) Objective Design Systems Ltd Pty
7 
8  The license and distribution terms for this file may be found in the
9  file LICENSE in this distribution or at
10  http://www.rtems.org/license/LICENSE.
11
12  ------------------------------------------------------------------------
13
14  See header file.
15
16  ------------------------------------------------------------------------
17*/
18
19#include <cstring>
20#include <rtems++/rtemsMessageQueue.h>
21
22/* ----
23   rtemsMessageQueue
24*/
25
26rtemsMessageQueue::rtemsMessageQueue(const char* mqname,
27                                     const uint32_t count,
28                                     const size_t max_message_size,
29                                     const WaitMode wait_mode,
30                                     const Scope scope)
31  : name(0),
32    owner(true),
33    id(0)
34{
35  strcpy(name_str, "NOID");
36  create(mqname, count, max_message_size, wait_mode, scope);
37}
38
39rtemsMessageQueue::rtemsMessageQueue(const char *mqname,
40                                     const uint32_t node)
41  : name(0),
42    owner(false),
43    id(0)
44{
45  strcpy(name_str, "NOID");
46  connect(mqname, node);
47}
48
49rtemsMessageQueue::rtemsMessageQueue(const rtemsMessageQueue& message_queue)
50  : name(0),
51    owner(false),
52    id(0)
53{
54  name = message_queue.name;
55  strcpy(name_str, message_queue.name_str);
56  id = message_queue.id;
57}
58
59rtemsMessageQueue::rtemsMessageQueue()
60  : name(0),
61    owner(false),
62    id(0)
63{
64  strcpy(name_str, "NOID");
65}
66
67rtemsMessageQueue::~rtemsMessageQueue()
68{
69  destroy();
70}
71
72void rtemsMessageQueue::make_invalid()
73{
74  strcpy(name_str, "NOID");
75  name = 0;
76  id = 0;
77  owner = false;
78}
79
80const rtems_status_code rtemsMessageQueue::create(const char* mqname,
81                                                  const uint32_t count,
82                                                  const size_t max_message_size,
83                                                  const WaitMode wait_mode,
84                                                  const Scope scope)
85{
86  if (id)
87    return set_status_code(RTEMS_ILLEGAL_ON_SELF);
88
89  owner = true;
90 
91  strcpy(name_str, "    ");
92  for (int c = 0; (c < 4) && (mqname[c] != '\0'); c++)
93    name_str[c] = mqname[c];
94  name = rtems_build_name(name_str[0],
95                          name_str[1],
96                          name_str[2],
97                          name_str[3]);
98 
99  set_status_code(rtems_message_queue_create(name,
100                                             count,
101                                             max_message_size,
102                                             scope | wait_mode,
103                                             &id));
104
105  if (unsuccessful())
106  {
107    make_invalid();
108  }
109 
110  return last_status_code();
111}
112
113const rtems_status_code rtemsMessageQueue::destroy()
114{
115  if (id && owner)
116  {
117    set_status_code(rtems_message_queue_delete(id));
118    make_invalid();
119  }
120  else
121    set_status_code(RTEMS_NOT_OWNER_OF_RESOURCE);
122 
123  return last_status_code();
124}
125
126const rtemsMessageQueue& rtemsMessageQueue::operator=(const rtemsMessageQueue& message_queue)
127{
128  if (!owner)
129  {
130    name = message_queue.name;
131    strcpy(name_str, message_queue.name_str);
132    id = message_queue.id;
133  }
134
135  return *this;
136}
137 
138const rtems_status_code rtemsMessageQueue::connect(const char *mqname,
139                                                   const uint32_t node)
140{
141  if (id && owner)
142    return set_status_code(RTEMS_UNSATISFIED);
143
144  // change state to not owner
145  owner = false;
146 
147  strcpy(name_str, "    ");
148  for (int c = 0; (c < 4) && (mqname[c] != '\0'); c++)
149    name_str[c] = mqname[c];
150  name = rtems_build_name(name_str[0],
151                          name_str[1],
152                          name_str[2],
153                          name_str[3]);
154 
155  set_status_code(rtems_message_queue_ident(name, node, &id));
156
157  if (unsuccessful())
158  {
159    make_invalid();
160  }
161 
162  return last_status_code();
163}
Note: See TracBrowser for help on using the repository browser.