static gpointer test_sliced_mem_thread (gpointer data) { guint32 rand_accu = 2147483563; guint i, j; guint8 **ps; guint *ss; /* 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); } 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] = g_slice_alloc (ss[i] + corruption()); for (j = 0; j < number_of_repetitions; j++) { /* free number_of_blocks/2 blocks */ for (i = 0; i < number_of_blocks; i += 2) g_slice_free1 (ss[i] + corruption(), ps[i] + corruption()); /* 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] = g_slice_alloc (ss[i] + corruption()); } } /* free number_of_blocks blocks */ for (i = 0; i < number_of_blocks; i++) g_slice_free1 (ss[i] + corruption(), ps[i] + corruption()); /* 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] = g_slice_alloc (sz + corruption()); for (j = 0; j < k; j++) g_slice_free1 (sz + corruption(), ps[j] + corruption()); } g_free (ps); g_free (ss); return NULL; }
static GdkAtom setup_buffer (GtkTextBuffer *buffer) { const guint tlen = strlen (example_text); const guint tcount = 17; GtkTextTag **tags; GtkTextTagTable *ttable = gtk_text_buffer_get_tag_table (buffer); GSList *node, *slist = NULL; GdkAtom atom; guint i; tags = g_malloc (sizeof (GtkTextTag *) * tcount); /* cleanup */ gtk_text_buffer_set_text (buffer, "", 0); gtk_text_tag_table_foreach (ttable, text_tag_enqueue, &slist); for (node = slist; node; node = node->next) gtk_text_tag_table_remove (ttable, node->data); g_slist_free (slist); /* create new tags */ for (i = 0; i < tcount; i++) { char *s = g_strdup_printf ("tag%u", i); tags[i] = gtk_text_buffer_create_tag (buffer, s, "weight", quick_rand32() >> 31 ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, "style", quick_rand32() >> 31 ? PANGO_STYLE_OBLIQUE : PANGO_STYLE_NORMAL, "underline", quick_rand32() >> 31, NULL); g_free (s); } /* assign text and tags */ gtk_text_buffer_set_text (buffer, example_text, -1); for (i = 0; i < tcount * 5; i++) { gint a = quick_rand32() % tlen, b = quick_rand32() % tlen; GtkTextIter start, end; gtk_text_buffer_get_iter_at_offset (buffer, &start, MIN (a, b)); gtk_text_buffer_get_iter_at_offset (buffer, &end, MAX (a, b)); gtk_text_buffer_apply_tag (buffer, tags[i % tcount], &start, &end); } /* return serialization format */ atom = gtk_text_buffer_register_deserialize_tagset (buffer, NULL); gtk_text_buffer_deserialize_set_can_create_tags (buffer, atom, TRUE); g_free (tags); return atom; }
static void test_closure (GClosure *closure) { /* try to produce high contention in closure->ref_count */ guint i = 0, n = quick_rand32() % 199; for (i = 0; i < n; i++) g_closure_ref (closure); g_closure_sink (closure); /* NOP */ for (i = 0; i < n; i++) g_closure_unref (closure); }
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; }