digraph di_can_msg_states {
fontname="Helvetica";
init [shape = point ];
gc [shape = house label = "Garbage collect" ];
gc_exec [shape = rectangle, label = <Execute
di_can_msg_gc()> ];
reassm [shape = rectangle, label = <Reassemble
di_can_reassemble()> ];
crc [shape = rectangle, label = <CRC
di_can_crc_check()> ];
free [shape = rectangle, label = <Free
di_can_msg_free(
struct di_can_msg **msg)> ];
send [shape = rectangle, label = <Send
di_can_send(
struct di_can_msg **msg)> ];
send_async [shape = rectangle, label = <Async send
di_can_send_async(
struct di_can_msg **msg)> ];
send_async_next [shape = house, label = <Execute async send
di_can_send_async_next(void)> ];
reset [shape = rectangle, label = <Reset
_di_can_msg_reset(
struct di_can_msg *msg)> ];
init -> reset;
UNUSED -> APPLICATION [ label = <Allocate
di_can_msg_alloc()> ];
UNUSED -> reassm;
reassm -> REASSEMBLE [ label = <Get (internal)
di_can_msg_search()
di_can_msg_get()> ];
REASSEMBLE -> crc;
READY -> APPLICATION [ label = <Get ready
di_can_msg_get_ready(
enum di_can_msgtype type)> ];
APPLICATION -> free;
APPLICATION -> send;
APPLICATION -> send_async;
REASSEMBLE -> gc [ label = <Timeout
msg->timeout >=
di_time_get_uptime()> ];
READY -> gc [ label = <Timeout
msg->timeout >=
di_time_get_uptime()> ];
DIRTY -> gc;
crc -> free;
crc -> READY [ label = <Set ready (internal)
di_can_msg_set_ready(
struct di_can_msg **msg)> ];
send -> free;
send -> ERROR;
send_async -> SEND;
SEND -> send_async_next;
send_async_next -> free;
send_async_next -> ERROR;
ERROR -> APPLICATION;
free -> DIRTY;
gc -> reset;
gc -> gc_exec [ dir=back ];
reset -> UNUSED;
}