Revision: 76351
          http://sourceforge.net/p/brlcad/code/76351
Author:   starseeker
Date:     2020-07-16 15:11:12 +0000 (Thu, 16 Jul 2020)
Log Message:
-----------
Experiment with trying to spot recursive calls to callbacks - no sure I like 
this even if it works, but especially in Tcl land it's not hard to accidentally 
get into a recursive situation so would be nice to have some sort of guard.

Modified Paths:
--------------
    brlcad/trunk/include/dm/bview.h
    brlcad/trunk/src/libdm/bview_util.c
    brlcad/trunk/src/libtclcad/tclcad_obj.c
    brlcad/trunk/src/mged/attach.c
    brlcad/trunk/src/mged/setup.c

Modified: brlcad/trunk/include/dm/bview.h
===================================================================
--- brlcad/trunk/include/dm/bview.h     2020-07-16 13:39:50 UTC (rev 76350)
+++ brlcad/trunk/include/dm/bview.h     2020-07-16 15:11:12 UTC (rev 76351)
@@ -36,6 +36,7 @@
 #include "bu/list.h"
 #include "bu/vls.h"
 #include "bu/observer.h"
+#include "bu/ptbl.h"
 #include "bg/polygon_types.h"
 #include "vmath.h"
 
@@ -250,6 +251,7 @@
     fastf_t                     gv_curve_scale;
     fastf_t                     gv_data_vZ;
     size_t                      gv_bot_threshold;
+    struct bu_ptbl *callbacks;
 };
 
 

Modified: brlcad/trunk/src/libdm/bview_util.c
===================================================================
--- brlcad/trunk/src/libdm/bview_util.c 2020-07-16 13:39:50 UTC (rev 76350)
+++ brlcad/trunk/src/libdm/bview_util.c 2020-07-16 15:11:12 UTC (rev 76351)
@@ -25,6 +25,7 @@
 
 #include "common.h"
 #include "vmath.h"
+#include "bu/log.h"
 #include "bn/mat.h"
 #include "dm/defines.h"
 #include "dm/bview_util.h"
@@ -69,8 +70,22 @@
     /* apply the perspective angle to model2view */
     bn_mat_mul(gvp->gv_pmodel2view, gvp->gv_pmat, gvp->gv_model2view);
 
-    if (gvp->gv_callback)
-        (*gvp->gv_callback)(gvp, gvp->gv_clientData);
+    if (gvp->gv_callback) {
+
+       if (gvp->callbacks) {
+           if (bu_ptbl_locate(gvp->callbacks, (long *)(long)gvp->gv_callback) 
!= -1) {
+               bu_log("Recursive callback (bview_update and 
gvp->gv_callback)");
+           }
+           bu_ptbl_ins_unique(gvp->callbacks, (long *)(long)gvp->gv_callback);
+       }
+
+       (*gvp->gv_callback)(gvp, gvp->gv_clientData);
+
+       if (gvp->callbacks) {
+           bu_ptbl_rm(gvp->callbacks, (long *)(long)gvp->gv_callback);
+       }
+
+    }
 }
 
 

Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-07-16 13:39:50 UTC (rev 
76350)
+++ brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-07-16 15:11:12 UTC (rev 
76351)
@@ -2894,6 +2894,8 @@
     bu_vls_free(&gdvp->gdv_callback);
     bu_vls_free(&gdvp->gdv_edit_motion_delta_callback);
     (void)dm_close(gdvp->gdv_dmp);
+    bu_ptbl_free(gdvp->gdv_view->callbacks);
+    BU_PUT(gdvp->gdv_view->callbacks, struct bu_ptbl);
     bu_free((void *)gdvp->gdv_view, "ged_view");
     to_close_fbs(gdvp);
     bu_free((void *)gdvp, "ged_dm_view");
@@ -4504,6 +4506,8 @@
 
     BU_ALLOC(new_gdvp, struct ged_dm_view);
     BU_ALLOC(new_gdvp->gdv_view, struct bview);
+    BU_GET(new_gdvp->gdv_view->callbacks, struct bu_ptbl);
+    bu_ptbl_init(new_gdvp->gdv_view->callbacks, 8, "bview callbacks");
 
     {
        int i;
@@ -4529,6 +4533,8 @@
 
        new_gdvp->gdv_dmp = dm_open((void *)current_top->to_interp, type, ac, 
av);
        if (new_gdvp->gdv_dmp == DM_NULL) {
+           bu_ptbl_free(new_gdvp->gdv_view->callbacks);
+           BU_PUT(new_gdvp->gdv_view->callbacks, struct bu_ptbl);
            bu_free((void *)new_gdvp->gdv_view, "ged_view");
            bu_free((void *)new_gdvp, "ged_dm_view");
            bu_free((void *)av, "to_new_view: av");

Modified: brlcad/trunk/src/mged/attach.c
===================================================================
--- brlcad/trunk/src/mged/attach.c      2020-07-16 13:39:50 UTC (rev 76350)
+++ brlcad/trunk/src/mged/attach.c      2020-07-16 15:11:12 UTC (rev 76351)
@@ -897,6 +897,9 @@
     BU_ALLOC(view_state, struct _view_state);
     *view_state = *initial_dm_list->dml_view_state;                    /* 
struct copy */
     BU_ALLOC(view_state->vs_gvp, struct bview);
+    BU_GET(view_state->vs_gvp->callbacks, struct bu_ptbl);
+    bu_ptbl_init(view_state->vs_gvp->callbacks, 8, "bview callbacks");
+
     *view_state->vs_gvp = *initial_dm_list->dml_view_state->vs_gvp;    /* 
struct copy */
     view_state->vs_gvp->gv_clientData = (void *)view_state;
     view_state->vs_gvp->gv_adaptive_plot = 0;

Modified: brlcad/trunk/src/mged/setup.c
===================================================================
--- brlcad/trunk/src/mged/setup.c       2020-07-16 13:39:50 UTC (rev 76350)
+++ brlcad/trunk/src/mged/setup.c       2020-07-16 15:11:12 UTC (rev 76351)
@@ -453,6 +453,8 @@
     bu_vls_free(&tlog);
 
     BU_ALLOC(view_state->vs_gvp, struct bview);
+    BU_GET(view_state->vs_gvp->callbacks, struct bu_ptbl);
+    bu_ptbl_init(view_state->vs_gvp->callbacks, 8, "bview callbacks");
     ged_view_init(view_state->vs_gvp);
 
     view_state->vs_gvp->gv_callback = mged_view_callback;

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