size_t len;
forb_iop_message_header mh;
bool header_received = false;
+ int oldstate;
while (!port->finish) {
if (c->rptr == c->wptr) {
/* The buffer is empty now - start writing from begining*/
FORB_CDR_buffer_reset(c, 0);
}
+
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
/* TODO: If there is not enough space for reception,
* we should shift the already received data to the
* beginning of the buffer. */
c->wptr += rcvd;
c->wptr_last = c->wptr;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+
/* While there are some data in the buffer, process them. */
while (FORB_CDR_data_size(c) > 0) {
len = FORB_CDR_data_size(c);
- /* Wait for and then process message header */
+ /* Find and process message header (if there is any) */
if (!header_received) {
if (len >= forb_iop_MESSAGE_HEADER_SIZE) {
if (c->rptr % 8 != 0) {
}
}
- /* Wait for and then process the message body */
+ /* If the whole message is received, then process it */
if (header_received) {
if (len >= mh.message_size) {
process_message(port, &mh, c);