test_signal.c (4436B)
1 /* Copyright (C) 2013-2023, 2025 Vincent Forest (vaplv@free.fr) 2 * 3 * The RSys library is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published 5 * by the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * The RSys library is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with the RSys library. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "mem_allocator.h" 17 #include "signal.h" 18 19 struct ctxt { 20 int sig0_func1_invoked; 21 int sig0_func2_sum; 22 int sig1_func_sum; 23 }; 24 25 enum test_signal { 26 SIG0, 27 SIG1, 28 SIG2, 29 SIG3, 30 SIGNALS_COUNT 31 }; 32 33 static void 34 sig0_func1(struct ctxt* ctxt, void* data) 35 { 36 CHK(data == NULL); 37 ctxt->sig0_func1_invoked = 1; 38 } 39 40 static void 41 sig0_func2(struct ctxt* ctxt, void* data) 42 { 43 CHK(data != NULL); 44 ctxt->sig0_func2_sum += *((int*)data); 45 } 46 47 static void 48 sig1_func(struct ctxt* ctxt, void* data) 49 { 50 CHK(data != NULL); 51 ctxt->sig1_func_sum += *(int*)data; 52 } 53 54 static void 55 sig2_func( void* data ) 56 { 57 CHK(data != NULL); 58 *(uint32_t*)data = 0xDECAFBAD; 59 } 60 61 static void 62 sig3_func(int i, float f, char c, void* data) 63 { 64 CHK(data != NULL); 65 CHK(i == 3); 66 CHK(f == 4.0f); 67 CHK(c == 'a'); 68 *(uint32_t*)data = 0xDECAFBAD; 69 } 70 71 int 72 main(int argc, char** argv) 73 { 74 signal_T signals[SIGNALS_COUNT]; 75 76 CLBK(clbk_T, ARG1(struct ctxt*)); 77 CLBK(clbk2_T, ARG0()); 78 CLBK(clbk3_T, ARG3(int, float, char)); 79 80 struct ctxt ctxt; 81 clbk_T clbk0_a; 82 clbk_T clbk0_b; 83 clbk_T clbk0_c; 84 clbk_T clbk1_a; 85 clbk_T clbk1_b; 86 clbk2_T clbk2; 87 clbk3_T clbk3; 88 int i = 0; 89 int array[] = { 12, -1, 2, 1 }; 90 uint32_t clbk_data = 0; 91 92 (void)argc, (void)argv; 93 94 FOR_EACH(i, 0, SIGNALS_COUNT) 95 SIG_INIT(&signals[i]); 96 97 CLBK_INIT(&clbk0_a); 98 CLBK_INIT(&clbk0_b); 99 CLBK_INIT(&clbk0_c); 100 CLBK_INIT(&clbk1_a); 101 CLBK_INIT(&clbk1_b); 102 CLBK_SETUP(&clbk0_a, sig0_func1, NULL); 103 CLBK_SETUP(&clbk0_b, sig0_func2, array + 0); 104 CLBK_SETUP(&clbk0_c, sig0_func2, array + 1); 105 CLBK_SETUP(&clbk1_a, sig1_func, array + 2); 106 CLBK_SETUP(&clbk1_b, sig1_func, array + 3); 107 108 ctxt.sig0_func1_invoked = 0; 109 ctxt.sig0_func2_sum = 0; 110 ctxt.sig1_func_sum = 0; 111 112 SIG_BROADCAST(&signals[SIG0], clbk_T, ARG1(&ctxt)); 113 CHK(ctxt.sig0_func1_invoked == 0); 114 CHK(ctxt.sig0_func2_sum == 0); 115 CHK(ctxt.sig1_func_sum == 0); 116 117 SIG_BROADCAST(&signals[SIG1], clbk_T, ARG1(&ctxt)); 118 CHK(ctxt.sig0_func1_invoked == 0); 119 CHK(ctxt.sig0_func2_sum == 0); 120 CHK(ctxt.sig1_func_sum == 0); 121 122 SIG_CONNECT_CLBK(&signals[SIG0], &clbk0_a); 123 SIG_CONNECT_CLBK(&signals[SIG0], &clbk0_b); 124 SIG_CONNECT_CLBK(&signals[SIG0], &clbk0_c); 125 SIG_BROADCAST(&signals[SIG0], clbk_T, ARG1(&ctxt)); 126 CHK(ctxt.sig0_func1_invoked == 1); 127 CHK(ctxt.sig0_func2_sum == 11); 128 CHK(ctxt.sig1_func_sum == 0); 129 130 CLBK_DISCONNECT(&clbk0_c); 131 ctxt.sig0_func1_invoked = 0; 132 ctxt.sig0_func2_sum = 0; 133 ctxt.sig1_func_sum = 0; 134 SIG_BROADCAST(&signals[SIG0], clbk_T, ARG1(&ctxt)); 135 CHK(ctxt.sig0_func1_invoked == 1); 136 CHK(ctxt.sig0_func2_sum == 12); 137 CHK(ctxt.sig1_func_sum == 0); 138 139 SIG_CONNECT_CLBK(&signals[SIG1], &clbk1_a); 140 SIG_BROADCAST(&signals[SIG0], clbk_T, ARG1(&ctxt)); 141 CHK(ctxt.sig0_func1_invoked == 1); 142 CHK(ctxt.sig0_func2_sum == 24); 143 CHK(ctxt.sig1_func_sum == 0); 144 145 SIG_BROADCAST(&signals[SIG1], clbk_T, ARG1(&ctxt)); 146 CHK(ctxt.sig0_func1_invoked == 1); 147 CHK(ctxt.sig0_func2_sum == 24); 148 CHK(ctxt.sig1_func_sum == 2); 149 150 SIG_CONNECT_CLBK(&signals[SIG1], &clbk1_b); 151 SIG_BROADCAST(&signals[SIG1], clbk_T, ARG1(&ctxt)); 152 CHK(ctxt.sig0_func1_invoked == 1); 153 CHK(ctxt.sig0_func2_sum == 24); 154 CHK(ctxt.sig1_func_sum == 5); 155 156 CLBK_INIT(&clbk2); 157 CLBK_SETUP(&clbk2, sig2_func, &clbk_data); 158 SIG_CONNECT_CLBK(&signals[SIG2], &clbk2); 159 CHK(clbk_data == 0); 160 SIG_BROADCAST(&signals[SIG2], clbk2_T, ARG0()); 161 CHK(clbk_data == 0xDECAFBAD); 162 CLBK_DISCONNECT(&clbk2); 163 164 CLBK_INIT(&clbk3); 165 CLBK_SETUP(&clbk3, &sig3_func, &clbk_data); 166 SIG_CONNECT_CLBK(&signals[SIG3], &clbk3); 167 clbk_data = 0; 168 SIG_BROADCAST(&signals[SIG3], clbk3_T, ARG3(3, 4.0f, 'a')); 169 CHK(clbk_data == 0xDECAFBAD); 170 171 CHK(MEM_ALLOCATED_SIZE(&mem_default_allocator) == 0); 172 173 return 0; 174 }