示例#1
0
文件: edpnet.c 项目: konghan/edp.io
int edpnet_sock_create(edpnet_sock_t *sock, edpnet_sock_cbs_t *cbs, void *data){
    edpnet_data_t	*ed = &__edpnet_data;
    struct edpnet_sock	*s;
    int			ret;

    if(!ed->ed_init){
	log_warn("ednet not inited!\n");
	return -1;
    }

    s = mheap_alloc(sizeof(*s));
    if(s == NULL){
	log_warn("no enough memory!\n");
	return -ENOMEM;
    }
    memset(s, 0, sizeof(*s));

    ret = emit_create(s, &s->es_emit);
    if(ret !=0 ){
	log_warn("create emit fail:%d\n", ret);
	return ret;
    }
    emit_add_handler(s->es_emit, kEDPNET_SOCK_EPOLLOUT, edpnet_sock_epollout_handler);
    emit_add_handler(s->es_emit, kEDPNET_SOCK_EPOLLIN, edpnet_sock_epollin_handler);
    emit_add_handler(s->es_emit, kEDPNET_SOCK_EPOLLERR, edpnet_sock_epollerr_handler);
    emit_add_handler(s->es_emit, kEDPNET_SOCK_EPOLLHUP, edpnet_sock_epollhup_handler);

    s->es_sock = socket(PF_INET, SOCK_STREAM, 0);
    if(s->es_sock < 0){
	log_warn("init sock failure!\n");
	emit_destroy(s->es_emit);
	mheap_free(s);
	return -1;
    }

    ret = sock_init(s);
    if(ret != 0){
	log_warn("initialize sock failure!\n");
	emit_destroy(s->es_emit);
	mheap_free(s);
	return ret;
    }

    edpnet_sock_set(s, cbs, data);
    *sock = s;

    return 0;
}
示例#2
0
文件: edpnet.c 项目: konghan/edp.io
int edpnet_serv_create(edpnet_serv_t *serv, edpnet_serv_cbs_t *cbs, void *data){
    struct edpnet_serv	    *s;

    ASSERT((serv != NULL) && (cbs != NULL));

    s = mheap_alloc(sizeof(*s));
    if(s == NULL){
	log_warn("no enough memory for serv!\n");
	return -ENOMEM;
    }
    memset(s, 0, sizeof(*s));

    INIT_LIST_HEAD(&s->es_node);
    INIT_LIST_HEAD(&s->es_socks);
    s->es_cbs = cbs;
    s->es_data = data;

    s->es_sock = socket(PF_INET, SOCK_STREAM, 0);
    if(s->es_sock < 0){
	log_warn("init sock failure!\n");
	mheap_free(s);
	return -1;
    }

    if(set_nonblock(s->es_sock) < 0){
	close(s->es_sock);
	mheap_free(s);
	return -1;
    }

    spi_spin_init(&s->es_lock);

    if(eio_addfd(s->es_sock, serv_worker_cb, s) != 0){
	log_warn("watch serv handle fail!\n");
	spi_spin_fini(&s->es_lock);
	close(s->es_sock);
	mheap_free(s);
	return -1;
    }

    s->es_status = kEDPNET_SERV_STATUS_INIT;

    *serv = s;

    return 0;
}
示例#3
0
void
ssvm_delete_private (ssvm_private_t * ssvm)
{
  vec_free (ssvm->name);
#if USE_DLMALLOC == 0
  mheap_free (ssvm->sh->heap);
#else
  destroy_mspace (ssvm->sh->heap);
#endif
  clib_mem_free (ssvm->sh);
}
示例#4
0
文件: mcache.c 项目: konghan/edp.io
int mcache_destroy(mcache_t mc){
    struct mem_cache *m = mc;

    ASSERT(m != NULL);

    if(m->mc_allocs != m->mc_frees){
	return -EINVAL;
    }

    mheap_free(m);

    return 0;
}
示例#5
0
文件: edpnet.c 项目: konghan/edp.io
int edpnet_sock_destroy(edpnet_sock_t sock){
    edpnet_data_t	*ed = &__edpnet_data;
    struct edpnet_sock	*s = sock;

    if(!ed->ed_init){
	log_warn("ednet not inited!\n");
	return -1;
    }

    s->es_status = kEDPNET_SOCK_STATUS_ZERO;
    sock_fini(sock);
    close(s->es_sock);

    emit_destroy(s->es_emit);
    mheap_free(s);

    return 0;
}
示例#6
0
文件: edpnet.c 项目: konghan/edp.io
int edpnet_serv_destroy(edpnet_serv_t serv){
    struct edpnet_serv	*s = serv;

    ASSERT(s != NULL);

    eio_delfd(s->es_sock);

    spi_spin_lock(&s->es_lock);
    s->es_status = kEDPNET_SERV_STATUS_ZERO;
    spi_spin_unlock(&s->es_lock);

    close(s->es_sock);

    spi_spin_fini(&s->es_lock);

    mheap_free(s);

    return 0;
}
示例#7
0
文件: emitter.c 项目: konghan/edp.io
int emit_destroy(emit_t em){
    struct edp_emit *ee = em;

    ASSERT(ee != NULL);

    if(ee->ee_pendings != 0){
	log_warn("edpu still have pending events!\n");
	return -EINVAL;
    }

    ee->ee_init = 0;

    spi_spin_lock(&__emit_data.ed_lock);
    list_del(&ee->ee_node);
    spi_spin_unlock(&__emit_data.ed_lock);

    spi_spin_fini(&ee->ee_lock);

    mheap_free(ee);

    return 0;
}
示例#8
0
文件: edpnet.c 项目: konghan/edp.io
static void serv_worker_cb(uint32_t events, void *data){
    struct edpnet_serv *s = (struct edpnet_serv *)data;
    struct edpnet_sock *sock;

    ASSERT(s != NULL);

    if(events & EPOLLIN){
	sock = mheap_alloc(sizeof(*sock));
	if(sock == NULL){
	    log_warn("no memory for sock!\n");
	    return ;
	}
	memset(sock, 0, sizeof(*sock));

	sock->es_sock = accept(s->es_sock, NULL, NULL);
	if(sock->es_sock < 0){
	    log_warn("accept client fail!\n");
	    return ;
	}
	
	if(sock_init(sock) < 0){
	    sock_fini(sock);
	    mheap_free(sock);
	}else{
	    s->es_cbs->connected(s, sock, s->es_data);
	}
    }

    if(events & EPOLLOUT){
	ASSERT(0);
    }

    if(events & (EPOLLERR | EPOLLHUP)){
	s->es_cbs->close(s, s->es_data);
    }
}
示例#9
0
文件: test_mheap.c 项目: chrisy/vpp
int
test_mheap_main (unformat_input_t * input)
{
  int i, j, k, n_iterations;
  void *h, *h_mem;
  uword *objects = 0;
  u32 objects_used, really_verbose, n_objects, max_object_size;
  u32 check_mask, seed, trace, use_vm;
  u32 print_every = 0;
  u32 *data;
  mheap_t *mh;

  /* Validation flags. */
  check_mask = 0;
#define CHECK_VALIDITY 1
#define CHECK_DATA     2
#define CHECK_ALIGN    4
#define TEST1	       8

  n_iterations = 10;
  seed = 0;
  max_object_size = 100;
  n_objects = 1000;
  trace = 0;
  really_verbose = 0;
  use_vm = 0;

  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
    {
      if (0 == unformat (input, "iter %d", &n_iterations)
	  && 0 == unformat (input, "count %d", &n_objects)
	  && 0 == unformat (input, "size %d", &max_object_size)
	  && 0 == unformat (input, "seed %d", &seed)
	  && 0 == unformat (input, "print %d", &print_every)
	  && 0 == unformat (input, "validdata %|",
			    &check_mask, CHECK_DATA | CHECK_VALIDITY)
	  && 0 == unformat (input, "valid %|",
			    &check_mask, CHECK_VALIDITY)
	  && 0 == unformat (input, "verbose %=", &really_verbose, 1)
	  && 0 == unformat (input, "trace %=", &trace, 1)
	  && 0 == unformat (input, "vm %=", &use_vm, 1)
	  && 0 == unformat (input, "align %|", &check_mask, CHECK_ALIGN)
	  && 0 == unformat (input, "test1 %|", &check_mask, TEST1))
	{
	  clib_warning ("unknown input `%U'", format_unformat_error, input);
	  return 1;
	}
    }

  /* Zero seed means use default. */
  if (!seed)
    seed = random_default_seed ();

  if (check_mask & TEST1)
    {
      return test1 ();
    }

  if_verbose
    ("testing %d iterations, %d %saligned objects, max. size %d, seed %d",
     n_iterations, n_objects, (check_mask & CHECK_ALIGN) ? "randomly " : "un",
     max_object_size, seed);

  vec_resize (objects, n_objects);
  if (vec_bytes (objects) > 0)	/* stupid warning be gone */
    clib_memset (objects, ~0, vec_bytes (objects));
  objects_used = 0;

  /* Allocate initial heap. */
  {
    uword size =
      max_pow2 (2 * n_objects * max_object_size * sizeof (data[0]));

    h_mem = clib_mem_alloc (size);
    if (!h_mem)
      return 0;

    h = mheap_alloc (h_mem, size);
  }

  if (trace)
    mheap_trace (h, trace);

  mh = mheap_header (h);

  if (use_vm)
    mh->flags &= ~MHEAP_FLAG_DISABLE_VM;
  else
    mh->flags |= MHEAP_FLAG_DISABLE_VM;

  if (check_mask & CHECK_VALIDITY)
    mh->flags |= MHEAP_FLAG_VALIDATE;

  for (i = 0; i < n_iterations; i++)
    {
      while (1)
	{
	  j = random_u32 (&seed) % vec_len (objects);
	  if (objects[j] != ~0 || i + objects_used < n_iterations)
	    break;
	}

      if (objects[j] != ~0)
	{
	  mheap_put (h, objects[j]);
	  objects_used--;
	  objects[j] = ~0;
	}
      else
	{
	  uword size, align, align_offset;

	  size = (random_u32 (&seed) % max_object_size) * sizeof (data[0]);
	  align = align_offset = 0;
	  if (check_mask & CHECK_ALIGN)
	    {
	      align = 1 << (random_u32 (&seed) % 10);
	      align_offset = round_pow2 (random_u32 (&seed) & (align - 1),
					 sizeof (u32));
	    }

	  h = mheap_get_aligned (h, size, align, align_offset, &objects[j]);

	  if (align > 0)
	    ASSERT (0 == ((objects[j] + align_offset) & (align - 1)));

	  ASSERT (objects[j] != ~0);
	  objects_used++;

	  /* Set newly allocated object with test data. */
	  if (check_mask & CHECK_DATA)
	    {
	      uword len;

	      data = (void *) h + objects[j];
	      len = mheap_len (h, data);

	      ASSERT (size <= mheap_data_bytes (h, objects[j]));

	      data[0] = len;
	      for (k = 1; k < len; k++)
		data[k] = objects[j] + k;
	    }
	}

      /* Verify that all used objects have correct test data. */
      if (check_mask & 2)
	{
	  for (j = 0; j < vec_len (objects); j++)
	    if (objects[j] != ~0)
	      {
		u32 *data = h + objects[j];
		uword len = data[0];
		for (k = 1; k < len; k++)
		  ASSERT (data[k] == objects[j] + k);
	      }
	}
      if (print_every != 0 && i > 0 && (i % print_every) == 0)
	fformat (stderr, "iteration %d: %U\n", i, format_mheap, h,
		 really_verbose);
    }

  if (verbose)
    fformat (stderr, "%U\n", format_mheap, h, really_verbose);
  mheap_free (h);
  clib_mem_free (h_mem);
  vec_free (objects);

  return 0;
}