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; }
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; }