2
* sdrtable.c: simple data recorder table management
5
* Copyright (c) 2001-2007, California Institute of Technology.
6
* ALL RIGHTS RESERVED. U.S. Government Sponsorship
9
* Author: Scott Burleigh, JPL
11
* This library implements the Simple Data Recorder system's
12
* self-delimiting tables.
14
* Modification History:
16
* 4-3-96 APS Abstracted IPC services and task control.
17
* 5-1-96 APS Ported to sparc-sunos4.
18
* 12-20-00 SCB Revised for sparc-sunos5.
19
* 6-8-07 SCB Divided sdr.c library into separable components.
25
/* Private definition of SDR table structure. */
32
Object rows; /* an array */
35
/* * * Table management functions * * */
37
Object Sdr_table_create(char *file, int line, Sdr sdrv, int rowSize,
43
if (!(sdr_in_xn(sdrv)))
45
oK(_iEnd(file, line, _notInXnMsg()));
49
joinTrace(sdrv, file, line);
50
if (rowSize < 1 || rowCount < 1)
52
oK(_xniEnd(file, line, _apiErrMsg(), sdrv));
56
tableBuffer.userData = 0;
57
tableBuffer.rowSize = rowSize;
58
tableBuffer.rowCount = rowCount;
59
tableBuffer.rows = _sdrmalloc(sdrv, rowSize * rowCount);
60
if (tableBuffer.rows == 0)
62
oK(_iEnd(file, line, "tableBuffer.rows"));
66
table = _sdrzalloc(sdrv, sizeof tableBuffer);
69
oK(_iEnd(file, line, "table"));
73
sdrPut((Address) table, tableBuffer);
77
Address sdr_table_user_data(Sdr sdrv, Object table)
85
CHKZERO(takeSdr(sdr) == 0);
86
sdrFetch(tableBuffer, (Address) table);
88
return tableBuffer.userData;
91
void Sdr_table_user_data_set(char *file, int line, Sdr sdrv, Object table,
96
if (!(sdr_in_xn(sdrv)))
98
oK(_iEnd(file, line, _notInXnMsg()));
102
joinTrace(sdrv, file, line);
105
oK(_xniEnd(file, line, "table", sdrv));
109
sdrFetch(tableBuffer, (Address) table);
110
tableBuffer.userData = data;
111
sdrPut((Address) table, tableBuffer);
114
void sdr_table_dimensions(Sdr sdrv, Object table, int *rowSize,
118
SdrTable tableBuffer;
125
CHKVOID(takeSdr(sdr) == 0);
126
sdrFetch(tableBuffer, (Address) table);
128
*rowSize = tableBuffer.rowSize;
129
*rowCount = tableBuffer.rowCount;
132
void sdr_table_stage(Sdr sdrv, Object table)
135
SdrTable tableBuffer;
140
CHKVOID(takeSdr(sdr) == 0);
141
sdrFetch(tableBuffer, (Address) table);
142
sdr_stage(sdrv, NULL, tableBuffer.rows, 0);
146
Address sdr_table_row(Sdr sdrv, Object table, unsigned int rowNbr)
149
SdrTable tableBuffer;
155
CHKERR(takeSdr(sdr) == 0);
156
sdrFetch(tableBuffer, (Address) table);
158
CHKERR(rowNbr < tableBuffer.rowCount);
159
addr = ((Address) (tableBuffer.rows)) + (rowNbr * tableBuffer.rowSize);
163
void Sdr_table_destroy(char *file, int line, Sdr sdrv, Object table)
165
SdrTable tableBuffer;
167
if (!(sdr_in_xn(sdrv)))
169
oK(_iEnd(file, line, _notInXnMsg()));
173
joinTrace(sdrv, file, line);
176
oK(_xniEnd(file, line, _apiErrMsg(), sdrv));
180
sdrFetch(tableBuffer, (Address) table);
181
sdrFree(tableBuffer.rows);
183
/* just in case user mistakenly accesses later... */
184
tableBuffer.rowSize = 0;
185
tableBuffer.rowCount = 0;
186
tableBuffer.rows = 0;
187
sdrPut((Address) table, tableBuffer);