예제 #1
0
파일: scamper_fds.c 프로젝트: shinglee/test
/*
 * fd_free
 *
 * free up memory allocated to scamper's monitoring of the file descriptor.
 */
static void fd_free(scamper_fd_t *fdn)
{
  scamper_debug(__func__, "fd %d type %s", fdn->fd, fd_tostr(fdn));

  if(fdn->fd >= 0 && fdn->fd < fd_array_s && fd_array != NULL)
    fd_array[fdn->fd] = NULL;

  if(fdn->read.node != NULL)
    dlist_node_pop(fdn->read.list, fdn->read.node);

  if(fdn->write.node != NULL)
    dlist_node_pop(fdn->write.list, fdn->write.node);

  if(fdn->rc0 != NULL)
    dlist_node_pop(refcnt_0, fdn->rc0);

  if(fdn->fd_tree_node != NULL)
    splaytree_remove_node(fd_tree, fdn->fd_tree_node);

  if(fdn->fd_list_node != NULL)
    dlist_node_pop(fd_list, fdn->fd_list_node);

  if(SCAMPER_FD_TYPE_IS_ICMP(fdn))
    {
      if(fdn->fd_icmp_addr != NULL)
	free(fdn->fd_icmp_addr);
    }
  else if(SCAMPER_FD_TYPE_IS_UDP(fdn))
    {
      if(fdn->fd_udp_addr != NULL)
	free(fdn->fd_udp_addr);
    }
  else if(SCAMPER_FD_TYPE_IS_TCP(fdn))
    {
      if(fdn->fd_tcp_addr != NULL)
	free(fdn->fd_tcp_addr);
    }
  else if(SCAMPER_FD_TYPE_IS_DL(fdn))
    {
      if(fdn->fd_dl_dl != NULL)
	scamper_dl_state_free(fdn->fd_dl_dl);
    }

  free(fdn);

  return;
}
예제 #2
0
void scamper_task_anc_del(scamper_task_t *task, scamper_task_anc_t *anc)
{
  if(anc == NULL)
    return;
  dlist_node_pop(task->ancillary, anc->node);
  free(anc);
  return;
}
예제 #3
0
int scamper_task_dehold(scamper_task_t *task, void *cookie)
{
  task_onhold_t *toh;
  assert(task->onhold != NULL);
  if((toh = dlist_node_pop(task->onhold, cookie)) == NULL)
    return -1;
  free(toh);
  return 0;
}
예제 #4
0
static void rtsock_pair_free(rtsock_pair_t *pair)
{
  if(pair == NULL)
    return;
  pair->route->internal = NULL;
  if(pair->node != NULL)
    dlist_node_pop(pairs, pair->node);
  free(pair);
  return;
}
예제 #5
0
파일: scamper_fds.c 프로젝트: shinglee/test
/*
 * fd_find
 *
 * search the tree of file descriptors known to scamper for a matching
 * entry.  if one is found, increment its reference count and return it.
 */
static scamper_fd_t *fd_find(scamper_fd_t *findme)
{
  scamper_fd_t *fdn;

  if((fdn = splaytree_find(fd_tree, findme)) != NULL)
    {
      if(fdn->refcnt == 0 && fdn->rc0 != NULL)
	{
	  dlist_node_pop(refcnt_0, fdn->rc0);
	  fdn->rc0 = NULL;
	}

      fdn->refcnt++;
    }

  return fdn;
}
예제 #6
0
static rtsock_pair_t *rtsock_pair_get(uint16_t seq)
{
  rtsock_pair_t *pair;
  dlist_node_t  *node;

  for(node=dlist_head_node(pairs); node != NULL; node=dlist_node_next(node))
    {
      pair = dlist_node_item(node);
      if(pair->seq != seq)
	continue;
      dlist_node_pop(pairs, node);
      pair->node = NULL;
      return pair;
    }

  return NULL;
}
예제 #7
0
static void s2t_free(s2t_t *s2t)
{
  scamper_task_sig_t *sig = s2t->sig;

  if(s2t == NULL)
    return;

  if(s2t->node != NULL)
    {
      if(sig->sig_type == SCAMPER_TASK_SIG_TYPE_TX_IP)
	splaytree_remove_node(tx_ip, s2t->node);
      else if(sig->sig_type == SCAMPER_TASK_SIG_TYPE_TX_ND)
	splaytree_remove_node(tx_nd, s2t->node);
      else if(sig->sig_type == SCAMPER_TASK_SIG_TYPE_SNIFF)
	dlist_node_pop(sniff, s2t->node);
    }

  free(s2t);
  return;
}