]> Kevux Git Server - fll/commitdiff
Update: Use typedef on a structure tag to avoid the need for void pointer on the...
authorKevin Day <kevin@kevux.org>
Fri, 9 Feb 2024 05:10:34 +0000 (23:10 -0600)
committerKevin Day <kevin@kevux.org>
Fri, 9 Feb 2024 05:10:34 +0000 (23:10 -0600)
Using a typedef on the structure tag allows for having the structure reference itself.
In this case, the callback that is part of the structure accepts its own structure as one of the callback parameters.

I previously did not know that I could do this and opted to use a void pointer to provide this.
With this approach I get more safety, integrity, and less memory usage (for not having to add a variable that is a cast of the void pointer to the f_state_t).

level_0/f_type/c/type/state.h
level_2/fll_program/c/program.c
level_2/fll_program/c/program.h
level_3/controller/c/thread/private-thread_signal.c
level_3/fake/c/main/signal.c
level_3/fake/c/main/signal.h

index 311516eeb990595ed1d4e96730912dcf37d6b3aa..5c5b236bcaed9a65d0d35bb2751579dda2634983 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
  * This allows for the error to be processed with all relevant data before the function returns.
  *
  * These two callbacks (handle() and interrupt()) accept the following parameters:
- *   - state:    The state data. Must be of type f_state_t. Must not be NULL.
+ *   - state:    The state data. Must not be NULL.
  *   - internal: Additional data passed by the function being called, often containing internal data to the called function. May be NULL.
  *
  * The "custom" property on f_state_t is intended to be used so that the callback, such as the interrupt(), can make changes to something within the scope of the parent.
@@ -65,20 +65,21 @@ extern "C" {
  *   - data:       A structure (defined by function) for holding data relevant to the function. May be NULL. May be required.
  */
 #ifndef _di_f_state_t_
-  typedef struct {
+  typedef struct f_state_t_ f_state_t;
+  struct f_state_t_ {
     uint16_t step_large;
     uint16_t step_small;
     f_status_t status;
     uint64_t flag;
     uint64_t code;
 
-    void (*handle)(void * const state, void * const internal);
-    void (*interrupt)(void * const state, void * const internal);
+    void (*handle)(f_state_t * const state, void * const internal);
+    void (*interrupt)(f_state_t * const state, void * const internal);
 
     void *callbacks;
     void *custom;
     void *data;
-  } f_state_t;
+  };
 
   #define f_state_t_initialize { \
     F_memory_default_allocation_large_d, \
index 6d15b318a5cae18ee480a18b43d32a83ec3172bd..ee6cb755d466a51999beb313e55144b57c6f0dfc 100644 (file)
@@ -532,13 +532,11 @@ extern "C" {
 #endif // _di_fll_program_standard_signal_received_
 
 #ifndef _di_fll_program_standard_signal_handle_
-  void fll_program_standard_signal_handle(void * const void_state, void * const internal) {
+  void fll_program_standard_signal_handle(f_state_t * const state, void * const internal) {
     #ifndef _di_level_2_parameter_checking_
-      if (!void_state) return;
+      if (!state) return;
     #endif // _di_level_2_parameter_checking_
 
-    f_state_t * const state = (f_state_t *) void_state;
-
     if (!state->custom) {
       state->status = F_interrupt_not;
 
index f2aea888f6a15f614c53c67b09e9d3c29f57646d..94c657906cf3c4ebe33f95662e22f69d2f91e280 100644 (file)
@@ -419,7 +419,7 @@ extern "C" {
  * @see fll_program_standard_signal_received()
  */
 #ifndef _di_fll_program_standard_signal_handle_
-  extern void fll_program_standard_signal_handle(void * const state, void * const internal);
+  extern void fll_program_standard_signal_handle(f_state_t * const state, void * const internal);
 #endif // _di_fll_program_standard_signal_handle_
 
 #ifdef __cplusplus
index 398b41ad3e7929240ac71f987881b53ec1222fc4..a46e145d0328ccf0f16335929af65705b3c38993 100644 (file)
@@ -43,19 +43,13 @@ extern "C" {
 #endif // _di_controller_thread_signal_
 
 #ifndef _di_controller_thread_signal_state_fss_
-  f_status_t controller_thread_signal_state_fss(void * const state, void * const internal) {
+  f_status_t controller_thread_signal_state_fss(f_state_t * const state, void * const internal) {
 
-    if (!state) {
+    if (!state || !state->custom) {
       return F_interrupt_not;
     }
 
-    f_state_t *state_ptr = (f_state_t *) state;
-
-    if (!state_ptr->custom) {
-      return F_interrupt_not;
-    }
-
-    controller_state_interrupt_t *custom = (controller_state_interrupt_t *) state_ptr->custom;
+    controller_state_interrupt_t *custom = (controller_state_interrupt_t *) state->custom;
     controller_thread_t *thread = custom->thread;
 
     if (!controller_thread_is_enabled(custom->is_normal, thread)) {
@@ -73,17 +67,11 @@ extern "C" {
 #ifndef _di_controller_thread_signal_state_iki_
   f_status_t controller_thread_signal_state_iki(void * const state, void * const internal) {
 
-    if (!state) {
-      return F_interrupt_not;
-    }
-
-    f_state_t *state_ptr = (f_state_t *) state;
-
-    if (!state_ptr->custom) {
+    if (!state || !state->custom) {
       return F_interrupt_not;
     }
 
-    controller_state_interrupt_t *custom = (controller_state_interrupt_t *) state_ptr->custom;
+    controller_state_interrupt_t *custom = (controller_state_interrupt_t *) state->custom;
     controller_thread_t *thread = custom->thread;
 
     if (!controller_thread_is_enabled(custom->is_normal, thread)) {
index 80bc0859c06d93b26f967459fe92b584b4388a31..f2188d6270e453592c349ecd71f16709fc02e18d 100644 (file)
@@ -107,11 +107,9 @@ extern "C" {
 #endif // !defined(_di_fake_signal_handler_) && !defined(_di_thread_support_)
 
 #ifndef _di_fake_signal_handler_callback_
-  void fake_signal_handler_callback(void * const void_state, void * const void_internal) {
+  void fake_signal_handler_callback(f_state_t * const state, void * const void_internal) {
 
-    if (!void_state) return;
-
-    f_state_t * const state = (f_state_t *) void_state;
+    if (!state) return;
 
     if (!state->custom) {
       state->status = F_interrupt_not;
index 87ac4df7629f6eb5e056eb6d3c21253f99ed9e56..16ec7405ceaeb7666804f44291469f0d3a77ca19 100644 (file)
@@ -96,7 +96,7 @@ extern "C" {
  *   Not used.
  */
 #ifndef _di_fake_signal_handler_callback_
-  extern void fake_signal_handler_callback(void * const state, void * const internal);
+  extern void fake_signal_handler_callback(f_state_t * const state, void * const internal);
 #endif // _di_fake_signal_handler_callback_
 
 #ifdef __cplusplus