Skip to content

Commit d29ebdb

Browse files
authored
Merge pull request #2240 from AllenInstitute/feature/2240-revise_tsds
Revision ThreadSafeDataStorage utility functions
2 parents 831972d + e28a73e commit d29ebdb

5 files changed

+78
-69
lines changed

Packages/MIES/MIES_Debugging.ipf

+1-1
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ threadsafe Function BUG_TS(string msg, [WAVE/T keys, WAVE/T values])
600600
TUFXOP_AcquireLock/N=(TSDS_BUGCOUNT)
601601
bugCount = TSDS_ReadVar(TSDS_BUGCOUNT, defValue = 0, create = 1)
602602
bugCount += 1
603-
TSDS_Write(TSDS_BUGCOUNT, var = bugCount)
603+
TSDS_WriteVar(TSDS_BUGCOUNT, bugCount)
604604
TUFXOP_ReleaseLock/N=(TSDS_BUGCOUNT)
605605

606606
print "BUG_TS: Should never be called during automated testing."

Packages/MIES/MIES_ThreadsafeDataSharing.ipf

+42-31
Original file line numberDiff line numberDiff line change
@@ -10,59 +10,70 @@
1010
///
1111
/// @brief Helper functions for accessing global objects from all threads
1212

13-
threadsafe Function TSDS_Write(string name, [variable var])
14-
ASSERT_TS(!ParamIsDefault(var), "Missing var parameter")
13+
/// @brief Creates/Overwrites a threadstorage and puts a numerical value in
14+
threadsafe static Function TSDS_Create(string name, variable var)
15+
1516
ASSERT_TS(!IsEmpty(name), "name can not be empty")
1617

17-
TUFXOP_Init/N=name/Z
18-
TUFXOP_GetStorage/N=name/Z wv
18+
TUFXOP_Init/Z/N=name
19+
TUFXOP_GetStorage/Z/N=name wv
1920

20-
Make/FREE/N=(1)/D data = var
21+
Make/FREE/D data = {var}
2122
wv[0] = data
2223
End
2324

25+
/// @brief Reads a numerical value from a threadstorage
26+
///
27+
/// @param name name of threadstorage
28+
/// @param defValue [optional: default NaN] default value used when storage is created, create flag must be set
29+
/// @param create [optional: default 0] when set the threadstorage is created if it did not exist or had an incompatible format, defValue must be given
2430
threadsafe Function TSDS_ReadVar(string name, [variable defValue, variable create])
31+
32+
variable argCheck = ParamIsDefault(defValue) + ParamIsDefault(create)
33+
ASSERT_TS(argCheck == 2 || argCheck == 0, "defaul value and create must be either both set or both default.")
2534
ASSERT_TS(!IsEmpty(name), "name can not be empty")
2635

27-
if(ParamIsDefault(defValue))
28-
defValue = NaN
29-
endif
30-
31-
if(ParamIsDefault(create))
32-
create = 0
33-
else
34-
create = !!create
35-
endif
36+
defValue = ParamIsDefault(defValue) ? NaN : defValue
37+
create = ParamIsDefault(create) ? 0 : !!create
3638

3739
WAVE/Z data = TSDS_Read(name)
40+
if(WaveExists(data) && IsNumericWave(data) && DimSize(data, ROWS) == 1)
41+
return data[0]
42+
endif
3843

39-
if(!WaveExists(data))
40-
if(create)
41-
TSDS_Write(name, var = defValue)
42-
endif
44+
ASSERT_TS(create == 1, "Error reading from threadstorage:" + name)
4345

44-
return defValue
45-
endif
46+
TSDS_Create(name, defValue)
4647

47-
return data[0]
48+
return defValue
4849
End
4950

51+
/// @brief Reads a single wave ref wave from a named threadstorage
5052
threadsafe static Function/WAVE TSDS_Read(string name)
51-
TUFXOP_GetStorage/Q/N=name/Z wv
5253

53-
if(V_flag)
54-
return $""
54+
TUFXOP_GetStorage/Q/N=name/Z wv
55+
if(!V_flag && WaveExists(wv) && IsWaveRefWave(wv) && DimSize(wv, ROWS) == 1)
56+
return wv[0]
5557
endif
5658

57-
if(!WaveExists(wv) || !IsWaveRefWave(wv) || DimSize(wv, ROWS) != 1)
58-
return $""
59-
endif
59+
return $""
60+
End
61+
62+
/// @brief Writes a numerical value to a threadstorage, if the threadstorage does not exist it is automatically created.
63+
///
64+
/// @param name name of threadstorage
65+
/// @param var numerical value that should be written
66+
/// @returns 0 if write was successful, 1 if write was not successful
67+
threadsafe Function TSDS_WriteVar(string name, variable var)
68+
69+
ASSERT_TS(!IsEmpty(name), "name can not be empty")
6070

61-
WAVE/Z data = wv[0]
71+
WAVE/Z data = TSDS_Read(name)
72+
if(WaveExists(data) && IsNumericWave(data) && DimSize(data, ROWS) == 1)
73+
data[0] = var
6274

63-
if(!WaveExists(data) || !IsNumericWave(data) || DimSize(wv, ROWS) != 1)
64-
return $""
75+
return NaN
6576
endif
6677

67-
return data
78+
TSDS_Create(name, var)
6879
End

Packages/tests/Basic/UTF_Debugging.ipf

-6
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ Function BUG_TSWorks1()
2626

2727
TUFXOP_Clear/N=(TSDS_BUGCOUNT)/Q/Z
2828

29-
bugCount = TSDS_ReadVar(TSDS_BUGCOUNT)
30-
CHECK_EQUAL_VAR(bugCount, NaN)
31-
3229
BUG_TS("abcd")
3330

3431
bugCount = TSDS_ReadVar(TSDS_BUGCOUNT)
@@ -49,9 +46,6 @@ Function BUG_TSWorks2()
4946

5047
TUFXOP_Clear/N=(TSDS_BUGCOUNT)/Q/Z
5148

52-
bugCount = TSDS_ReadVar(TSDS_BUGCOUNT)
53-
CHECK_EQUAL_VAR(bugCount, NaN)
54-
5549
numThreads = 10
5650

5751
Make/FREE/N=(numThreads) junk = NaN

Packages/tests/Basic/UTF_ThreadsafeDataSharing.ipf

+32-28
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,7 @@ End
2222
static Function ChecksParams()
2323

2424
try
25-
TSDS_Write(KEY)
26-
FAIL()
27-
catch
28-
PASS()
29-
endtry
30-
31-
try
32-
TSDS_Write("", var = 1)
25+
TSDS_WriteVar("", 1)
3326
FAIL()
3427
catch
3528
PASS()
@@ -46,36 +39,39 @@ End
4639
static Function WriteWorks1()
4740
variable var
4841

49-
TSDS_Write(KEY, var = 123)
42+
TSDS_WriteVar(KEY, 123)
5043
var = TSDS_ReadVar(KEY)
5144
CHECK_EQUAL_VAR(var, 123)
5245

53-
TSDS_Write(KEY, var = 567)
46+
TSDS_WriteVar(KEY, 567)
5447
var = TSDS_ReadVar(KEY)
5548
CHECK_EQUAL_VAR(var, 567)
5649
End
5750

5851
static Function ReadWorks1()
5952
variable var
6053

61-
var = TSDS_ReadVar(KEY)
62-
CHECK_EQUAL_VAR(var, NaN)
54+
try
55+
TSDS_ReadVar(KEY)
56+
FAIL()
57+
catch
58+
PASS()
59+
endtry
6360

64-
TSDS_Write(KEY, var = 123)
61+
TSDS_WriteVar(KEY, 123)
6562

6663
var = TSDS_ReadVar(KEY)
6764
CHECK_EQUAL_VAR(var, 123)
6865
End
6966

7067
static Function ReadWorksWithDefault()
71-
variable var
7268

73-
var = TSDS_ReadVar(KEY, defValue = 567)
74-
CHECK_EQUAL_VAR(var, 567)
75-
76-
// but it is still not created
77-
var = TSDS_ReadVar(KEY)
78-
CHECK_EQUAL_VAR(var, NaN)
69+
try
70+
TSDS_ReadVar(KEY, defValue = 567)
71+
FAIL()
72+
catch
73+
PASS()
74+
endtry
7975
End
8076

8177
static Function ReadWorksWithDefaultAndCreate()
@@ -92,31 +88,39 @@ End
9288
static Function ReadBrokenStorage1()
9389
variable var
9490

95-
var = TSDS_ReadVar(KEY, create = 1)
96-
CHECK_EQUAL_VAR(var, NaN)
91+
var = TSDS_ReadVar(KEY, defValue = 0, create = 1)
92+
CHECK_EQUAL_VAR(var, 0)
9793

9894
// top level has the wrong size
9995
TUFXOP_GetStorage/N=KEY wv
10096
CHECK_WAVE(wv, WAVE_WAVE)
10197

10298
Redimension/N=0 wv
10399

104-
var = TSDS_ReadVar(KEY)
105-
CHECK_EQUAL_VAR(var, NaN)
100+
try
101+
TSDS_ReadVar(KEY)
102+
FAIL()
103+
catch
104+
PASS()
105+
endtry
106106
End
107107

108108
static Function ReadBrokenStorage2()
109109
variable var
110110

111-
var = TSDS_ReadVar(KEY, create = 1)
112-
CHECK_EQUAL_VAR(var, NaN)
111+
var = TSDS_ReadVar(KEY, defValue = 0, create = 1)
112+
CHECK_EQUAL_VAR(var, 0)
113113

114114
// contained wave is null
115115
TUFXOP_GetStorage/N=KEY wv
116116
CHECK_WAVE(wv, WAVE_WAVE)
117117

118118
wv[0] = $""
119119

120-
var = TSDS_ReadVar(KEY)
121-
CHECK_EQUAL_VAR(var, NaN)
120+
try
121+
TSDS_ReadVar(KEY)
122+
FAIL()
123+
catch
124+
PASS()
125+
endtry
122126
End

Packages/tests/UTF_HelperFunctions.ipf

+3-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ Function AdditionalExperimentCleanup()
165165
KillVariables bugCount
166166

167167
TUFXOP_AcquireLock/N=(TSDS_BUGCOUNT)
168-
TSDS_Write(TSDS_BUGCOUNT, var = 0)
168+
TSDS_WriteVar(TSDS_BUGCOUNT, 0)
169169
TUFXOP_ReleaseLock/N=(TSDS_BUGCOUNT)
170170

171171
KillOrMoveToTrash(wv = GetOverrideResults())
@@ -858,7 +858,7 @@ Function CheckForBugMessages()
858858
endif
859859

860860
TUFXOP_AcquireLock/N=(TSDS_BUGCOUNT)
861-
bugCount_ts = TSDS_ReadVar(TSDS_BUGCOUNT, defValue = 0)
861+
bugCount_ts = TSDS_ReadVar(TSDS_BUGCOUNT, defValue = 0, create = 1)
862862
TUFXOP_ReleaseLock/N=(TSDS_BUGCOUNT)
863863

864864
if(IsFinite(bugCount_ts))
@@ -873,7 +873,7 @@ Function DisableBugChecks()
873873
NVAR bugCount = $GetBugCount()
874874
bugCount = NaN
875875

876-
TSDS_Write(TSDS_BUGCOUNT, var = NaN)
876+
TSDS_WriteVar(TSDS_BUGCOUNT, NaN)
877877
End
878878

879879
/// @brief Exhaust all memory so that only `amountOfFreeMemoryLeft` [GB] is left

0 commit comments

Comments
 (0)