Revision: 76602
          http://sourceforge.net/p/brlcad/code/76602
Author:   starseeker
Date:     2020-07-30 19:10:07 +0000 (Thu, 30 Jul 2020)
Log Message:
-----------
switch some of the callback calls to the wrapper functions

Modified Paths:
--------------
    brlcad/branches/bioh/include/ged/defines.h
    brlcad/branches/bioh/src/libged/draw/preview.c
    brlcad/branches/bioh/src/libged/exec.cpp
    brlcad/branches/bioh/src/libged/ged.c
    brlcad/branches/bioh/src/libged/ged_private.h
    brlcad/branches/bioh/src/libged/ged_util.c
    brlcad/branches/bioh/src/libged/joint/joint.c
    brlcad/branches/bioh/src/libged/rtcheck/rtcheck.c
    brlcad/branches/bioh/src/libged/view/data_lines.c

Modified: brlcad/branches/bioh/include/ged/defines.h
===================================================================
--- brlcad/branches/bioh/include/ged/defines.h  2020-07-30 17:28:23 UTC (rev 
76601)
+++ brlcad/branches/bioh/include/ged/defines.h  2020-07-30 19:10:07 UTC (rev 
76602)
@@ -89,10 +89,7 @@
 typedef void (*ged_create_vlist_solid_callback_ptr)(struct solid *);
 typedef void (*ged_create_vlist_callback_ptr)(struct display_list *);
 typedef void (*ged_free_vlist_callback_ptr)(unsigned int, int);
-#define GED_REFRESH_CALLBACK_PTR_NULL ((ged_refresh_callback_ptr)0)
-#define GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL 
((ged_create_vlist_solid_callback_ptr)0)
-#define GED_CREATE_VLIST_CALLBACK_PTR_NULL ((ged_create_vlist_callback_ptr)0)
-#define GED_FREE_VLIST_CALLBACK_PTR_NULL ((ged_free_vlist_callback_ptr)0)
+struct ged_callback_state;
 
 /**
  * Definition of global parallel-processing semaphores.
@@ -244,28 +241,31 @@
 
 
     /* Callbacks */
+    struct ged_callback_state    *ged_cbs;
     void                       (*ged_refresh_handler)(void *); /**< @brief  
function for handling refresh requests */
     void                       *ged_refresh_clientdata;        /**< @brief  
client data passed to refresh handler */
-
     void                       (*ged_output_handler)(struct ged *, char *);    
/**< @brief  function for handling output */
     void                       (*ged_create_vlist_solid_callback)(struct solid 
*);     /**< @brief  function to call after creating a vlist to create display 
list for solid */
     void                       (*ged_create_vlist_callback)(struct 
display_list *);    /**< @brief  function to call after all vlist created that 
loops through creating display list for each solid  */
     void                       (*ged_free_vlist_callback)(unsigned int, int);  
/**< @brief  function to call after freeing a vlist */
 
-    void *ged_interp; /* Temporary - do not rely on when designing new 
functionality */
-    db_search_callback_t ged_interp_eval; /* FIXME: broke the rule written on 
the previous line */
-
     /* Handler functions for I/O communication with asynchronous subprocess 
commands */
     int io_mode;
     void (*ged_create_io_handler)(void **chan, struct bu_process *p, int fd, 
int mode, void *data, ged_io_handler_callback_t callback);
     void (*ged_delete_io_handler)(void *interp, void *chan, struct bu_process 
*p, int fd, void *data, ged_io_handler_callback_t callback);
+    int                                ged_io_handler_callback_cnt;
 
     // Other callbacks...
-    // Tcl command strings: gdv_callback, gdv_edit_motion_delta_callback
-    // ged_obj: go_more_args_callback, go_rt_end_callback
+    // Tcl command strings - these are libtclcad level callbacks that execute 
user supplied Tcl commands if set:
+    // gdv_callback, gdv_edit_motion_delta_callback, go_more_args_callback, 
go_rt_end_callback
+    //
     // fbserv_obj: fbs_callback
-    // bview.h gv_callback
+    // bview.h gv_callback (only used by MGED?)
     // db_search_callback_t
+
+    void *ged_interp; /* Temporary - do not rely on when designing new 
functionality */
+    db_search_callback_t ged_interp_eval; /* FIXME: broke the rule written on 
the previous line */
+
 };
 
 /* accessor functions for ged_results - calling

Modified: brlcad/branches/bioh/src/libged/draw/preview.c
===================================================================
--- brlcad/branches/bioh/src/libged/draw/preview.c      2020-07-30 17:28:23 UTC 
(rev 76601)
+++ brlcad/branches/bioh/src/libged/draw/preview.c      2020-07-30 19:10:07 UTC 
(rev 76602)
@@ -146,8 +146,7 @@
        _ged_drawtrees(_ged_current_gedp, 
_ged_current_gedp->ged_gdp->gd_rt_cmd_len, (const char 
**)&_ged_current_gedp->ged_gdp->gd_rt_cmd[1], preview_mode, (struct 
_ged_client_data *)0);
     }
 
-    if (_ged_current_gedp->ged_refresh_handler != 
GED_REFRESH_CALLBACK_PTR_NULL)
-       
(*_ged_current_gedp->ged_refresh_handler)(_ged_current_gedp->ged_refresh_clientdata);
+    ged_refresh_cb(_ged_current_gedp);
 
     if (preview_delay > 0) {
        struct timeval tv;

Modified: brlcad/branches/bioh/src/libged/exec.cpp
===================================================================
--- brlcad/branches/bioh/src/libged/exec.cpp    2020-07-30 17:28:23 UTC (rev 
76601)
+++ brlcad/branches/bioh/src/libged/exec.cpp    2020-07-30 19:10:07 UTC (rev 
76602)
@@ -70,18 +70,6 @@
        bu_log("%s time: %g\n", argv[0], (bu_gettime() - start)/1e6);
     }
 
-    // TODO - for the moment these are the hardcoded default opts.  Eventually
-    // an opts var should be added to struct ged, and each exec call will set
-    // the gedp->opts value to the command defaults.  Then the command option 
handling
-    // will be able to alter the flags if desired (for example, a flag to 
suppress
-    // autoview behavior will simply remove the flag from gedp->opts.
-    if (cmd->i->opts & GED_CMD_UPDATE_VIEW) {
-       // Do update view callback
-       if (gedp->ged_refresh_handler) {
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
-       }
-    }
-
     return cret;
 }
 

Modified: brlcad/branches/bioh/src/libged/ged.c
===================================================================
--- brlcad/branches/bioh/src/libged/ged.c       2020-07-30 17:28:23 UTC (rev 
76601)
+++ brlcad/branches/bioh/src/libged/ged.c       2020-07-30 19:10:07 UTC (rev 
76602)
@@ -209,6 +209,7 @@
     free_object_selections(gedp->ged_selections);
     bu_hash_destroy(gedp->ged_selections);
 
+    BU_PUT(gedp->ged_cbs, struct ged_callback_state);
 }
 
 void
@@ -257,14 +258,25 @@
     gedp->freesolid = freesolid;
     gedp->ged_gdp->gd_freeSolids = freesolid;
 
-    /* (in)sanity */
+    /* Initialize callbacks */
+    BU_GET(gedp->ged_cbs, struct ged_callback_state);
+    gedp->ged_refresh_handler = NULL;
+    gedp->ged_refresh_clientdata = NULL;
+    gedp->ged_output_handler = NULL;
+    gedp->ged_create_vlist_solid_callback = NULL;
+    gedp->ged_create_vlist_callback = NULL;
+    gedp->ged_free_vlist_callback = NULL;
+    gedp->ged_create_io_handler = NULL;
+    gedp->ged_delete_io_handler = NULL;
+
+    /* Out of the gate we don't have display managers or views */
     gedp->ged_gvp = NULL;
     gedp->ged_dmp = NULL;
-    gedp->ged_refresh_clientdata = NULL;
-    gedp->ged_refresh_handler = NULL;
-    gedp->ged_output_handler = NULL;
+
+    /* ? */
     gedp->ged_output_script = NULL;
     gedp->ged_internal_call = 0;
+
 }
 
 
@@ -676,6 +688,81 @@
     rt_db_free_internal(&intern);
 }
 
+/* Callback wrapper functions */
+
+void
+ged_refresh_cb(struct ged *gedp)
+{
+    if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) {
+       gedp->ged_cbs->ged_refresh_handler_cnt++;
+       if (gedp->ged_cbs->ged_refresh_handler_cnt > 1) {
+           bu_log("Warning - recursive call of gedp->ged_refresh_handler!\n");
+       }
+       (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       gedp->ged_cbs->ged_refresh_handler_cnt--;
+    }
+}
+
+void
+ged_output_handler_cb(struct ged *gedp, char *str)
+{
+    if (gedp->ged_output_handler != (void (*)(struct ged *, char *))0) {
+       gedp->ged_cbs->ged_output_handler_cnt++;
+       if (gedp->ged_cbs->ged_output_handler_cnt > 1) {
+           bu_log("Warning - recursive call of gedp->ged_output_handler!\n");
+       }
+       (*gedp->ged_output_handler)(gedp, str);
+       gedp->ged_cbs->ged_output_handler_cnt--;
+    }
+}
+
+void
+ged_create_vlist_solid_cb(struct ged *gedp, struct solid *s)
+{
+    if (gedp->ged_create_vlist_solid_callback != 
GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL) {
+       gedp->ged_cbs->ged_create_vlist_solid_callback_cnt++;
+       if (gedp->ged_cbs->ged_create_vlist_solid_callback_cnt > 1) {
+           bu_log("Warning - recursive call of 
gedp->ged_create_vlist_solid_callback!\n");
+       }
+       (*gedp->ged_create_vlist_solid_callback)(s);
+       gedp->ged_cbs->ged_create_vlist_solid_callback_cnt--;
+    }
+}
+
+void
+ged_create_vlist_cb(struct ged *gedp, struct display_list *dl)
+{
+    if (gedp->ged_create_vlist_callback != GED_CREATE_VLIST_CALLBACK_PTR_NULL) 
{
+       gedp->ged_cbs->ged_create_vlist_callback_cnt++;
+       if (gedp->ged_cbs->ged_create_vlist_callback_cnt > 1) {
+           bu_log("Warning - recursive call of 
gedp->ged_create_vlist_callback!\n");
+       }
+       (*gedp->ged_create_vlist_callback)(dl);
+       gedp->ged_cbs->ged_create_vlist_callback_cnt--;
+    }
+}
+
+void
+ged_free_vlist_cb(struct ged *gedp, unsigned int i, int j)
+{
+    if (gedp->ged_free_vlist_callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) {
+       gedp->ged_cbs->ged_free_vlist_callback_cnt++;
+       if (gedp->ged_cbs->ged_free_vlist_callback_cnt > 1) {
+           bu_log("Warning - recursive call of 
gedp->ged_free_vlist_callback!\n");
+       }
+       (*gedp->ged_free_vlist_callback)(i, j);
+       gedp->ged_cbs->ged_free_vlist_callback_cnt--;
+    }
+}
+
+#if 0
+int
+ged_io_handler_cb(struct ged *, ged_io_handler_callback_t *cb, void *, int)
+{
+    if (
+}
+#endif
+
 /*
  * Local Variables:
  * mode: C

Modified: brlcad/branches/bioh/src/libged/ged_private.h
===================================================================
--- brlcad/branches/bioh/src/libged/ged_private.h       2020-07-30 17:28:23 UTC 
(rev 76601)
+++ brlcad/branches/bioh/src/libged/ged_private.h       2020-07-30 19:10:07 UTC 
(rev 76602)
@@ -82,6 +82,38 @@
 /* Default libged column width assumption */
 #define GED_TERMINAL_WIDTH 80
 
+
+
+/* Callback management related structures */
+#define GED_REFRESH_CALLBACK_PTR_NULL ((ged_refresh_callback_ptr)0)
+#define GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL 
((ged_create_vlist_solid_callback_ptr)0)
+#define GED_CREATE_VLIST_CALLBACK_PTR_NULL ((ged_create_vlist_callback_ptr)0)
+#define GED_FREE_VLIST_CALLBACK_PTR_NULL ((ged_free_vlist_callback_ptr)0)
+
+// Private bookkeeping structure used by callback handlers
+struct ged_callback_state {
+    int ged_refresh_handler_cnt;
+    int ged_output_handler_cnt;
+    int ged_create_vlist_solid_callback_cnt;
+    int ged_create_vlist_callback_cnt;
+    int ged_free_vlist_callback_cnt;
+    int ged_io_handler_callback_cnt;
+};
+
+/* These are wrapper functions, that should be called by libged code instead of
+ * the callback pointers supplied by the client (if any).  They will do the 
boilerplate
+ * bookkeeping and validation required by callbacks.
+ */
+GED_EXPORT extern void ged_refresh_cb(struct ged *);
+GED_EXPORT extern void ged_output_handler_cb(struct ged *, char *);
+GED_EXPORT extern void ged_create_vlist_solid_cb(struct ged *, struct solid *);
+GED_EXPORT extern void ged_create_vlist_cb(struct ged *, struct display_list 
*);
+GED_EXPORT extern void ged_free_vlist_cb(struct ged *, unsigned int, int);
+GED_EXPORT extern void ged_io_handler_cb(struct ged *, void *, int);
+
+
+
+
 struct _ged_funtab {
     char *ft_name;
     char *ft_parms;

Modified: brlcad/branches/bioh/src/libged/ged_util.c
===================================================================
--- brlcad/branches/bioh/src/libged/ged_util.c  2020-07-30 17:28:23 UTC (rev 
76601)
+++ brlcad/branches/bioh/src/libged/ged_util.c  2020-07-30 19:10:07 UTC (rev 
76602)
@@ -1360,7 +1360,7 @@
 
     /* handle (i.e., probably log to stderr) the resulting line */
     if (drcdp->gedp->ged_output_handler != (void (*)(struct ged *, char *))0)
-       drcdp->gedp->ged_output_handler(drcdp->gedp, line);
+       ged_output_handler_cb(drcdp->gedp, line);
     else
        bu_vls_printf(drcdp->gedp->ged_result_str, "%s", line);
 }

Modified: brlcad/branches/bioh/src/libged/joint/joint.c
===================================================================
--- brlcad/branches/bioh/src/libged/joint/joint.c       2020-07-30 17:28:23 UTC 
(rev 76601)
+++ brlcad/branches/bioh/src/libged/joint/joint.c       2020-07-30 19:10:07 UTC 
(rev 76602)
@@ -3231,8 +3231,7 @@
                    if (domesh) {
                        joint_mesh(gedp, 0, 0);
                        /* refreshing the screen */
-                       if (gedp->ged_refresh_handler != 
GED_REFRESH_CALLBACK_PTR_NULL)
-                           
(*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+                       ged_refresh_cb(gedp);
                    }
                    joint_clear();
                }
@@ -3292,8 +3291,7 @@
            joint_mesh(gedp, 0, 0);
 
            /* refreshing the screen */
-           if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-               (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+           ged_refresh_cb(gedp);
        }
     }
     if (count < loops) {
@@ -3325,8 +3323,7 @@
                joint_mesh(gedp, 0, 0);
 
                /* refreshing the screen */
-               if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-                   (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+               ged_refresh_cb(gedp);
            }
        }
     }
@@ -3342,8 +3339,7 @@
        joint_mesh(gedp, 0, 0);
 
        /* refreshing the screen */
-       if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       ged_refresh_cb(gedp);
     }
     return GED_OK;
 }
@@ -3462,8 +3458,7 @@
     joint_mesh(gedp, 0, 0);
 
     /* refreshing the screen */
-    if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-       (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+    ged_refresh_cb(gedp);
 
     return GED_OK;
 }

Modified: brlcad/branches/bioh/src/libged/rtcheck/rtcheck.c
===================================================================
--- brlcad/branches/bioh/src/libged/rtcheck/rtcheck.c   2020-07-30 17:28:23 UTC 
(rev 76601)
+++ brlcad/branches/bioh/src/libged/rtcheck/rtcheck.c   2020-07-30 19:10:07 UTC 
(rev 76602)
@@ -163,7 +163,7 @@
 
     line[count] = '\0';
     if (rtcp->gedp->ged_output_handler != (void (*)(struct ged *, char *))0) {
-       rtcp->gedp->ged_output_handler(rtcp->gedp, line);
+       ged_output_handler_cb(rtcp->gedp, line);
     }  else {
        bu_vls_printf(rtcp->gedp->ged_result_str, "%s", line);
     }

Modified: brlcad/branches/bioh/src/libged/view/data_lines.c
===================================================================
--- brlcad/branches/bioh/src/libged/view/data_lines.c   2020-07-30 17:28:23 UTC 
(rev 76601)
+++ brlcad/branches/bioh/src/libged/view/data_lines.c   2020-07-30 19:10:07 UTC 
(rev 76602)
@@ -84,8 +84,8 @@
 
        gdlsp->gdls_draw = (i) ? 1 : 0;
 
-       if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       ged_refresh_cb(gedp);
+
        return GED_OK;
     }
 
@@ -144,8 +144,7 @@
 
        VSET(gdlsp->gdls_color, r, g, b);
 
-       if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       ged_refresh_cb(gedp);
 
        return GED_OK;
     }
@@ -173,8 +172,7 @@
 
        gdlsp->gdls_line_width = line_width;
 
-       if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       ged_refresh_cb(gedp);
 
        return GED_OK;
     }
@@ -219,8 +217,7 @@
 
        /* Clear out data points */
        if (ac < 1) {
-           if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-               (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+           ged_refresh_cb(gedp);
 
            bu_free((char *)av, "av");
            return GED_OK;
@@ -238,8 +235,7 @@
                gdlsp->gdls_points = (point_t *)0;
                gdlsp->gdls_num_points = 0;
 
-               if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-                   (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+               ged_refresh_cb(gedp);
 
                bu_free((char *)av, "av");
                return GED_ERROR;
@@ -248,8 +244,7 @@
            VMOVE(gdlsp->gdls_points[i], scan);
        }
 
-       if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL)
-           (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata);
+       ged_refresh_cb(gedp);
        bu_free((char *)av, "av");
        return GED_OK;
     }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to