예제 #1
0
파일: timer.c 프로젝트: chrisy/vpp
int
main (int argc, char *argv[])
{
  word i, n = atoi (argv[1]);
  word run_foo = argc > 2;
bar_t b = { limit:10 };

  if (run_foo)
    {
      f64 time_limit;

      time_limit = atof (argv[2]);

      vec_resize (foos, n);
      for (i = 0; i < n; i++)
	{
	  foos[i].time_requested = time_limit * random_f64 ();
	  foos[i].time_called = 1e100;
	}

      foo_base_time = unix_time_now ();
      for (i = 0; i < n; i++)
	timer_call (foo, i, foos[i].time_requested);
    }
  else
    timer_call (bar, (any) & b, random_f64 ());

  while (vec_len (timers) > 0)
    os_sched_yield ();

  if (vec_len (foos) > 0)
    {
      f64 min = 1e100, max = -min;
      f64 ave = 0, rms = 0;

      for (i = 0; i < n; i++)
	{
	  f64 dt = foos[i].time_requested - foos[i].time_called;
	  if (dt < min)
	    min = dt;
	  if (dt > max)
	    max = dt;
	  ave += dt;
	  rms += dt * dt;
	}
      ave /= n;
      rms = sqrt (rms / n - ave * ave);
      fformat (stdout, "error min %g max %g ave %g +- %g\n", min, max, ave,
	       rms);
    }

  fformat (stdout, "%d function calls, ave. timer delay %g secs\n",
	   ave_delay_count, ave_delay / ave_delay_count);

  return 0;
}
예제 #2
0
파일: test_ptclosure.c 프로젝트: chrisy/vpp
static void
dump_closure (test_main_t * tm, char *s, u8 ** orig)
{
  int i, j;

  fformat (stdout, "--------- %s --------------\n", s);
  for (i = 0; i < vec_len (orig); i++)
    {
      for (j = 0; j < vec_len (orig); j++)
	if (orig[i][j])
	  {
	    fformat (stdout, "%s <before> %s\n", items[i], items[j]);
	  }
    }
}
예제 #3
0
static void assert_strlen (uword iter)
{
  u8 * s;
  void * s_orig;
  uword i, size, unalign, offset, len;
  u8 c;

  for (i = 0; i < iter; i++)
    {
      size = bounded_random_u32 (&g_seed, 0, g_bytes);
      size++;
      unalign = bounded_random_u32 (&g_seed, 0, 1);

      if (unalign)
	{
	  offset = bounded_random_u32 (&g_seed, 0, 7);
	  s = alloc_unaligned (size, offset, &s_orig);
	}
      else
	{
	  s = alloc_aligned (size, g_align, &s_orig);
	}
	 
      c = bounded_random_u32 (&g_seed, 0, 255);
      memset (s, c, size - 1);
      s[size - 1] = '\0';
      
      len = strlen8 (s);
      ASSERT (len == strlen (s));

      clib_mem_free_safe (s_orig);
    }

  fformat (stdout, "strlen() validation successful!\n");
}
예제 #4
0
파일: test_mheap.c 프로젝트: chrisy/vpp
int
test1 (void)
{
  clib_time_t clib_time;
  void *h_mem = clib_mem_alloc (2ULL << 30);
  void *h;
  uword *objects = 0;
  int i;
  f64 before, after;

  clib_time_init (&clib_time);

  vec_validate (objects, 2000000 - 1);

  h = mheap_alloc (h_mem, (uword) (2 << 30));

  before = clib_time_now (&clib_time);

  for (i = 0; i < vec_len (objects); i++)
    {
      h = mheap_get_aligned (h, 24 /* size */ ,
			     64 /* align */ ,
			     16 /* align at offset */ , &objects[i]);
    }

  after = clib_time_now (&clib_time);

  fformat (stdout, "alloc: %u objects in %.2f seconds, %.2f objects/second\n",
	   vec_len (objects), (after - before),
	   ((f64) vec_len (objects)) / (after - before));

  return 0;
}
예제 #5
0
파일: svm_test.c 프로젝트: JehandadKhan/vpp
int main (int argc, char **argv)
{
    svm_region_t *root_rp, *rp;
    svm_map_region_args_t *a = 0;

    vec_validate (a, 0);

    root_rp = svm_region_init();

    ASSERT (root_rp);

    a->name = "/qvnet";
    a->size = (4<<10);

    rp = svm_region_find_or_create (root_rp, a);

    ASSERT (rp);

    *((u32 *)rp->data_base) = 0xdeadbeef;
    svm_region_unmap (root_rp, rp);

    fformat(stdout, "exiting...\n");

    exit (0);
}
예제 #6
0
static void assert_memcpy (uword iter)
{
  u8 * s, * d;
  void * s_orig, * d_orig;
  uword i, j;
  uword size;

  for (i = 0; i < iter; i++)
    {
      void * avoid_warnings_s, * avoid_warnings_d;

      size = bounded_random_u32 (&g_seed, 0, g_bytes);
      get_random_pointer (size + 1, &avoid_warnings_d, &d_orig);
      get_random_pointer (size + 1, &avoid_warnings_s, &s_orig);
      s = avoid_warnings_s;
      d = avoid_warnings_d;
      memset (d, 0, size + 1);
      memset (s, 0xba, size + 1);
      d[size] = MAGIC_GUARD;

      memcpy8 (d, s, size);

      for (j = 0; j < size; j++)
	ASSERT (d[j] == s[j]);

      ASSERT (d[size] == MAGIC_GUARD);
      clib_mem_free_safe (d_orig);
      clib_mem_free_safe (s_orig);
    }

  fformat (stdout, "memcpy() validation successful!\n");
}
예제 #7
0
/*----------------------------------------------------------------------------
 *        Format a Flash Memory Card
 *---------------------------------------------------------------------------*/
static void cmd_format (char *par) {
  char *label,*next,*opt;
  char arg[20];
  U32 retv;

  label = get_entry (par, &next);
  if (label == NULL) {
    label = "KEIL";
  }
  strcpy (arg, label);
  opt = get_entry (next, &next);
  if (opt != NULL) {
    if ((strcmp (opt, "/FAT32") == 0) ||(strcmp (opt, "/fat32") == 0)) {
      strcat (arg, "/FAT32");
    }
  }
  printf ("\nFormat Flash Memory Card? [Y/N]\n");
  retv = getkey();
  if (retv == 'y' || retv == 'Y') {
    /* Format the Card with Label "KEIL". "*/
    if (fformat (arg) == 0) {
      printf ("Memory Card Formatted.\n");
      printf ("Card Label is %s\n",label);
    }
    else {
      printf ("Formatting failed.\n");
    }
  }
}
예제 #8
0
파일: stn_test.c 프로젝트: chrisy/vpp
static int
api_stn_rules_dump (vat_main_t * vam)
{
  stn_test_main_t *sm = &stn_test_main;
  vl_api_stn_rules_dump_t *mp;
  vl_api_control_ping_t *mp_ping;
  int ret;

  if (!vam->json_output)
    {
      print (vam->ofp, "%=20s", "STN Rules");
    }

  M (STN_RULES_DUMP, mp);
  /* send it... */
  S (mp);

  /* Use a control ping for synchronization */
  mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping));
  mp_ping->_vl_msg_id = htons (sm->ping_id);
  mp_ping->client_index = vam->my_client_index;

  fformat (vam->ofp, "Sending ping id=%d\n", sm->ping_id);

  vam->result_ready = 0;
  S (mp_ping);

  /* Wait for a reply... */
  W (ret);
  return ret;
}
예제 #9
0
파일: vmxnet3_test.c 프로젝트: chrisy/vpp
static int
api_vmxnet3_dump (vat_main_t * vam)
{
  vmxnet3_test_main_t *vxm = &vmxnet3_test_main;
  vl_api_vmxnet3_dump_t *mp;
  vl_api_control_ping_t *mp_ping;
  int ret;

  if (vam->json_output)
    {
      clib_warning ("JSON output not supported for vmxnet3_dump");
      return -99;
    }

  M (VMXNET3_DUMP, mp);
  S (mp);

  /* Use a control ping for synchronization */
  mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping));
  mp_ping->_vl_msg_id = htons (vxm->ping_id);
  mp_ping->client_index = vam->my_client_index;

  fformat (vam->ofp, "Sending ping id=%d\n", vxm->ping_id);

  vam->result_ready = 0;
  S (mp_ping);

  W (ret);
  return ret;
}
예제 #10
0
파일: app.c 프로젝트: postgetme/crco
static INT8S fs_init (void)
{
   INT32U retv;

   retv = finit ();

   spi_hi_speed (__TRUE); 

   if (retv == 0) {
      retv = fcheck ("S:");
   }
   else
   {
      retv = fformat ("S:");
      if (retv == 0)
      {
         return 0;
      }
      else
      {
         return -1;
      }
   }

   return 0;
}
예제 #11
0
파일: stn_test.c 프로젝트: chrisy/vpp
static void
vl_api_stn_rules_details_t_handler (vl_api_stn_rules_details_t * mp)
{
  vat_main_t *vam = stn_test_main.vat_main;
  fformat (vam->ofp, "addr: %U sw_if_index: %u\n",
	   mp->is_ip4 ? format_ip4_address : format_ip6_address,
	   mp->ip_address, clib_net_to_host_u32 (mp->sw_if_index));
}
예제 #12
0
파일: test_ha.c 프로젝트: chrisy/vpp
static void vl_api_control_ping_reply_t_handler
  (vl_api_control_ping_reply_t * mp)
{
  test_main_t *tm = &test_main;

  fformat (stdout, "control ping reply from pid %d\n", ntohl (mp->vpe_pid));
  tm->pings_replied++;
}
예제 #13
0
static void assert_memset (uword iter)
{
  u8 * s;
  void * orig;
  uword i, j, k;
  uword count, size;
  u64 val = 0xbabababababababaLL;

  for (i = 0; i < iter; i++)
    {
      size = bounded_random_u32 (&g_seed, 0, g_bytes);

      for (k = 1; k <= 8; k *= 2)
	{
	  count = size / k;
	  size = (count * k) + 1;

	  if (k == 1)
            {
              void * avoid_warnings_s;
              get_random_pointer (size, &avoid_warnings_s, &orig);
              s = avoid_warnings_s;
            }
	  else
	    s = alloc_aligned (size, min_log2 (k), &orig);

	  memset (s, 0, size);
	  s[size - 1] = MAGIC_GUARD;

	  switch (k)
	    {

#define _(type, func)				\
{						\
  type * ptr = (type *) s;			\
						\
  func (ptr, val, count);			\
						\
  for (j = 0; j < count; j++)			\
    ASSERT (ptr[j] == (type) val);		\
}

	    case 1: _(u8 , memset8);  break;
	    case 2: _(u16, memset16); break;
	    case 4: _(u32, memset32); break;
	    case 8: _(u64, memset64); break;

#undef _
	    }	  

	  ASSERT (s[size - 1] == MAGIC_GUARD);
	  clib_mem_free_safe (orig);
	}
    }

  fformat (stdout, "memset() validation successful!\n");
}
예제 #14
0
파일: timer.c 프로젝트: JehandadKhan/vpp
void bar (any arg, f64 delay)
{
  bar_t * b = (bar_t *) arg;

  fformat (stdout, "bar %d delay %g\n", b->count++, delay);

  update (delay);
  if (b->count < b->limit)
    timer_call (bar, arg, random_f64 ());
}
예제 #15
0
int test_macros_main (unformat_input_t * input)
{
  macro_main_t * mm = &macro_main;

  clib_macro_init(mm);

  fformat (stdout, "hostname: %s\n", 
           clib_macro_eval_dollar (mm, "hostname", 1 /* complain */));

  clib_macro_set_value (mm, "foo", "this is foo which contains $(bar)");
  clib_macro_set_value (mm, "bar", "bar");

  fformat (stdout, "evaluate: %s\n",
           clib_macro_eval (mm, "returns '$(foo)'", 1 /* complain */));

  clib_macro_free (mm);

  return 0;
}
예제 #16
0
파일: api_shared.c 프로젝트: Venkattk/vpp
always_inline void
msg_handler_internal (api_main_t * am,
		      void *the_msg, int trace_it, int do_it, int free_it)
{
  u16 id = ntohs (*((u16 *) the_msg));
  u8 *(*print_fp) (void *, void *);

  if (id < vec_len (am->msg_handlers) && am->msg_handlers[id])
    {
      if (trace_it)
	vl_msg_api_trace (am, am->rx_trace, the_msg);

      if (am->msg_print_flag)
	{
	  fformat (stdout, "[%d]: %s\n", id, am->msg_names[id]);
	  print_fp = (void *) am->msg_print_handlers[id];
	  if (print_fp == 0)
	    {
	      fformat (stdout, "  [no registered print fn]\n");
	    }
	  else
	    {
	      (*print_fp) (the_msg, stdout);
	    }
	}

      if (do_it)
	{
	  if (!am->is_mp_safe[id])
	    vl_msg_api_barrier_sync ();
	  (*am->msg_handlers[id]) (the_msg);
	  if (!am->is_mp_safe[id])
	    vl_msg_api_barrier_release ();
	}
    }
  else
    {
      clib_warning ("no handler for msg id %d", id);
    }

  if (free_it)
    vl_msg_api_free (the_msg);
}
예제 #17
0
static void assert_memmove (uword iter)
{
  u8 * d, * s;
  u8 * dpguard = NULL, * epguard = NULL;
  uword i;
  uword size;
  u8 hash = 0;
  u8 dguard = 0, eguard = 0;

  for (i = 0; i < iter; i++)
    {
      void * d_orig, * s_orig;
      void * avoid_warnings_s, * avoid_warnings_d;

      size = bounded_random_u32 (&g_seed, 0, g_bytes);

      get_random_two_pointers (size, size,
                               &avoid_warnings_d, &avoid_warnings_s,
			       &d_orig, &s_orig);
      s = avoid_warnings_s;
      d = avoid_warnings_d;

      memset (d, 0, size);
      fill_with_random_data (s, size, g_seed);
      hash = compute_mem_hash (0, s, size);

      if (d)
	{
	  dpguard = d - 1;
	  dguard = *dpguard;
	  epguard = d + size;
	  eguard = *epguard;
	}

      memmove8 (d, s, size);

      ASSERT (compute_mem_hash (hash, d, size) == 0);

      if (d)
	{
	  ASSERT (dguard == *dpguard);
	  ASSERT (eguard == *epguard);
	}

      clib_mem_free_safe (d_orig);
      clib_mem_free_safe (s_orig);
    }

  fformat (stdout, "memmove() validation successful!\n");
}
예제 #18
0
파일: trajectory.c 프로젝트: chrisy/vpp
/**
 * Dump a trajectory trace, reasonably easy to call from gdb
 */
void
vnet_dump_trajectory_trace (vlib_main_t * vm, u32 bi)
{
#if VLIB_BUFFER_TRACE_TRAJECTORY > 0
  vlib_node_main_t *vnm = &vm->node_main;
  vlib_buffer_t *b;
  u16 *trace;
  u8 i;

  b = vlib_get_buffer (vm, bi);

  trace = vnet_buffer2 (b)->trajectory_trace;

  fformat (stderr, "Context trace for bi %d b 0x%llx, visited %d\n",
	   bi, b, vec_len (trace));

  for (i = 0; i < vec_len (trace); i++)
    {
      u32 node_index;

      node_index = trace[i];

      if (node_index >= vec_len (vnm->nodes))
	{
	  fformat (stderr, "Skip bogus node index %d\n", node_index);
	  continue;
	}

      fformat (stderr, "%v (%d)\n", vnm->nodes[node_index]->name, node_index);
    }
#else
  fformat (stderr, "in vlib/buffers.h, "
	   "#define VLIB_BUFFER_TRACE_TRAJECTORY 1\n");

#endif
}
예제 #19
0
파일: vmxnet3_test.c 프로젝트: chrisy/vpp
/* vmxnet3-create reply handler */
static void
vl_api_vmxnet3_create_reply_t_handler (vl_api_vmxnet3_create_reply_t * mp)
{
  vat_main_t *vam = vmxnet3_test_main.vat_main;
  i32 retval = ntohl (mp->retval);

  if (retval == 0)
    {
      fformat (vam->ofp, "created vmxnet3 with sw_if_index %d\n",
	       ntohl (mp->sw_if_index));
    }

  vam->retval = retval;
  vam->result_ready = 1;
  vam->regenerate_interface_table = 1;
}
예제 #20
0
static void assert_memcmp (uword iter)
{
  u8 * s, * d;
  void * s_orig, * d_orig;
  uword i;
  uword size, change;
  word res1, res2;

  for (i = 0; i < iter; i++)
    {
      size = bounded_random_u32 (&g_seed, 1, g_bytes);
      d = alloc_aligned (size, g_align, &d_orig);
      s = alloc_aligned (size, g_align, &s_orig);
      memset (d, 0xba, size);
      memset (s, 0xba, size);
      
      if (size && i % 2 == 0)
	{
	  change = bounded_random_u32 (&g_seed, 0, size - 1);
	  d[change] = 0;
	}
      
      res1 = memcmp8 (d, s, size);
      res2 = kmemcmp (d, s, size);

      if (res1 < 0)
	ASSERT (res2 < 0);
      else if (res1 > 0)
	ASSERT (res2 > 0);
      else
	ASSERT (res2 == 0);

      clib_mem_free_safe (d_orig);
      clib_mem_free_safe (s_orig);
    }

  fformat (stdout, "memcmp() validation successful!\n");
}
예제 #21
0
int main (int argc, char * argv[])
{
  int i;
  uword next;
  u32 *tp = 0;
  u32 *junk;

  for (i = 0; i < 70; i++)
    pool_get (tp, junk);
  
  (void) junk;			/* compiler warning */

  pool_put_index (tp, 1);
  pool_put_index (tp, 65);

  next = ~0;
  do {
    next = pool_next_index (tp, next);
    fformat (stdout, "next index %d\n", next);
  } while (next != ~0);

  return 0;
}
예제 #22
0
파일: test_random.c 프로젝트: Venkattk/vpp
int test_random_main (unformat_input_t * input)
{
  uword n_iterations;
  uword i, repeat_count;
  uword * bitmap = 0;
  uword print;
  u32 seed;
  u32 *seedp = &seed;

  /* first, check known sequence from Numerical Recipes in C, 2nd ed.
     page 284 */
  seed = known_random_sequence[0];
  for (i = 0; i < ARRAY_LEN(known_random_sequence)-1; i++) 
    {
      u32 rv;
      rv = random_u32 (seedp);
      if (rv != known_random_sequence[i+1])
        {
          fformat(stderr, "known sequence check FAILS at index %d", i+1);
          break;
        }
    }

  clib_warning ("known sequence check passes");

  n_iterations = 1000;
  seed = 0;
  print = 1 << 24;

  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
    {
      if (0 == unformat (input, "iter %d", &n_iterations)
	  && 0 == unformat (input, "print %d", &print)
	  && 0 == unformat (input, "seed %d", &seed))
	clib_error ("unknown input `%U'", format_unformat_error, input);
    }

  if (! seed)
    seed = random_default_seed ();

  if (n_iterations == 0)
    n_iterations = random_u32_max ();

  clib_warning ("%d iterations, seed %d\n", n_iterations, seed);

  repeat_count = 0;
  for (i = 0; i < n_iterations; i++)
    {
      uword r = random_u32 (&seed);
      uword b, ri, rj;

      ri = r / BITS (bitmap[0]);
      rj = (uword) 1 << (r % BITS (bitmap[0]));

      vec_validate (bitmap, ri);
      b = bitmap[ri];

      if (b & rj)
	goto repeat;
      b |= rj;
      bitmap[ri] = b;

      if (0 == (i & (print - 1)))
	fformat (stderr, "0x%08x iterations %d repeats\n", i, repeat_count);
      continue;

    repeat:
      fformat (stderr, "repeat found at iteration  %d/%d\n", i, n_iterations);
      repeat_count++;
      continue;
    }

  return 0;
}
예제 #23
0
파일: test_heap.c 프로젝트: saumzy/clib
int main (int argc, char * argv[])
{
  word i, j, k, n, seed, check_mask;
  u32 * h = 0;
  uword * objects = 0;
  uword * handles = 0;
  uword objects_used;
  uword align, fixed_size;

  n = 10;
  seed = getpid ();
  check_mask = 0;
  fixed_size = 0;

  if (argc > 1)
    {
      n = atoi (argv[1]);
      verbose = 1;
    }
  if (argc > 2)
    {
      word i = atoi (argv[2]);
      if (i)
	seed = i;
    }
  if (argc > 3)
    check_mask = atoi (argv[3]);

  align = 0;
  if (argc > 4)
    align = 1 << atoi (argv[4]);

  if_verbose   ("testing %wd iterations seed %wd\n", n, seed);

  srandom (seed);

  if (verbose) fformat (stderr, "%U\n", format_clib_mem_usage, /* verbose */ 0);

  vec_resize (objects, 1000);
  memset (objects, ~0, vec_bytes (objects));
  vec_resize (handles, vec_len (objects));

  objects_used = 0;

  if (fixed_size)
    {
      uword max_len = 1024 * 1024;
      void * memory = clib_mem_alloc (max_len * sizeof (h[0]));
      h = heap_create_from_memory (memory, max_len, sizeof (h[0]));
    }

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

      if (objects[j] != ~0)
	{
	  heap_dealloc (h, handles[j]);
	  objects_used--;
	  objects[j] = ~0;
	}
      else
	{
	  u32 * data;
	  uword size;

	  size = 1 + (random () % 100);
	  objects[j] = heap_alloc_aligned (h, size, align, handles[j]);
	  objects_used++;

	  if (align)
	    ASSERT (0 == (objects[j] & (align - 1)));
	  ASSERT (objects[j] < vec_len (h));
	  ASSERT (size <= heap_len (h, handles[j]));

	  /* Set newly allocated object with test data. */
	  if (check_mask & 2)
	    {
	      data = h + objects[j];

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

      if (check_mask & 1)
	heap_validate (h);

      if (check_mask & 4)
	{
	  /* Duplicate heap at each iteration. */
	  u32 * h1 = heap_dup (h);
	  heap_free (h);
	  h = h1;
	}

      /* 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];
		for (k = 0; k < heap_len (h, handles[j]); k++)
		  ASSERT(data[k] == objects[j] + k);
	      }
	}
    }

  if (verbose) fformat (stderr, "%U\n", format_heap, h, 1);

  {
    u32 * h1 = heap_dup (h);
    if (verbose) fformat (stderr, "%U\n", format_heap, h1, 1);
    heap_free (h1);
  }

  heap_free (h);
  if (verbose) fformat (stderr, "%U\n", format_heap, h, 1);
  ASSERT (objects_used == 0);

  vec_free (objects);
  vec_free (handles);

  if (fixed_size)
    vec_free_h (h, sizeof (heap_header_t));

  if (verbose) fformat (stderr, "%U\n", format_clib_mem_usage, /* verbose */ 0);

  return 0;
}
예제 #24
0
파일: test_ptclosure.c 프로젝트: chrisy/vpp
int
test_ptclosure_main (unformat_input_t * input)
{
  test_main_t *tm = &test_main;
  u8 *item_name;
  int i, j;
  u8 **orig;
  u8 **closure;
  u8 *a_name, *b_name;
  int a_index, b_index;
  uword *p;
  u8 *this_constraint;
  int n;
  u32 *result = 0;

  tm->index_by_name = hash_create_string (0, sizeof (uword));

  n = ARRAY_LEN (items);

  for (i = 0; i < n; i++)
    {
      item_name = (u8 *) items[i];
      hash_set_mem (tm->index_by_name, item_name, i);
    }

  orig = clib_ptclosure_alloc (n);

  for (i = 0; i < ARRAY_LEN (constraints); i++)
    {
      this_constraint = format (0, "%s%c", constraints[i], 0);

      if (comma_split (this_constraint, &a_name, &b_name))
	{
	  clib_warning ("couldn't split '%s'", constraints[i]);
	  return 1;
	}

      p = hash_get_mem (tm->index_by_name, a_name);
      if (p == 0)
	{
	  clib_warning ("couldn't find '%s'", a_name);
	  return 1;
	}
      a_index = p[0];

      p = hash_get_mem (tm->index_by_name, b_name);
      if (p == 0)
	{
	  clib_warning ("couldn't find '%s'", b_name);
	  return 1;
	}
      b_index = p[0];

      orig[a_index][b_index] = 1;
      vec_free (this_constraint);
    }

  dump_closure (tm, "original relation", orig);

  closure = clib_ptclosure (orig);

  dump_closure (tm, "closure", closure);

  /*
   * Output partial order
   */

again:
  for (i = 0; i < n; i++)
    {
      for (j = 0; j < n; j++)
	{
	  if (closure[i][j])
	    goto item_constrained;
	}
      /* Item i can be output */
      vec_add1 (result, i);
      {
	int k;
	for (k = 0; k < n; k++)
	  closure[k][i] = 0;
	/* "Magic" a before a, to keep from ever outputting it again */
	closure[i][i] = 1;
	goto again;
      }
    item_constrained:
      ;
    }

  if (vec_len (result) != n)
    {
      clib_warning ("no partial order exists");
      exit (1);
    }

  fformat (stdout, "Partial order:\n");

  for (i = vec_len (result) - 1; i >= 0; i--)
    {
      fformat (stdout, "%s\n", items[result[i]]);
    }

  vec_free (result);
  clib_ptclosure_free (orig);
  clib_ptclosure_free (closure);

  return 0;
}
예제 #25
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;
}
예제 #26
0
int test_standalone_string_main (unformat_input_t * input)
{
  uword iter = 0;
  uword help = 0;

  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
    {
      if (0 == unformat (input, "iter %d", &iter)
	  && 0 == unformat (input, "bytes %d", &g_bytes)
	  && 0 == unformat (input, "seed %d", &g_seed)
	  && 0 == unformat (input, "align %d", &g_align)
	  && 0 == unformat (input, "overlap %d", &g_overlap)
	  && 0 == unformat (input, "verbose %d", &g_verbose)
	  && 0 == unformat (input, "swap %=", &g_swap, 1)
	  && 0 == unformat (input, "help %=", &help, 1))
	{
	  clib_error ("unknown input `%U'", format_unformat_error, input);
	  goto usage;
	}
    }

  if (help)
    goto usage;

  fformat (stdout, "iter %d, bytes %d, seed %u, align %d, overlap %d, "
	   "verbose %d, %s\n",
	   iter, g_bytes, g_seed, g_align, g_overlap, g_verbose,
	   (g_swap) ? "swap" : "");

#if 1
  assert_memset (iter);
  assert_memcpy (iter);
  assert_memmove (iter);
  assert_memcmp (iter);
  assert_strlen (iter);
#endif

  if (g_bytes < 64)
    {
      fformat (stdout, "To ensure fairness in timing, the number of bytes "
	       "to process needs to be at least 64\n");
      return -1;
    }


#if 1
  time_memset (iter);
  time_memcpy (iter);
  time_memmove (iter);
  time_memcmp (iter);
  time_strcpy (iter);
#endif

  memory_snap ();
  return 0;

 usage:
  fformat (stdout,
	   "Usage: test_standalone_string iter <N> bytes <N> seed <N>\n"
	   "                              align <N> overlap <N> verbose <N>\n"
	   "                              swap help\n");
  if (help)
    return 0;

  return -1;
}
예제 #27
0
파일: test_ha.c 프로젝트: chrisy/vpp
int
main (int argc, char **argv)
{
  test_main_t *tm = &test_main;
  api_main_t *am = &api_main;
  u32 swt_pid = 0;
  int connected = 0;

  signal (SIGINT, signal_handler);

  while (1)
    {
      if (tm->signal_received)
	break;

      if (am->shmem_hdr)
	swt_pid = am->shmem_hdr->vl_pid;

      /* If kill returns 0, the vpe-f process is alive */
      if (kill (swt_pid, 0) == 0)
	{
	  /* Try to connect */
	  if (connected == 0)
	    {
	      fformat (stdout, "Connect to VPE-f\n");
	      if (connect_to_vpe ("test_ha_client") >= 0)
		{
		  tm->pings_sent = 0;
		  tm->pings_replied = 0;
		  connected = 1;
		}
	      else
		{
		  fformat (stdout, "Connect failed, sleep and retry...\n");
		  sleep (1);
		  continue;
		}
	    }
	  tm->pings_sent++;
	  ping (tm);

	  sleep (1);

	  /* havent heard back in 3 seconds, disco / reco */
	  if ((tm->pings_replied + 3) <= tm->pings_sent)
	    {
	      fformat (stdout, "VPE-f pid %d not responding\n", swt_pid);
	      swt_pid = 0;
	      disconnect_from_vpe ();
	      connected = 0;
	    }
	}
      else
	{
	  if (connected)
	    {
	      fformat (stdout, "VPE-f pid %d died\n", swt_pid);
	      swt_pid = 0;
	      disconnect_from_vpe ();
	      connected = 0;
	    }
	  sleep (1);
	}
    }

  fformat (stdout, "Signal received, graceful exit\n");
  disconnect_from_vpe ();
  exit (0);
}
예제 #28
0
int
main (int argc, char **argv)
{
  unformat_input_t input;
  char *chroot_path = 0;
  u8 *chroot_path_u8;
  int interval = 0;
  f64 *vector_ratep, *rx_ratep, *sig_error_ratep;
  pid_t *vpp_pidp;
  svmdb_map_args_t _ma, *ma = &_ma;
  int uid, gid, rv;
  struct passwd _pw, *pw;
  struct group _grp, *grp;
  char *s, buf[128];

  unformat_init_command_line (&input, argv);

  uid = geteuid ();
  gid = getegid ();

  while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
    {
      if (unformat (&input, "chroot %s", &chroot_path_u8))
	{
	  chroot_path = (char *) chroot_path_u8;
	}
      else if (unformat (&input, "interval %d", &interval))
	;
      else if (unformat (&input, "uid %d", &uid))
	;
      else if (unformat (&input, "gid %d", &gid))
	;
      else if (unformat (&input, "uid %s", &s))
	{
	  /* lookup the username */
	  pw = NULL;
	  rv = getpwnam_r (s, &_pw, buf, sizeof (buf), &pw);
	  if (rv < 0)
	    {
	      fformat (stderr, "cannot fetch username %s", s);
	      exit (1);
	    }
	  if (pw == NULL)
	    {
	      fformat (stderr, "username %s does not exist", s);
	      exit (1);
	    }
	  vec_free (s);
	  uid = pw->pw_uid;
	}
      else if (unformat (&input, "gid %s", &s))
	{
	  /* lookup the group name */
	  grp = NULL;
	  rv = getgrnam_r (s, &_grp, buf, sizeof (buf), &grp);
	  if (rv != 0)
	    {
	      fformat (stderr, "cannot fetch group %s", s);
	      exit (1);
	    }
	  if (grp == NULL)
	    {
	      fformat (stderr, "group %s does not exist", s);
	      exit (1);
	    }
	  vec_free (s);
	  gid = grp->gr_gid;
	}
      else
	{
	  fformat (stderr,
		   "usage: vpp_get_metrics [chroot <path>] [interval <nn>]\n");
	  exit (1);
	}
    }

  setup_signal_handlers ();

  clib_memset (ma, 0, sizeof (*ma));
  ma->root_path = chroot_path;
  ma->uid = uid;
  ma->gid = gid;

  c = svmdb_map (ma);

  vpp_pidp =
    svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC, "vpp_pid");
  vector_ratep =
    svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC,
					"vpp_vector_rate");
  rx_ratep =
    svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC,
					"vpp_input_rate");
  sig_error_ratep =
    svmdb_local_get_variable_reference (c, SVMDB_NAMESPACE_VEC,
					"vpp_sig_error_rate");

  /*
   * Make sure vpp is actually running. Otherwise, there's every
   * chance that the database region will be wiped out by the
   * process monitor script
   */

  if (vpp_pidp == 0 || vector_ratep == 0 || rx_ratep == 0
      || sig_error_ratep == 0)
    {
      fformat (stdout, "vpp not running\n");
      exit (1);
    }

  do
    {
      /*
       * Once vpp exits, the svm db region will be recreated...
       * Can't use kill (*vpp_pidp, 0) if running as non-root /
       * accessing the shared-VM database via group perms.
       */
      if (*vpp_pidp == 0)
	{
	  fformat (stdout, "vpp not running\n");
	  exit (1);
	}
      fformat (stdout,
	       "%d: vpp_vector_rate=%.2f, vpp_input_rate=%f, vpp_sig_error_rate=%f\n",
	       *vpp_pidp, *vector_ratep, *rx_ratep, *sig_error_ratep);

      if (interval)
	sleep (interval);
      if (signal_received)
	break;
    }
  while (interval);

  svmdb_unmap (c);
  exit (0);
}
예제 #29
0
void SPI_FLASH_Format (void) {
	fformat("S:");
}
예제 #30
0
파일: test_pneum.c 프로젝트: Venkattk/vpp
int main (int argc, char ** argv)
{
  api_main_t * am = &api_main;
  vl_api_show_version_t message;
  vl_api_show_version_t *mp;
  int async = 1;
  int rv = pneum_connect("pneum_client");

  if (rv != 0) {
    printf("Connect failed: %d\n", rv);
    exit(rv);
  }
 
 struct timeb timer_msec;
  long long int timestamp_msec_start; /* timestamp in millisecond. */
  if (!ftime(&timer_msec)) {
    timestamp_msec_start = ((long long int) timer_msec.time) * 1000ll + 
      (long long int) timer_msec.millitm;
  }
  else {
    timestamp_msec_start = -1;
  }

 
  /*
   * Test vpe_api_write and vpe_api_read to send and recv message for an
   * API 
   */
  int i;
  long int no_msgs = 10000;
  mp = &message;

  for (i = 0; i < no_msgs; i++) {
    /* Construct the API message */
    M_NOALLOC(SHOW_VERSION, show_version);
    pneum_write((char *)mp, sizeof(*mp));
    if (!async)
      while (result_ready == 0);
  }
  if (async) {
    vl_api_control_ping_t control;
    vl_api_control_ping_t *mp;
    mp = &control;
    M_NOALLOC(CONTROL_PING, control_ping);
    pneum_write((char *)mp, sizeof(*mp));

    while (result_msg_id != VL_API_CONTROL_PING_REPLY);
  }

  long long int timestamp_msec_end; /* timestamp in millisecond. */
  if (!ftime(&timer_msec)) {
    timestamp_msec_end = ((long long int) timer_msec.time) * 1000ll + 
      (long long int) timer_msec.millitm;
  }
  else {
    timestamp_msec_end = -1;
  }
  
  printf("Took %lld msec, %lld msgs/msec \n", (timestamp_msec_end - timestamp_msec_start),
	 no_msgs/(timestamp_msec_end - timestamp_msec_start));
  fformat(stdout, "Exiting...\n");
  pneum_disconnect();
  exit (0);
}