-
Notifications
You must be signed in to change notification settings - Fork 0
/
g_transfer_globals_removal.patch
175 lines (154 loc) · 5.5 KB
/
g_transfer_globals_removal.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
Index: include/pkg.h
===================================================================
--- include/pkg.h (revision 54115)
+++ include/pkg.h (working copy)
@@ -107,6 +107,7 @@
/* neg->read new hdr, 0->all here, >0 ->more to come */
char *pkc_buf; /**< @brief start of dynamic buf */
char *pkc_curpos; /**< @brief current position in pkg_buf */
+ void *pkc_server_data; /**< @brief used to hold server data for callbacks */
};
#define PKC_NULL ((struct pkg_conn *)0)
#define PKC_ERROR ((struct pkg_conn *)(-1L))
Index: src/gtools/g_transfer.c
===================================================================
--- src/gtools/g_transfer.c (revision 54115)
+++ src/gtools/g_transfer.c (working copy)
@@ -69,12 +69,27 @@
/* in-memory geometry database filled in by the server as it receives
* geometry from the client.
*/
-struct db_i *DBIP = NULL;
+typedef struct _server_data_ {
+ struct db_i *DBIP;
+ /* used by server to stash what it should shoot at */
+ int srv_argc;
+ char **srv_argv;
+} server_data;
-/* used by server to stash what it should shoot at */
-int srv_argc = 0;
-char **srv_argv = NULL;
+server_data*
+init_srv_data () {
+ server_data *stash = bu_malloc(sizeof *stash, "server data memory");
+ stash->DBIP = NULL;
+ stash->srv_argc = 0;
+ stash->srv_argv = NULL;
+ return stash;
+}
/** print a usage statement when invoked with bad, help, or no arguments
*/
@@ -111,18 +126,18 @@
}
void
-do_something() {
+do_something(server_data *stash) {
/* shoot a ray at some geometry just to show that we can */
struct application ap;
struct rt_i *rtip;
int i;
- if (!DBIP) {
+ if (!stash->DBIP) {
return;
}
RT_APPLICATION_INIT(&ap);
- rtip = rt_new_rti(DBIP); /* clone dbip */
+ rtip = rt_new_rti(stash->DBIP); /* clone dbip */
if (!rtip) {
bu_log("Unable to create a database instance off of the raytrace instance\n");
return;
@@ -135,13 +150,13 @@
VSET(ap.a_ray.r_dir, 0, 0, -1);
/* shoot at any geometry specified */
- for (i = 0; i < srv_argc; i++) {
- if (rt_gettree(rtip, srv_argv[i]) != 0) {
- bu_log("Unable to validate %s for raytracing\n", srv_argv[i]);
+ for (i = 0; i < stash->srv_argc; i++) {
+ if (rt_gettree(rtip, stash->srv_argv[i]) != 0) {
+ bu_log("Unable to validate %s for raytracing\n", stash->srv_argv[i]);
continue;
}
rt_prep(rtip);
- bu_log("Shooting at %s from (0, 0, 10000) in the (0, 0, -1) direction\n", srv_argv[i]);
+ bu_log("Shooting at %s from (0, 0, 10000) in the (0, 0, -1) direction\n", stash->srv_argv[i]);
(void)rt_shootray(&ap);
rt_clean(rtip);
}
@@ -161,36 +176,41 @@
void
-server_args(struct pkg_conn *UNUSED(connection), char *buf)
+server_args(struct pkg_conn *connection, char *buf)
{
/* updates the srv_argc and srv_argv application globals used to
* show that we can shoot at geometry in-memory.
*/
- srv_argc++;
- if (!srv_argv) {
- srv_argv = bu_calloc(1, srv_argc * sizeof(char *), "server_args() srv_argv calloc");
+ server_data *stash;
+ stash = init_srv_data();
+ stash->srv_argc++;
+ if (!stash->srv_argv) {
+ stash->srv_argv = bu_calloc(1, stash->srv_argc * sizeof(char *), "server_args() srv_argv calloc");
} else {
- srv_argv = bu_realloc(srv_argv, srv_argc * sizeof(char *), "server_args() srv_argv realloc");
+ stash->srv_argv = bu_realloc(stash->srv_argv, stash->srv_argc * sizeof(char *), "server_args() srv_argv realloc");
}
- srv_argv[srv_argc - 1] = bu_calloc(1, strlen(buf)+1, "server_args() srv_argv[] calloc");
- bu_strlcpy(srv_argv[srv_argc - 1], buf, strlen(buf)+1);
+ stash->srv_argv[stash->srv_argc - 1] = bu_calloc(1, strlen(buf)+1, "server_args() srv_argv[] calloc");
+ bu_strlcpy(stash->srv_argv[stash->srv_argc - 1], buf, strlen(buf)+1);
bu_log("Planning to shoot at %s\n", buf);
-
+ connection->pkc_server_data = stash;;
free(buf);
}
void
-server_geom(struct pkg_conn *UNUSED(connection), char *buf)
+server_geom(struct pkg_conn *connection, char *buf)
{
struct bu_external ext;
struct db5_raw_internal raw;
int flags;
- if (DBIP == NULL) {
+ server_data *stash;
+ stash =(server_data*) connection->pkc_server_data;
+
+ if (stash->DBIP == NULL) {
/* first geometry received, initialize */
- DBIP = db_open_inmem();
+ stash->DBIP = db_open_inmem();
}
if (db5_get_raw_internal_ptr(&raw, (const unsigned char *)buf) == NULL) {
@@ -206,27 +226,29 @@
ext.ext_buf = (uint8_t *)buf;
ext.ext_nbytes = raw.object_length;
flags = db_flags_raw_internal(&raw) | RT_DIR_INMEM;
- wdb_export_external(DBIP->dbi_wdbp, &ext, (const char *)raw.name.ext_buf, flags, raw.minor_type);
+ wdb_export_external(stash->DBIP->dbi_wdbp, &ext, (const char *)raw.name.ext_buf, flags, raw.minor_type);
bu_log("Received %s (MAJOR=%d, MINOR=%d)\n", raw.name.ext_buf, raw.major_type, raw.minor_type);
}
void
-server_ciao(struct pkg_conn *UNUSED(connection), char *buf)
+server_ciao(struct pkg_conn* connection, char *buf)
{
+ server_data *stash;
+
bu_log("CIAO encountered\n");
-
+ stash = (server_data*) connection->pkc_server_data;
/* shoot some rays just to show that we can if server was
* invoked with specific geometry.
*/
- do_something();
+ do_something(stash);
- if (DBIP != NULL) {
+ if (stash->DBIP != NULL) {
/* uncomment to avoid an in-mem dbip close bug */
/* DBIP->dbi_fp = fopen("/dev/null", "rb");*/
- db_close(DBIP);
- DBIP = NULL;
+ db_close(stash->DBIP);
+ stash->DBIP = NULL;
}
free(buf);