Exemple #1
0
unsigned int cron_add(CronTimeType type, double seconds, int (*handler)(void *data), void *data)
{
	Job	*j;
	List	*id;

	if(type > 2)
		return 0;
	if(handler == NULL)
		return 0;

	j = memchunk_alloc(cron_info.chunk_job);
	if((id = cron_info.id_reuse) != NULL)
	{
		j->id = (unsigned int) list_data(id);
		cron_info.id_reuse = list_unlink(cron_info.id_reuse, cron_info.id_reuse);
	}
	else
		j->id = cron_info.id_next++;
	j->handler = handler;
	j->data = data;

	if(type == CRON_ONESHOT)
	{
		timeval_future(&j->when.oneshot, seconds);
		cron_info.oneshot = list_append(cron_info.oneshot, j);
	}
	else if(type == CRON_PERIODIC || type == CRON_PERIODIC_SOON)
	{
		j->id = PERIODIC_SET(j->id);
		j->when.periodic.period = seconds;
		j->when.periodic.bucket = type == CRON_PERIODIC_SOON ? seconds - 0.5 : 0.0;
		cron_info.periodic = list_append(cron_info.periodic, j);
	}
	return j->id;
}
Exemple #2
0
static gpointer
test_memchunk_thread (gpointer data)
{
  GMemChunk **memchunks;
  guint i, j;
  guint8 **ps;
  guint   *ss;
  guint32 rand_accu = 2147483563;
  /* initialize random numbers */
  if (data)
    rand_accu = *(guint32*) data;
  else
    {
      GTimeVal rand_tv;
      g_get_current_time (&rand_tv);
      rand_accu = rand_tv.tv_usec + (rand_tv.tv_sec << 16);
    }

  /* prepare for memchunk creation */
  memchunks = g_alloca (sizeof (memchunks[0]) * prime_size);
  memset (memchunks, 0, sizeof (memchunks[0]) * prime_size);

  ps = g_new (guint8*, number_of_blocks);
  ss = g_new (guint, number_of_blocks);
  /* create number_of_blocks random sizes */
  for (i = 0; i < number_of_blocks; i++)
    ss[i] = quick_rand32() % prime_size;
  /* allocate number_of_blocks blocks */
  for (i = 0; i < number_of_blocks; i++)
    ps[i] = memchunk_alloc (&memchunks[ss[i]], ss[i]);
  for (j = 0; j < number_of_repetitions; j++)
    {
      /* free number_of_blocks/2 blocks */
      for (i = 0; i < number_of_blocks; i += 2)
        memchunk_free (memchunks[ss[i]], ps[i]);
      /* allocate number_of_blocks/2 blocks with new sizes */
      for (i = 0; i < number_of_blocks; i += 2)
        {
          ss[i] = quick_rand32() % prime_size;
          ps[i] = memchunk_alloc (&memchunks[ss[i]], ss[i]);
        }
    }
  /* free number_of_blocks blocks */
  for (i = 0; i < number_of_blocks; i++)
    memchunk_free (memchunks[ss[i]], ps[i]);
  /* alloc and free many equally sized chunks in a row */
  for (i = 0; i < number_of_repetitions; i++)
    {
      guint sz = quick_rand32() % prime_size;
      guint k = number_of_blocks / 100;
      for (j = 0; j < k; j++)
        ps[j] = memchunk_alloc (&memchunks[sz], sz);
      for (j = 0; j < k; j++)
        memchunk_free (memchunks[sz], ps[j]);
    }
  /* cleanout memchunks */
  for (i = 0; i < prime_size; i++)
    if (memchunks[i])
      old_mem_chunk_destroy (memchunks[i]);
  g_free (ps);
  g_free (ss);

  return NULL;
}