On 31/01/2019 13:41, Andres Monteverde wrote:
Hi Sebastian, Thank you for your prompt response.

> I don't think this is correct. If you call _MPCI_Send_request_packet(),
> then the ownership of this packet is transferred to the implementation
> of this function. With the shared memory driver, the packet is freed by
> the receiver, see Shm_Free_envelope()."

If you think that it's not correct, we can move the returning of the packet inside _MPCI_Send_request_packet() but the reason why we return the packet outside _MPCI_Send_request_packet() is because we were focalized in queue behaviour and a change inside _MPCI_Send_request_packet() is a broad solution with an unknown effect for the test.

Regarding "the packet is freed by the receiver, see Shm_Free_envelope()", by looking at the code and running the code step by step with jtag, the core0 (the owner of the queue) does not return the packet in any case.
The core0 MPCI handler for the receive request is:

_Message_queue_MP_Process_packet()
case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:

      the_packet->Prefix.return_code = rtems_message_queue_receive(
        the_packet->Prefix.id,
        the_packet->Buffer.buffer,
        &the_packet->size,
        the_packet->option_set,
        the_packet->Prefix.timeout
      );

      if ( the_packet->Prefix.return_code != RTEMS_PROXY_BLOCKING )
        _Message_queue_MP_Send_response_packet(
          MESSAGE_QUEUE_MP_RECEIVE_RESPONSE,
          the_packet->Prefix.id,
          _Thread_Executing
        );
      break;

The core1 MPCI handler for the receive response is:

_Message_queue_MP_Process_packet()
case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:

      the_thread = _MPCI_Process_response( the_packet_prefix );

      if (the_packet->Prefix.return_code == RTEMS_SUCCESSFUL) {
        *(size_t *) the_thread->Wait.return_argument =
           the_packet->size;

        _CORE_message_queue_Copy_buffer(
          the_packet->Buffer.buffer,
the_thread->Wait.return_argument_second.mutable_object,
          the_packet->size
        );
      }

      _MPCI_Return_packet( the_packet_prefix );
      break;

As far as i understand is the core 1 who frees the packet.

Yes, this is also my understanding.

And in case of a timeout waiting at the queue, there is no response at all from core 0 so there's no return for the allocated packet nor the proxy.

These are probably two independent problems.

Core 1 must still receive this packet at some time and free it.

The lost proxy in case of a timeout is another issue.

I don't have time to look into the details at the moment.

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : [email protected]
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
users mailing list
[email protected]
http://lists.rtems.org/mailman/listinfo/users

Reply via email to