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