source: src/tests/init_once.c@ 7fe4cc3e

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since 7fe4cc3e was 85f0713, checked in by Rob Schluntz <rschlunt@…>, 9 years ago

add init_once and dtor-early-exit tests

  • Property mode set to 100644
File size: 3.4 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// init_once.c --
8//
9// Author : Rob Schluntz
10// Created On : Tue Jun 14 15:43:35 2016
11// Last Modified By : Rob Schluntz
12// Last Modified On : Tue Jun 14 15:45:03 2016
13// Update Count : 1
14//
15
16// want to ensure ctor/dtor called at most once per object.
17// whole point of ctor/dtor is that you don't know what's in
18// memory when it's first called, so can't rely on member to
19// determine if this is true. instead, keep an array
20// of addresses that have been constructed and remove the element
21// when it's destructed (and vice-versa)
22
23//*** setup
24extern "C" {
25typedef unsigned long int size_t;
26#define NULL 0
27void * malloc(size_t);
28void free(void *);
29#define assert(cond) if (! (cond)) { printf("Assertion failed: (%s) at %s:%d\n", #cond, __FILE__, __LINE__); abort(); }
30void abort();
31int printf(const char *, ...);
32void *memset(void *s, int c, size_t n);
33}
34
35// dummy type
36struct init_once { int * x; };
37
38// array and operations
39// const int size = 1024;
40#define size 1024
41struct array {
42 init_once * elems[size];
43 int length;
44};
45void remove(array * arr, init_once * x) {
46 for (int i = 0; i < arr->length; i++) {
47 if ( arr->elems[i] == x ) {
48 arr->elems[i] = arr->elems[--arr->length];
49 return;
50 }
51 }
52}
53void insert(array * arr, init_once * x) {
54 assert( arr->length < size );
55 arr->elems[arr->length++] = x;
56}
57int find(array * arr, init_once * x) {
58 for (int i = 0; i < arr->length; i++) {
59 if ( arr->elems[i] == x ) {
60 return i;
61 }
62 }
63 return -1;
64}
65void ?{}(array * arr) {
66 memset(arr->elems, 0, sizeof(arr->elems));
67 arr->length = 0;
68}
69array constructed;
70array destructed;
71
72void ?{}(init_once * x) {
73 assert( find( &constructed, x ) == -1 );
74 remove( &destructed, x );
75 insert( &constructed, x );
76
77 x->x = malloc(sizeof(int));
78}
79
80void ?{}(init_once * x, init_once other) {
81 x{}; // reuse default ctor
82}
83
84void ^?{}(init_once * x) {
85 assert( find( &destructed, x ) == -1 );
86 remove( &constructed, x );
87 insert( &destructed, x );
88
89 free(x->x);
90}
91//*** end setup
92
93// test globals
94init_once x;
95init_once y = x;
96
97int main() {
98 // local variables
99 init_once x;
100 init_once y = x;
101
102 // block scoped variables
103 {
104 init_once x;
105 init_once y = x;
106 }
107
108 // loop variables
109 for (int i = 0 ; i < 10; i++) {
110 init_once x;
111 init_once y = x;
112 }
113 int i = 0;
114 while (i < 10) {
115 init_once x;
116 init_once y = x;
117 i++;
118 }
119
120 // declared in a switch block with a break
121 for (int i = 0; i < 10; i++) {
122 switch (10) {
123 case 1: {
124 init_once x;
125 init_once y = x;
126 (&x) {}; // ensure this doesn't execute
127 break;
128 }
129 case 10: {
130 init_once x;
131 init_once y = x;
132 } // fall through
133 default: {
134 init_once x;
135 init_once y = x;
136 break;
137 }
138 }
139 }
140
141 // labeled break/continue
142 L3: for (int k = 0; k < 10; k++) {
143 init_once x;
144 init_once y = x;
145 L1: for (int i = 0; i < 10; i++){
146 init_once x;
147 init_once y = x;
148 L2: for (int j = 0; j < 10; j++) {
149 init_once x;
150 init_once y = x;
151
152 if (i == 0) continue L1;
153 if (i == 1) continue L2;
154 if (i == 2) break L2;
155 if (i == 3) break L1;
156 if (i == 4) continue L3;
157 if (i == 9) break L3;
158 // if (i == 5) goto ;
159 }
160 }
161 }
162
163
164}
165
166// Local Variables: //
167// tab-width: 4 //
168// compile-command: "cfa init_once.c" //
169// End: //
Note: See TracBrowser for help on using the repository browser.