Revision: 76601
          http://sourceforge.net/p/brlcad/code/76601
Author:   starseeker
Date:     2020-07-30 17:28:23 +0000 (Thu, 30 Jul 2020)
Log Message:
-----------
Make a stab at recursive calling warnings for the libtclcad level callbacks.  
Won't prevent anything, but might at least warn what's going on.

Modified Paths:
--------------
    brlcad/branches/bioh/include/tclcad.h
    brlcad/branches/bioh/src/libtclcad/tclcad_obj.c

Modified: brlcad/branches/bioh/include/tclcad.h
===================================================================
--- brlcad/branches/bioh/include/tclcad.h       2020-07-30 15:08:14 UTC (rev 
76600)
+++ brlcad/branches/bioh/include/tclcad.h       2020-07-30 17:28:23 UTC (rev 
76601)
@@ -135,6 +135,7 @@
 struct tclcad_ged_data {
     struct ged         *gedp;
     struct bu_vls      go_more_args_callback;
+    int                        go_more_args_callback_cnt;
 
     // These are view related, but appear to be intended as global across all
     // views associated with the gedp - that is why they are here and not in
@@ -141,6 +142,7 @@
     // tclcad_view_data.
     struct bu_hash_tbl *go_edited_paths;
     struct bu_vls      go_rt_end_callback;
+    int                 go_rt_end_callback_cnt;
     int                        go_dlist_on;
     int                        go_refresh_on;
 
@@ -155,7 +157,9 @@
 struct tclcad_view_data {
     struct ged         *gedp;
     struct bu_vls      gdv_edit_motion_delta_callback;
+    int                 gdv_edit_motion_delta_callback_cnt;
     struct bu_vls      gdv_callback;
+    int                        gdv_callback_cnt;
     struct fbserv_obj  gdv_fbs;
 };
 

Modified: brlcad/branches/bioh/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/branches/bioh/src/libtclcad/tclcad_obj.c     2020-07-30 15:08:14 UTC 
(rev 76600)
+++ brlcad/branches/bioh/src/libtclcad/tclcad_obj.c     2020-07-30 17:28:23 UTC 
(rev 76601)
@@ -1319,7 +1319,9 @@
     struct tclcad_ged_data *tgd;
     BU_GET(tgd, struct tclcad_ged_data);
     bu_vls_init(&tgd->go_rt_end_callback);
+    tgd->go_rt_end_callback_cnt = 0;
     bu_vls_init(&tgd->go_more_args_callback);
+    tgd->go_more_args_callback_cnt = 0;
     tgd->go_edited_paths = bu_hash_create(0);
     tgd->gedp = top->to_gedp;
     tgd->go_refresh_on = 1;
@@ -3597,8 +3599,13 @@
                          bu_vls_addr(&tvd->gdv_edit_motion_delta_callback),
                          bu_vls_addr(&tran_x_vls), bu_vls_addr(&tran_y_vls),
                          bu_vls_addr(&tran_z_vls));
+           tvd->gdv_edit_motion_delta_callback_cnt++;
+           if (tvd->gdv_edit_motion_delta_callback_cnt > 1) {
+               bu_log("Warning - recursive gdv_edit_motion_delta_callback 
call\n");
+           }
+
            Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd));
-
+           tvd->gdv_edit_motion_delta_callback_cnt++;
            bu_vls_free(&tcl_cmd);
            bu_vls_free(&tran_x_vls);
            bu_vls_free(&tran_y_vls);
@@ -3714,7 +3721,12 @@
 
        struct tclcad_view_data *tvd = (struct tclcad_view_data *)gdvp->u_data;
        if (0 < bu_vls_strlen(&tvd->gdv_callback)) {
+           tvd->gdv_callback_cnt++;
+           if (tvd->gdv_callback_cnt > 1) {
+               bu_log("Warning - recursive gvd_callback call\n");
+           }
            tclcad_eval_noresult(current_top->to_interp, 
bu_vls_addr(&tvd->gdv_callback), 0, NULL);
+           tvd->gdv_callback_cnt--;
        }
 
        need_refresh = 1;
@@ -4576,7 +4588,9 @@
     struct tclcad_view_data *tvd;
     BU_GET(tvd, struct tclcad_view_data);
     bu_vls_init(&tvd->gdv_edit_motion_delta_callback);
+    tvd->gdv_edit_motion_delta_callback_cnt = 0;
     bu_vls_init(&tvd->gdv_callback);
+    tvd->gdv_callback_cnt = 0;
     tvd->gedp = current_top->to_gedp;
     new_gdvp->u_data = (void *)tvd;
 
@@ -6420,7 +6434,12 @@
 
        struct tclcad_view_data *tvd = (struct tclcad_view_data *)gdvp->u_data;
        if (0 < bu_vls_strlen(&tvd->gdv_callback)) {
+           tvd->gdv_callback_cnt++;
+           if (tvd->gdv_callback_cnt > 1) {
+               bu_log("Warning - recursive gvd_callback call\n");
+           }
            Tcl_Eval(current_top->to_interp, bu_vls_addr(&tvd->gdv_callback));
+           tvd->gdv_callback_cnt--;
        }
 
        to_refresh_view(gdvp);
@@ -6620,10 +6639,14 @@
     struct tclcad_ged_data *tgd = (struct tclcad_ged_data 
*)current_top->to_gedp->u_data;
     if (0 < bu_vls_strlen(&tgd->go_rt_end_callback)) {
        struct bu_vls callback_cmd = BU_VLS_INIT_ZERO;
-
+       tgd->go_rt_end_callback_cnt++;
+       if (tgd->go_rt_end_callback_cnt > 1) {
+           bu_log("Warning - recursive go_rt_end_callback call\n");
+       }
        bu_vls_printf(&callback_cmd, "%s %d",
                      bu_vls_addr(&tgd->go_rt_end_callback), aborted);
        Tcl_Eval(current_top->to_interp, bu_vls_addr(&callback_cmd));
+       tgd->go_rt_end_callback_cnt--;
     }
 }
 

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



_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to