Statistics
| Branch: | Revision:

urtware / doc / activitydiagrams / publisher / urtPublisherPublish.uml @ 5198dfae

History | View | Annotate | Download (4.053 KB)

1 7491c395 Thomas Schöpping
/'
2
µRtWare is a lightweight publish/subscribe middleware for real-time
3
applications. It was developed as part of the software habitat for the
4
Autonomous Mini Robot [1] (AMiRo) but can be used for other purposes as well.
5
6
Copyright (C) 2018..2020  Thomas Schöpping et al.
7
8
This program is free software: you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation, either version 3 of the License, or
11
(at your option) any later version.
12
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
18
You should have received a copy of the GNU General Public License
19
along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
'/
21
22
/'### INTRO ##################################################################'/
23
24
@startuml
25
26
title **µRtWare**\nurtPublisherPublish()\n
27
28 ee83a495 Thomas Schöpping
/'### PARAMETERS & RETURN ####################################################'/
29 7491c395 Thomas Schöpping
30
note
31 ee83a495 Thomas Schöpping
  -- **publisher** : urt_publisher_t* --
32 7491c395 Thomas Schöpping
  Pointer to the publisher to use.
33
  Must not be ""NULL"".
34 ee83a495 Thomas Schöpping
  -- **payload** : void* --
35 7491c395 Thomas Schöpping
  Pointer to the data to be published.
36
  May be ""NULL"" for messages without payload.
37 dd31cb03 Thomas Schöpping
  -- **bytes** : size_t --
38 7491c395 Thomas Schöpping
  Size of the payload in bytes.
39 ee83a495 Thomas Schöpping
  -- **t** : urt_osTime_t --
40 7491c395 Thomas Schöpping
  Timestamp to be set for the message.
41 ee83a495 Thomas Schöpping
  -- **timeout** : urt_delay_t --
42 7491c395 Thomas Schöpping
  Timeout delay in case the message cannot be published.
43 ee83a495 Thomas Schöpping
  ====
44
  -- **return** : urt_status_t --
45
  Returns ""URT_STATUS_OK"" on success.
46 dd31cb03 Thomas Schöpping
  Returns ""URT_STATUS_PUBLISH_TIMEOUT"" on timeout.
47 ee83a495 Thomas Schöpping
endnote
48 7491c395 Thomas Schöpping
49
/'### PROCEDURE ##############################################################'/
50
51 ee83a495 Thomas Schöpping
start
52 7491c395 Thomas Schöpping
:lock topic;
53 dd31cb03 Thomas Schöpping
fork
54
  :access topic's next message;
55
fork again
56
  #EEEEEE:..//URT_CFG_PUBSUB_PROFILING == true//..\nincrement counter of publish attempts;
57
endfork
58 ee83a495 Thomas Schöpping
while (HRT consumers left for the message?) is (yes)
59
  :wait for topic's condition variable (using topic's mutex) to be signaled or timeout;
60
  if (Timeout occurred?) then (yes)
61 dd31cb03 Thomas Schöpping
    #EEEEEE:..//URT_CFG_PUBSUB_PROFILING == true//..\nincrement counter of publish fails;
62 ee83a495 Thomas Schöpping
    :unlock topic;
63
    stop
64
    note
65 dd31cb03 Thomas Schöpping
      Returns ""URT_STATUS_PUBLISH_TIMEOUT"".
66 ee83a495 Thomas Schöpping
    endnote
67 c22d21ad Thomas Schöpping
  else (no)
68 ee83a495 Thomas Schöpping
    if (Message timestamp was modified?) then (yes)
69 dd31cb03 Thomas Schöpping
      repeat
70
        :proceed to next message;
71
      repeat while (Timestamp is younger than of previous message?) is (yes)
72
      ->no;
73 ee83a495 Thomas Schöpping
    else (no)
74
    endif
75 c22d21ad Thomas Schöpping
  endif
76 7491c395 Thomas Schöpping
endwhile (no)
77 dd31cb03 Thomas Schöpping
partition "//URT_CFG_PUBSUB_PROFILING == true//" #EEEEEE {
78
  if (Consumers left for this message?) then (yes)
79
    #EEEEEE:increment counter of discarded messages (@topic);
80
  else (no)
81
  endif
82
}
83 ee83a495 Thomas Schöpping
fork
84 dd31cb03 Thomas Schöpping
  partition "setup message" {
85
    fork
86
      :iterate topic's pointer to this message;
87
    fork again
88
      :copy payload to message;
89
    fork again
90
      :set origin time of message;
91
    fork again
92
      :set number of HRT consumers (from topic);
93
    fork again
94
      #EEEEEE:..//URT_CFG_PUBSUB_PROFILING == true//..
95
       set numer of consumers (from topic);
96
    endfork
97
  }
98 ee83a495 Thomas Schöpping
fork again
99 dd31cb03 Thomas Schöpping
  #EEEEEE:..//URT_CFG_PUBSUB_QOS_RATECHECKS == true//..\nset QoS rate timer (@topic) wrt. most critical HRT subscriber;
100 ee83a495 Thomas Schöpping
fork again
101 dd31cb03 Thomas Schöpping
  partition "//URT_CFG_PUBSUB_QOS_DEADLINECHECKS == true//" #EEEEEE {
102
    #EEEEEE:access first HRT subscriber of topic;
103
    while (HRT subscriber is not ""NULL""?) is (yes)
104
      if (QoS deadline timer (@subscriber) is not armed?) then (yes)
105
        #EEEEEE:set QoS deadline timer (@subscriber) wrt. origin time of the message;
106
        note
107
          No lock required.
108
          This timer is only accessed while topic is locked.
109
        endnote
110
      else (no)
111
      endif
112
      #EEEEEE:proceed to next HRT subscriber;
113
    endwhile (no)
114
  }
115
fork again
116
  #EEEEEE:..//URT_CFG_PUBSUB_PROFILING == true//..\nincrement counter of published messages (@topic);
117 ee83a495 Thomas Schöpping
endfork
118
:fire event;
119
note: Msut be within topic lock because of HRT counter.
120
:unlock topic;
121 7491c395 Thomas Schöpping
stop
122
note
123 ee83a495 Thomas Schöpping
 Returns ""URT_STATUS_OK"".
124
endnote
125 7491c395 Thomas Schöpping
126
/'### OUTRO ##################################################################'/
127
128
@enduml