/* This test file is intended to be compiled into a DLL. */
-#include <stdio.h>
-
#ifndef GC_DEBUG
# define GC_DEBUG
#endif
struct treenode *y;
};
-GC_TEST_EXPORT_API struct treenode * libsrl_mktree(int i)
-{
- struct treenode * r = GC_MALLOC(sizeof(struct treenode));
- if (0 == i) return 0;
- if (1 == i) r = GC_MALLOC_ATOMIC(sizeof(struct treenode));
- if (r) {
- r -> x = libsrl_mktree(i-1);
- r -> y = libsrl_mktree(i-1);
+static struct treenode *root[10] = { 0 };
+static struct treenode *root_nz[10] = { (void *)(GC_word)2 };
+
+#ifdef STATICROOTSLIB2
+# define libsrl_getpelem libsrl_getpelem2
+#else
+
+ GC_TEST_EXPORT_API struct treenode * libsrl_mktree(int i)
+ {
+ struct treenode * r = GC_MALLOC(sizeof(struct treenode));
+ if (0 == i) return 0;
+ if (1 == i) r = GC_MALLOC_ATOMIC(sizeof(struct treenode));
+ if (r) {
+ r -> x = libsrl_mktree(i-1);
+ r -> y = libsrl_mktree(i-1);
+ }
+ return r;
}
- return r;
-}
-GC_TEST_EXPORT_API void * libsrl_init(void)
+ GC_TEST_EXPORT_API void * libsrl_init(void)
+ {
+# ifndef STATICROOTSLIB_INIT_IN_MAIN
+ GC_INIT();
+# endif
+ return GC_MALLOC(sizeof(struct treenode));
+ }
+
+#endif /* !STATICROOTSLIB2 */
+
+GC_TEST_EXPORT_API struct treenode ** libsrl_getpelem(int i, int j)
{
- GC_INIT();
- return GC_MALLOC(sizeof(struct treenode));
+ return &((j & 1) != 0 ? root_nz : root)[i];
}
struct treenode *root[10] = { NULL };
+/* Same as "root" variable but initialized to some non-zero value (to */
+/* be placed to .data section instead of .bss). */
+struct treenode *root_nz[10] = { (void *)(GC_word)1 };
+
static char *staticroot = 0;
GC_TEST_IMPORT_API struct treenode * libsrl_mktree(int i);
GC_TEST_IMPORT_API void * libsrl_init(void);
+GC_TEST_IMPORT_API struct treenode ** libsrl_getpelem(int i, int j);
+
+GC_TEST_IMPORT_API struct treenode ** libsrl_getpelem2(int i, int j);
int main(void)
{
int i, j;
+# ifdef STATICROOTSLIB_INIT_IN_MAIN
+ GC_INIT();
+# endif
staticroot = libsrl_init();
if (NULL == staticroot) {
fprintf(stderr, "GC_malloc returned NULL\n");
}
memset(staticroot, 0x42, sizeof(struct treenode));
GC_gcollect();
- for (j = 0; j < 2; j++) {
- for (i = 0; i < 10; ++i) {
- root[i] = libsrl_mktree(12);
+ for (j = 0; j < 4; j++) {
+ for (i = 0; i < (int)(sizeof(root) / sizeof(root[0])); ++i) {
+# ifdef STATICROOTSLIB2
+ *libsrl_getpelem2(i, j) = libsrl_mktree(12);
+# endif
+ *libsrl_getpelem(i, j) = libsrl_mktree(12);
+ ((j & 1) != 0 ? root_nz : root)[i] = libsrl_mktree(12);
GC_gcollect();
}
for (i = 0; i < (int)sizeof(struct treenode); ++i) {