rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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 }