Jump to content

Recommended Posts

What is the correct way to handle transaction data pointer (set_data_ptr).
If I free it right after b_transport I get an error since transaction handling isn't completes.
Unlike tlm_extension it is not freed once transaction is completed.
 
 

void rx_thread() {

  while(1)
  {
    uint8_t *buf = new uint8_t[ETH_MAC_PACKET_MAX_LEN];

    tlm::tlm_generic_payload* pkt_trans = new tlm::tlm_generic_payload();
    pkt_trans->set_command(tlm::TLM_WRITE_COMMAND);
    pkt_trans->set_data_length(ETH_MAC_PACKET_MAX_LEN);
    pkt_trans->set_data_ptr((unsigned char *)(buf));
    phy2mac->b_transport(*pkt_trans, delay);

    // Note:not calling "delete [] buf;" here since this data is a part of generic payload now and
    //       shouldn't be destroyed until transaction handling completes! Although b_transport() is
    //       a synchronous call indeed, queue is filled with pointers to original structures rather then to their clones.

  }
}

 

Share this post


Link to post
Share on other sites

Hi.

Normally the initiator is considered as owner of the payload, i.e. he should take care of allocating and de-allocating it.

The target should decide how to use the data. If the target wants to keep it/store it, the target should make a copy of the data. In that sense, the transaction is completed when b_transport returns because the initiator transfered it to the target and the target had a chance to handle it.

A benefit of this is that you do not need dynamic allocation of the buffer buf.

 

Greetings

Ralph

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×