Statistics
| Branch: | Revision:

urtware / doc / activitydiagrams / publisher / urtPublisherPublish.uml @ dd31cb03

History | View | Annotate | Download (4.05 KB)

1
/'
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
/'### PARAMETERS & RETURN ####################################################'/
29

    
30
note
31
  -- **publisher** : urt_publisher_t* --
32
  Pointer to the publisher to use.
33
  Must not be ""NULL"".
34
  -- **payload** : void* --
35
  Pointer to the data to be published.
36
  May be ""NULL"" for messages without payload.
37
  -- **bytes** : size_t --
38
  Size of the payload in bytes.
39
  -- **t** : urt_osTime_t --
40
  Timestamp to be set for the message.
41
  -- **timeout** : urt_delay_t --
42
  Timeout delay in case the message cannot be published.
43
  ====
44
  -- **return** : urt_status_t --
45
  Returns ""URT_STATUS_OK"" on success.
46
  Returns ""URT_STATUS_PUBLISH_TIMEOUT"" on timeout.
47
endnote
48

    
49
/'### PROCEDURE ##############################################################'/
50

    
51
start
52
:lock topic;
53
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
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
    #EEEEEE:..//URT_CFG_PUBSUB_PROFILING == true//..\nincrement counter of publish fails;
62
    :unlock topic;
63
    stop
64
    note
65
      Returns ""URT_STATUS_PUBLISH_TIMEOUT"".
66
    endnote
67
  else (no)
68
    if (Message timestamp was modified?) then (yes)
69
      repeat
70
        :proceed to next message;
71
      repeat while (Timestamp is younger than of previous message?) is (yes)
72
      ->no;
73
    else (no)
74
    endif
75
  endif
76
endwhile (no)
77
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
fork
84
  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
fork again
99
  #EEEEEE:..//URT_CFG_PUBSUB_QOS_RATECHECKS == true//..\nset QoS rate timer (@topic) wrt. most critical HRT subscriber;
100
fork again
101
  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
endfork
118
:fire event;
119
note: Msut be within topic lock because of HRT counter.
120
:unlock topic;
121
stop
122
note
123
 Returns ""URT_STATUS_OK"".
124
endnote
125

    
126
/'### OUTRO ##################################################################'/
127

    
128
@enduml