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