fix: three StreamHub C++ defects from final code review
Finding 1 (HandleReloadConfig data loss): move ClearCalibration inside LoadSourcesFile so the table is wiped only after a successful fread. Adds a clearCalibration bool parameter (default false); the reload path passes true, the startup path passes false. Finding 2 (JSON injection via unit/source/signal): add JsonEscape() static helper (escapes \", \\, \n \r \t, and \u00XX for other control chars). Applied at all three emission sites: BroadcastCalibration, HandleSaveSources, and BroadcastSources (label). Teach JsonGetString to unescape the same set on read, so values round-trip correctly. Finding 3 (%.17g verbosity): add ShortFloat() static helper that tries %.15g then %.16g then %.17g, stopping at the first precision whose strtod() output compares equal to the original. Applied at both float emission sites. 0.1 now prints as "0.1", not "0.10000000000000001". Minor: fix two inaccurate comments in StreamHub.h — the CalibrationEntry rationale (not a 133 MB / address-limit issue; the real reason is no per-entry heap churn, STL-free, trivially copyable) and "chars" to "bytes" for the unit cap. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
686fc2ce7d
commit
42f5a726af
@@ -57,15 +57,15 @@ static const uint32 kMaxUnitLen = 16u;
|
||||
* add-order and would rebind if the source list were reordered) and by the
|
||||
* BASE signal name (no "[i]" suffix: one entry covers a whole array signal).
|
||||
*
|
||||
* Fixed-size char arrays are used deliberately: embedding 256 StreamString
|
||||
* (each of which allocates its own heap buffer) into a 133 MB struct that is
|
||||
* itself heap-allocated pushes offsets beyond the canonical x86-64 address
|
||||
* limit and causes a SIGSEGV in the constructor.
|
||||
* Fixed-size char arrays are used deliberately: they avoid per-entry heap
|
||||
* churn (no StreamString allocation per calibration slot), keep the type free
|
||||
* of STL, and make a CalibrationEntry snapshot trivially copyable under the
|
||||
* calibration mutex lock.
|
||||
*/
|
||||
struct CalibrationEntry {
|
||||
char source[128]; ///< Source label
|
||||
char signal[128]; ///< Base signal name (no "[i]" suffix)
|
||||
char unit[17]; ///< Unit override (max kMaxUnitLen chars + NUL)
|
||||
char unit[17]; ///< Unit override (max kMaxUnitLen bytes + NUL)
|
||||
MARTe::float64 scale;
|
||||
MARTe::float64 offset;
|
||||
};
|
||||
@@ -211,9 +211,12 @@ private:
|
||||
* {"source","signal","scale","offset","unit"} calibration blocks).
|
||||
* @param skipActive when true, a source whose "host:port" is already
|
||||
* streaming is left alone instead of being started a second time.
|
||||
* @param clearCalibration when true, the calibration table is cleared
|
||||
* after a successful fread (never before), so a transient I/O failure
|
||||
* does not silently wipe user calibration data.
|
||||
* @return true if the file was read.
|
||||
*/
|
||||
bool LoadSourcesFile(bool skipActive);
|
||||
bool LoadSourcesFile(bool skipActive, bool clearCalibration = false);
|
||||
|
||||
/** @return true if a session for this "host:port" is already active. */
|
||||
bool SourceIsActive(const char *addrPort);
|
||||
|
||||
Reference in New Issue
Block a user