ACQ400_XRM (xrmIoc)
Loading...
Searching...
No Matches
acq400_SOE.h
Go to the documentation of this file.
1/** @file acq400_SOE.h
2 * @brief acq400_SOE class implements SOE function
3 *
4 * Created on: 23 Feb 2026
5 * Author: pgm
6 */
7
8/* provide an interface to the SOE_LUT and SOE_HOLD_TABLE SOE_HLD
9 * block on "new buffer"
10 * copy new buffer to backing store (for PM)
11 * wait for FMT
12 * act on FMT.
13 */
14#ifndef XRMIOCAPP_SRC_ACQ400_SOE_H_
15#define XRMIOCAPP_SRC_ACQ400_SOE_H_
16
17#include "acq400_asyn_common.h"
18#include "xrm_structs.h"
19#include "acq400_FMT.h"
20#include "SamplePrams.h"
21
22#define PS_SOE_STRATEGY "SOE_STRATEGY" /* select LUT strategy 0,1.. */
23
24#define PS_SOE_LUT_COL_ROWNUM "SOE_LUT_COL_ROWNUM" /* cosmetic for display, NOT part of FMT */
25#define PS_SOE_LUT_COL_EVENT "SOE_LUT_COL_EVENT" /* asynInt16Array, ro */
26#define PS_SOE_LUT_COL_PAD "SOE_LUT_COL_PAD" /* asynInt16Array, ro */
27#define PS_SOE_LUT_COL_PV_ID "SOE_LUT_COL_PV_ID" /* asynInt32Array, ro */
28#define PS_SOE_LUT_COL_OFFSET_US "SOE_LUT_COL_OFFSET_US" /* asynInt32Array, ro */
29
30/* REDIT : Row EDIT */
31#define PS_SOE_LUT_REDIT_ROW "SOE_LUT_REDIT_ROW" /* edit this row */
32#define PS_SOE_LUT_REDIT_ROWCOUNT "SOE_LUT_REDIT_ROWCOUNT" /* for this many rows */
33#define PS_SOE_LUT_REDIT_EVENT "SOE_LUT_REDIT_EVENT" /* set this event */
34#define PS_SOE_LUT_REDIT_EVENT_STEP "SOE_LUT_REDIT_EVENT_STEP" /* adding to subsequent rows */
35#define PS_SOE_LUT_REDIT_PV_ID "SOE_LUT_REDIT_PV_ID" /* set this event */
36#define PS_SOE_LUT_REDIT_PV_ID_STEP "SOE_LUT_REDIT_PV_ID_STEP" /* adding to subsequent rows */
37#define PS_SOE_LUT_REDIT_OFFSET_US "SOE_LUT_REDIT_OFFSET_US"
38#define PS_SOE_LUT_REDIT_OFFSET_US_STEP "SOE_LUT_REDIT_OFFSET_US_STEP"
39
40#define PS_SOE_LUT_REDIT_COMMIT "SOE_LUT_REDIT_COMMIT"
41
42#define PS_SOE_HLD_COL_ROWNUM "SOE_HLD_COL_ROWNUM"
43#define PS_SOE_HLD_COL_EVT "SOE_HLD_COL_EVT"
44#define PS_SOE_HLD_COL_PV_ID "SOE_HLD_COL_PV_ID"
45#define PS_SOE_HLD_COL_OFFSET_US "SOE_HLD_COL_OFFSET_US"
46#define PS_SOE_HLD_COL_CLIDAT "SOE_HLD_COL_CLIDAT"
47#define PS_SOE_HLD_COL_TS "SOE_HLD_COL_TS"
48#define PS_SOE_HLD_COL_DATA_OFFSET "SOE_HLD_COL_DATA_OFFSET"
49
50#define PS_SOE_AGG_SITES "SOE_AGG_SITES"
51#define PS_SOE_SITE_SSB "SOE_SITE_SSB" /* addr per site */
52#define PS_SOE_SMPL_NSAM "SOE_SMPL_NSAM"
53#define PS_SOE_SITE_IS_ADC "SOE_SITE_IS_ADC" /* addr per site */
54#define PS_SOE_SMPL_SS_U32 "SOE_SMPL_SS_U32"
55#define PS_SOE_SMPL_AI_COUNT "SOE_SMPL_AI_COUNT"
56#define PS_SOE_SMPL_DI_COUNT "SOE_SMPL_DI_COUNT"
57#define PS_SOE_SMPL_SP_COUNT "SOE_SMPL_SP_COUNT"
58
59#define PS_SOE_SMPL_DI_INDEX "SOE_SMPL_DI_INDEX"
60#define PS_SOE_SMPL_SP_INDEX "SOE_SMPL_SP_INDEX"
61
62#define PS_SOE_KBUF_INDEX "SOE_KBUF_INDEX"
63#define PS_SOE_KBUF_WRT0 "SOE_KBUF_WRT0"
64#define PS_SOE_KBUF_WRT1 "SOE_KBUF_WRT1"
65
66/* 2 columns each data for show */
67#define PS_SOE_HLD_COL_AI1 "SOE_HLD_COL_AI1"
68#define PS_SOE_HLD_COL_AI2 "SOE_HLD_COL_AI2"
69
70#define PS_SOE_HLD_COL_DI1 "SOE_HLD_COL_DI1"
71#define PS_SOE_HLD_COL_DI2 "SOE_HLD_COL_DI2"
72
73
74/* SP0 : SPAD0 aka Sample Number
75 * SP1 : SPAD1 aka WR_VERNIER
76 */
77#define PS_SOE_HLD_COL_SP0 "SOE_HLD_COL_SP0"
78#define PS_SOE_HLD_COL_SP1 "SOE_HLD_COL_SP1"
79#define PS_SOE_HLD_COL_SP2 "SOE_HLD_COL_SP2" // WRV
80#define PS_SOE_HLD_COL_SP3 "SOE_HLD_COL_SP3" // WRS Seconds Since EPOCH, SP3
81#define PS_SOE_HLD_COL_WRVS "SOE_HLD_COL_WRVS" // WR Vernier, seconds
82#define PS_SOE_HLD_COL_WRVT "SOE_HLD_COL_WRVT" // WR Vernier, ticks
83#define PS_SOE_HLD_COL_WRUS "SOE_HLD_COL_WRUS" // WR time, usec since epoch
84
85
86
87/* define a column for each data type.git
88 * There will be up to 64 of these by asyn "address"
89 * BUT: this is NOT going to play well with a table
90 * Really, one row per event again, 32 AI cols, 2DI, 2SP ..
91 * @@todo !Think! Also, suck it and see..
92 */
93#define PS_SOE_HLD_DATA_COL_AI "SOE_HLD_DATA_COL_AI" // 64 records
94#define PS_SOE_HLD_DATA_COL_DI "SOE_HLD_DATA_COL_DI"
95#define PS_SOE_HLD_DATA_COL_SP "SOE_HLD_DATA_COL_SP"
96
97#define PS_SOE_FMT_RX_TIMEOUTS "SOE_FMT_RX_TIMEOUTS"
98#define PS_SOE_FMT_RX_TIMEOUT_REASON \
99 "SOE_FMT_RX_TIMEOUT_REASON"
100#define PS_SOE_FMT_DELTA_TS "SOE_FMT_DELTA_TS"
101#define PS_SOE_FMT_RX_SUCCESS "SOE_FMT_RX_SUCCESS"
102#define PS_SOE_FMT_EV_MATCHES "SOE_FMT_EV_MATCHES"
103#define PS_SOE_FMT_EV_NIB "SOE_FMT_EV_NOT_IN_BUFFER"
104#define PS_SOE_FMT_BUF_POS "SOE_FMT_BUF_POS"
105#define PS_SOE_FMT_NEXT_RETRY "SOE_FMT_NEXT_RETRY"
106
107#define PS_SOE_HLD_TABLE_WF "SOE_HLD_TABLE_WF" // raw event table.
108
109
110/** @brief KBUF "Kernel BUFfer"
111 * On boot: KBUF's are preassigned for capture memory
112 * Typical transient recorder: 128*4MB
113 * A streaming capture cycles through the buffers.
114 * When a buffer is filled, the buffer index is passed to clients.
115 * acq400_SOE uses struct KBUF to model the buffer.
116 */
117struct KBUF {
118 unsigned ib; /**< kernel buffer index 0..N */
119 epicsInt64 wrt0; /**< WR timestamp at start. */
120 epicsInt64 wrt1; /**< WR timestamp at end. */
121 const char* raw; /**< PA of the raw data from DMA. */
122};
123
124struct SOE_DIMS {
125 KBUF& kbuf;
126 SamplePrams& samplePrams;
127 SOE_LUT& lut;
128};
129
130/** singleton */
132
133public:
134 enum ERR_CODES {
135 SOE_SUCCESS = 0,
136 E_TIMEOUT = -1,
137 E_FMT_TS_TOO_EARLY_FOR_KB = -2,
138 E_FMT_TS_TOO_LATE_FOR_KB = -3,
139 E_FMT_NO_EVENTS_FOUND = -4,
140 E_FMT_UNDEFINED = -99
141 };
142 enum FMT_NUM {
143 FMT_PRE = -1,
144 FMT_CUR = 0,
145 FMT_WAIT = 1
146 };
147 struct RC {
148 ERR_CODES status;
149
150 long long delta_us;
151 int ht_size32;
152 short events_accepted;
153 short events_not_in_buffer;
154 FMT_NUM fmt_num;
155 short next_retry;
156 };
157 /** implements strategy, .. waitFMT, compare LUT, look up data in raw and build output <ht> */
158 virtual RC operator() (const SOE_DIMS& soe, SOE_HOLD_TABLE ht) = 0;
159
160 static acq400_SOE_Strategy** factory();
161
162
163};
164
165
167protected:
168 static int verbose;
169
170
171 SOE_LUT soe_lut;
172 SOE_HOLD_HEADER* the_hold_table; /**< preallocate the max possible size. do it once! */
173
174 acq400_SOE_Strategy* strategy;
175
176 /* TABLE representation for Phoebus */
177 struct COLUMNS {
178 epicsInt8 c_rownum[SOE_LUT_ROWS];
179 epicsInt16 c_event[SOE_LUT_ROWS];
180 epicsInt16 c_pad[SOE_LUT_ROWS];
181 epicsInt32 c_pv_id[SOE_LUT_ROWS];
182 epicsInt64 c_offset_us[SOE_LUT_ROWS];
183 }cols;
184
185 struct HOLD_COLS {
186 epicsInt8 c_rownum[SOE_HLD_ROWS];
187 epicsInt16 c_event[SOE_HLD_ROWS];
188 epicsInt32 c_pv_id[SOE_HLD_ROWS];
189 epicsInt32 c_offset_us[SOE_HLD_ROWS];
190 epicsInt32 c_client_data[SOE_HLD_ROWS];
191 epicsInt64 c_timestamp[SOE_HLD_ROWS]; // really U64 but..
192 epicsFloat32 c_AI1[SOE_HLD_ROWS];
193 epicsFloat32 c_AI2[SOE_HLD_ROWS];
194 epicsInt32 c_DI1[SOE_HLD_ROWS]; // really U32, but we only have doCallbacksInt32Array()
195 epicsInt32 c_DI2[SOE_HLD_ROWS];
196 epicsInt32 c_SP0[SOE_HLD_ROWS];
197 epicsInt32 c_SP1[SOE_HLD_ROWS];
198 epicsInt32 c_SP2[SOE_HLD_ROWS];
199 epicsInt32 c_SP3[SOE_HLD_ROWS];
200 epicsInt8 c_WRVS[SOE_HLD_ROWS];
201 epicsInt32 c_WRVT[SOE_HLD_ROWS];
202 epicsInt64 c_WRUS[SOE_HLD_ROWS];
203 } hold_cols;
204 unsigned fmt_rx_timeouts;
205 unsigned fmt_rx_success;
206 int hold_row_limit;
207 static int nice;
208
209 SamplePrams samplePrams;
210 void get_sample_dimensions();
211 void init_the_hold_table();
212
213 void redit();
214 virtual void update_soe_lut(bool first_time = false);
215 virtual void update_soe_lut_columns(void);
216 virtual void update_soe_lut_callbacks(bool call_array_callbacks);
217
218 virtual void update_hld_tab_columns(void);
219 virtual void update_hld_tab_callbacks(int n_u32);
220 virtual void update_hld_tab_columns_callbacks(void);
221
222 struct KBUF current_kb;
223 inline char* get_raw();
224 void update_kbuf_info(char* raw);
225
226 virtual void task();
227
228 static void task_runner(void *drvPvt);
229
230 int P_SOE_STRATEGY; /**< STRATEGY: LutFmtStrategy1 or NullStrategy (used initial test). */
231
232 int P_SOE_LUT_COL_ROWNUM; /**< LUT view show ROWNUM (synthetic) */
233 int P_SOE_LUT_COL_EVENT; /**< LUT view show EVENT */
234 int P_SOE_LUT_COL_PAD; /**< LUT view show PAD */
235 int P_SOE_LUT_COL_PV_ID; /**< LUT view show PV_ID */
236 int P_SOE_LUT_COL_OFFSET_US; /**< LUT view show OFFSET_US */
237
238 int P_SOE_LUT_REDIT_ROW; /**< Row Edit define first row */
239 int P_SOE_LUT_REDIT_ROWCOUNT; /**< Row Edit number of rows to edit */
240 int P_SOE_LUT_REDIT_EVENT; /**< Row Edit set EVENT for first row */
241 int P_SOE_LUT_REDIT_EVENT_STEP; /**< Row Edit def series of EVENTs */
242 int P_SOE_LUT_REDIT_PV_ID; /**< Row Edit set first PV ID */
243 int P_SOE_LUT_REDIT_PV_ID_STEP; /**< Row Edit def series of PV_IDS's */
244 int P_SOE_LUT_REDIT_OFFSET_US; /**< Row Edit first OFFSET_US */
245 int P_SOE_LUT_REDIT_OFFSET_US_STEP; /**< Row edit def series of offsets */
246
247 int P_SOE_LUT_REDIT_COMMIT; /**< Row Edit: action the new definition */
248
249
250
251 int P_SOE_AGG_SITES; /**< Geometry: aggregator site list */
252 int P_SOE_SITE_SSB; /**< Geometry: Sample Size Bytes */
253 int P_SOE_SMPL_SS_U32; /**< Geometry: Sample Size U32 */
254
255 int P_SOE_SMPL_NSAM; /**< Geometry: Number of Samples in Burst*/
256 int P_SOE_SITE_IS_ADC; /**< Geometry: First ADC site */
257
258 int P_SOE_SMPL_AI_COUNT; /**< Geometry: number of AI16 columns in data */
259 int P_SOE_SMPL_DI_COUNT; /**< Geometry: number of DI32 columns in data */
260 int P_SOE_SMPL_SP_COUNT; /**< Geometry: number of SP32 columns in data */
261 int P_SOE_SMPL_DI_INDEX; /**< Geometry: index of first DI word */
262 int P_SOE_SMPL_SP_INDEX; /**< Geometry: index of first SP word */
263
264 int P_SOE_HLD_COL_ROWNUM; /**< HLD view show ROWNUM (synthetic) */
265 int P_SOE_HLD_COL_EVT; /**< HLD view show EVT (from LUT) */
266 int P_SOE_HLD_COL_PV_ID; /**< HLD view show PV_ID */
267 int P_SOE_HLD_COL_OFFSET_US; /**< HLD view show offset us (from LUT) */
268 int P_SOE_HLD_COL_CLIDAT; /**< HLD view show CLIDAT */
269 int P_SOE_HLD_COL_TS; /**< HLD view show TimeStamp */
270 int P_SOE_HLD_COL_DATA_OFFSET; /**< HLD view show offset to data in HLD TABLE */
271
272 int P_SOE_HLD_COL_AI1; /**< HLD view speciment AI#1 (we can't slice them all) */
273 int P_SOE_HLD_COL_AI2; /**< HLD view speciment AI#2 (we can't slice them all) */
274
275 int P_SOE_HLD_COL_DI1; /**< HLD view DI32#1 */
276 int P_SOE_HLD_COL_DI2; /**< HLD view DI32#2 */
277
278 int P_SOE_HLD_COL_SP0; /**< HLD view SPAD[0] (Sample Number) */
279 int P_SOE_HLD_COL_SP1; /**< HLD view SPAD[1] (usec since trigger) */
280 int P_SOE_HLD_COL_SP2; /**< HLD view SPAD[2] (WR Vernier) */
281 int P_SOE_HLD_COL_SP3; /**< HLD view SPAD[3] (WR seconds since EPOCH) */
282 int P_SOE_HLD_COL_WRVS; /**< HLD view WR Vernier Seconds (f(SPAD[2]) */
283 int P_SOE_HLD_COL_WRVT; /**< HLD view WR Vernier Ticks (f(SPAD[2]) */
284 int P_SOE_HLD_COL_WRUS; /**< HLD view WR Time usec since epich (calculated) */
285
286 int P_SOE_KBUF_INDEX; /**< Current KBUF number */
287 int P_SOE_KBUF_WRT0; /**< Current KBUF start time */
288 int P_SOE_KBUF_WRT1; /**< Current KBUF end time */
289
290 int P_SOE_FMT_RX_TIMEOUTS; /**< Stat: Receive Timeouts */
291 int P_SOE_FMT_RX_TIMEOUT_REASON;/**< Stat: Receive Timeout Reason */
292 int P_SOE_FMT_DELTA_TS; /**< Stat: Delta TS: time between FMT and latest KBUF */
293 int P_SOE_FMT_RX_SUCCESS; /**< Stat: count timely received buffers */
294 int P_SOE_FMT_EV_MATCHES; /**< Stat: count buffers with matching events */
295 int P_SOE_FMT_EV_NIB; /**< Stat: count buffers with events NOT IN BUFFER */
296 int P_SOE_FMT_BUF_POS; /**< Stat: buffer position: -1:PREV, 0:CUR, 1:NEXT */
297 int P_SOE_FMT_NEXT_RETRY; /**< Stat: if next, number of retrys */
298 int P_SOE_HLD_TABLE_WF; /**< HLD Table full binary output for remote clients */
299
300 int ib; /** ib is physical buffer contains bpb vpb's */
301 acq400_SOE(const char *portName, acq400_SOE_Strategy* strategy);
302
303 static acq400_SOE* _instance;
304public:
305 static void create_instance(const char *portName, acq400_SOE_Strategy* strategy);
306 virtual ~acq400_SOE() {}
307
308 void clearHold();
309
310 virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
311
312 static const int CYCLE_MS;
313};
314
315#endif /* XRMIOCAPP_SRC_ACQ400_SOE_H_ */
defines SamplePrams, sample geometry definition struct.
Fermi Multicast Table Abstract Base Class Created on: 16 Feb 2026 Author: pgm.
Definition acq400_SOE.h:131
virtual RC operator()(const SOE_DIMS &soe, SOE_HOLD_TABLE ht)=0
int P_SOE_FMT_EV_MATCHES
Definition acq400_SOE.h:294
int P_SOE_LUT_REDIT_PV_ID
Definition acq400_SOE.h:242
int P_SOE_HLD_COL_CLIDAT
Definition acq400_SOE.h:268
int P_SOE_FMT_NEXT_RETRY
Definition acq400_SOE.h:297
int P_SOE_LUT_REDIT_ROW
Definition acq400_SOE.h:238
int P_SOE_HLD_COL_WRVS
Definition acq400_SOE.h:282
int P_SOE_HLD_COL_EVT
Definition acq400_SOE.h:265
int P_SOE_SMPL_SS_U32
Definition acq400_SOE.h:253
int P_SOE_SMPL_DI_INDEX
Definition acq400_SOE.h:261
int P_SOE_KBUF_INDEX
Definition acq400_SOE.h:286
int P_SOE_FMT_DELTA_TS
Definition acq400_SOE.h:292
int P_SOE_SMPL_AI_COUNT
Definition acq400_SOE.h:258
acq400_SOE(const char *portName, acq400_SOE_Strategy *strategy)
Definition acq400_SOE.cpp:32
int P_SOE_SMPL_NSAM
Definition acq400_SOE.h:255
int P_SOE_SITE_SSB
Definition acq400_SOE.h:252
int P_SOE_HLD_COL_SP3
Definition acq400_SOE.h:281
int P_SOE_HLD_COL_PV_ID
Definition acq400_SOE.h:266
int P_SOE_HLD_COL_DI1
Definition acq400_SOE.h:275
int P_SOE_FMT_EV_NIB
Definition acq400_SOE.h:295
int P_SOE_STRATEGY
Definition acq400_SOE.h:230
int P_SOE_HLD_COL_OFFSET_US
Definition acq400_SOE.h:267
int P_SOE_FMT_RX_TIMEOUTS
Definition acq400_SOE.h:290
int P_SOE_HLD_COL_WRUS
Definition acq400_SOE.h:284
int P_SOE_LUT_REDIT_EVENT_STEP
Definition acq400_SOE.h:241
int P_SOE_LUT_REDIT_OFFSET_US_STEP
Definition acq400_SOE.h:245
int P_SOE_AGG_SITES
Definition acq400_SOE.h:251
int P_SOE_KBUF_WRT0
Definition acq400_SOE.h:287
int P_SOE_HLD_COL_SP2
Definition acq400_SOE.h:280
int P_SOE_HLD_COL_ROWNUM
Definition acq400_SOE.h:264
int P_SOE_LUT_COL_PV_ID
Definition acq400_SOE.h:235
int P_SOE_HLD_COL_DATA_OFFSET
Definition acq400_SOE.h:270
int P_SOE_SMPL_SP_INDEX
Definition acq400_SOE.h:262
int P_SOE_LUT_REDIT_ROWCOUNT
Definition acq400_SOE.h:239
int P_SOE_HLD_COL_AI1
Definition acq400_SOE.h:272
int P_SOE_FMT_RX_TIMEOUT_REASON
Definition acq400_SOE.h:291
int P_SOE_LUT_REDIT_PV_ID_STEP
Definition acq400_SOE.h:243
int P_SOE_FMT_RX_SUCCESS
Definition acq400_SOE.h:293
int P_SOE_LUT_REDIT_OFFSET_US
Definition acq400_SOE.h:244
int P_SOE_SITE_IS_ADC
Definition acq400_SOE.h:256
int P_SOE_SMPL_DI_COUNT
Definition acq400_SOE.h:259
int P_SOE_LUT_COL_OFFSET_US
Definition acq400_SOE.h:236
int P_SOE_LUT_COL_PAD
Definition acq400_SOE.h:234
int P_SOE_HLD_COL_SP1
Definition acq400_SOE.h:279
int P_SOE_HLD_COL_AI2
Definition acq400_SOE.h:273
int P_SOE_LUT_REDIT_COMMIT
Definition acq400_SOE.h:247
int P_SOE_HLD_COL_DI2
Definition acq400_SOE.h:276
int P_SOE_LUT_COL_EVENT
Definition acq400_SOE.h:233
int P_SOE_HLD_COL_TS
Definition acq400_SOE.h:269
int P_SOE_HLD_COL_WRVT
Definition acq400_SOE.h:283
int P_SOE_HLD_TABLE_WF
Definition acq400_SOE.h:298
int P_SOE_KBUF_WRT1
Definition acq400_SOE.h:288
int P_SOE_SMPL_SP_COUNT
Definition acq400_SOE.h:260
int P_SOE_FMT_BUF_POS
Definition acq400_SOE.h:296
int P_SOE_LUT_COL_ROWNUM
Definition acq400_SOE.h:232
int P_SOE_HLD_COL_SP0
Definition acq400_SOE.h:278
int P_SOE_LUT_REDIT_EVENT
Definition acq400_SOE.h:240
SOE_HOLD_HEADER * the_hold_table
Definition acq400_SOE.h:172
acq400_asynPortDriver(const char *portName, int maxAddr, int interfaceMask, int interruptMask, int asynFlags, int autoConnect, int priority, int stackSize)
Definition acq400_asynPortDriver.cpp:16
KBUF "Kernel BUFfer" On boot: KBUF's are preassigned for capture memory Typical transient recorder: 1...
Definition acq400_SOE.h:117
unsigned ib
Definition acq400_SOE.h:118
epicsInt64 wrt0
Definition acq400_SOE.h:119
epicsInt64 wrt1
Definition acq400_SOE.h:120
const char * raw
Definition acq400_SOE.h:121
Definition acq400_SOE.h:124
SOE_HOLD_HEADER Header for Hold Table. lut_row is a copy of the relevant SOE_LUT_ROW,...
Definition xrm_structs.h:103
Definition SamplePrams.h:11
Definition acq400_SOE.h:177
Definition acq400_SOE.h:185
Definition acq400_SOE.h:147
Declarations for key XRM structures for internal and wire (external) use.
struct SOE_LUT_ROW SOE_LUT[SOE_LUT_ROWS]
SOE_LUT Sample On Event Lookup Table definition.
Definition xrm_structs.h:95
struct SOE_HOLD_HEADER * SOE_HOLD_TABLE
SOE_HOLD_TABLE.
Definition xrm_structs.h:250