change the way WHC state is passed round in the transmit path to allow tighter assertions and silencing of warnings from clang's static analyzer
Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									ed06ab8f4b
								
							
						
					
					
						commit
						23972aa8f7
					
				
					 1 changed files with 13 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -233,6 +233,7 @@ static int writer_hbcontrol_ack_required_generic (const struct writer *wr, const
 | 
			
		|||
{
 | 
			
		||||
  struct hbcontrol const * const hbc = &wr->hbcontrol;
 | 
			
		||||
  const int64_t hb_intv_ack = config.const_hb_intv_sched;
 | 
			
		||||
  assert(wr->heartbeat_xevent != NULL && whcst != NULL);
 | 
			
		||||
 | 
			
		||||
  if (piggyback)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -707,6 +708,7 @@ static void transmit_sample_lgmsg_unlocked (struct nn_xpack *xp, struct writer *
 | 
			
		|||
  const char *frags_to_skip = getenv ("SKIPFRAGS");
 | 
			
		||||
#endif
 | 
			
		||||
  assert(xp);
 | 
			
		||||
  assert((wr->heartbeat_xevent != NULL) == (whcst != NULL));
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < nfrags; i++)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -744,6 +746,7 @@ static void transmit_sample_lgmsg_unlocked (struct nn_xpack *xp, struct writer *
 | 
			
		|||
  {
 | 
			
		||||
    struct nn_xmsg *msg = NULL;
 | 
			
		||||
    int hbansreq;
 | 
			
		||||
    assert (whcst != NULL);
 | 
			
		||||
    os_mutexLock (&wr->e.lock);
 | 
			
		||||
    msg = writer_hbcontrol_piggyback (wr, whcst, serdata->twrite, nn_xpack_packetid (xp), &hbansreq);
 | 
			
		||||
    os_mutexUnlock (&wr->e.lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -762,6 +765,7 @@ static void transmit_sample_unlocks_wr (struct nn_xpack *xp, struct writer *wr,
 | 
			
		|||
  struct nn_xmsg *fmsg;
 | 
			
		||||
  uint32_t sz;
 | 
			
		||||
  assert(xp);
 | 
			
		||||
  assert((wr->heartbeat_xevent != NULL) == (whcst != NULL));
 | 
			
		||||
 | 
			
		||||
  sz = ddsi_serdata_size (serdata);
 | 
			
		||||
  if (sz > config.fragment_size || !isnew || plist != NULL || prd != NULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -1116,10 +1120,6 @@ static int write_sample_eot (struct nn_xpack *xp, struct writer *wr, struct nn_p
 | 
			
		|||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    struct whc_state whcst;
 | 
			
		||||
    if (wr->heartbeat_xevent)
 | 
			
		||||
      whc_get_state(wr->whc, &whcst);
 | 
			
		||||
 | 
			
		||||
    /* Note the subtlety of enqueueing with the lock held but
 | 
			
		||||
       transmitting without holding the lock. Still working on
 | 
			
		||||
       cleaning that up. */
 | 
			
		||||
| 
						 | 
				
			
			@ -1130,6 +1130,7 @@ static int write_sample_eot (struct nn_xpack *xp, struct writer *wr, struct nn_p
 | 
			
		|||
       * plist's are only used for coherent sets, which is assumed to be rare,
 | 
			
		||||
       * which in turn means that an extra copy doesn't hurt too badly ... */
 | 
			
		||||
      nn_plist_t plist_stk, *plist_copy;
 | 
			
		||||
      struct whc_state whcst, *whcstptr;
 | 
			
		||||
      if (plist == NULL)
 | 
			
		||||
        plist_copy = NULL;
 | 
			
		||||
      else
 | 
			
		||||
| 
						 | 
				
			
			@ -1137,7 +1138,14 @@ static int write_sample_eot (struct nn_xpack *xp, struct writer *wr, struct nn_p
 | 
			
		|||
        plist_copy = &plist_stk;
 | 
			
		||||
        nn_plist_copy (plist_copy, plist);
 | 
			
		||||
      }
 | 
			
		||||
      transmit_sample_unlocks_wr (xp, wr, &whcst, seq, plist_copy, serdata, NULL, 1);
 | 
			
		||||
      if (wr->heartbeat_xevent == NULL)
 | 
			
		||||
        whcstptr = NULL;
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        whc_get_state(wr->whc, &whcst);
 | 
			
		||||
        whcstptr = &whcst;
 | 
			
		||||
      }
 | 
			
		||||
      transmit_sample_unlocks_wr (xp, wr, whcstptr, seq, plist_copy, serdata, NULL, 1);
 | 
			
		||||
      if (plist_copy)
 | 
			
		||||
        nn_plist_fini (plist_copy);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue