Skip to content

Commit 88a8796

Browse files
jkoritzinskydirecthex
authored andcommitted
Fix double printing in StressLog and simplify stresslog macros (#105420)
1 parent 4ff0041 commit 88a8796

File tree

4 files changed

+183
-803
lines changed

4 files changed

+183
-803
lines changed

src/coreclr/gc/env/gcenv.h

Lines changed: 55 additions & 236 deletions
Original file line numberDiff line numberDiff line change
@@ -55,72 +55,38 @@
5555
LOGALWAYS(msg); \
5656
} while(0)
5757

58+
#define STRESS_LOG_WRITE(facility, level, msg, ...) do { \
59+
if (StressLog::LogOn(facility, level)) \
60+
StressLog::LogMsg(facility, level, StressLogMsg(msg, __VA_ARGS__)); \
61+
LOG((facility, level, msg, __VA_ARGS__)); \
62+
} while(0)
63+
5864
#define STRESS_LOG0(facility, level, msg) do { \
5965
if (StressLog::LogOn(facility, level)) \
6066
StressLog::LogMsg(level, facility, StressLogMsg(msg)); \
6167
LOG((facility, level, msg)); \
6268
} while(0)
6369

64-
#define STRESS_LOG1(facility, level, msg, data1) do { \
65-
if (StressLog::LogOn(facility, level)) \
66-
StressLog::LogMsg(level, facility, \
67-
StressLogMsg(msg, (void*)(size_t)(data1))); \
68-
LOG((facility, level, msg, data1)); \
69-
} while(0)
70+
#define STRESS_LOG1(facility, level, msg, data1) \
71+
STRESS_LOG_WRITE(facility, level, msg, data1)
7072

71-
#define STRESS_LOG2(facility, level, msg, data1, data2) do { \
72-
if (StressLog::LogOn(facility, level)) \
73-
StressLog::LogMsg(level, facility, \
74-
StressLogMsg(msg, (void*)(size_t)(data1), (void*)(size_t)(data2))); \
75-
LOG((facility, level, msg, data1, data2)); \
76-
} while(0)
73+
#define STRESS_LOG2(facility, level, msg, data1, data2) \
74+
STRESS_LOG_WRITE(facility, level, msg, data1, data2)
7775

78-
#define STRESS_LOG2_CHECK_EE_STARTED(facility, level, msg, data1, data2) do { \
79-
if (g_fEEStarted) \
80-
STRESS_LOG2(facility, level, msg, data1, data2); \
81-
else \
82-
LOG((facility, level, msg, data1, data2)); \
83-
} while(0)
84-
85-
#define STRESS_LOG3(facility, level, msg, data1, data2, data3) do { \
86-
if (StressLog::LogOn(facility, level)) \
87-
StressLog::LogMsg(level, facility, \
88-
StressLogMsg(msg, \
89-
(void*)(size_t)(data1),(void*)(size_t)(data2),(void*)(size_t)(data3))); \
90-
LOG((facility, level, msg, data1, data2, data3)); \
91-
} while(0)
76+
#define STRESS_LOG3(facility, level, msg, data1, data2, data3) \
77+
STRESS_LOG_WRITE(facility, level, msg, data1, data2, data3)
9278

93-
#define STRESS_LOG4(facility, level, msg, data1, data2, data3, data4) do { \
94-
if (StressLog::LogOn(facility, level)) \
95-
StressLog::LogMsg(level, facility, \
96-
StressLogMsg(msg, (void*)(size_t)(data1),(void*)(size_t)(data2), \
97-
(void*)(size_t)(data3),(void*)(size_t)(data4))); \
98-
LOG((facility, level, msg, data1, data2, data3, data4)); \
99-
} while(0)
79+
#define STRESS_LOG4(facility, level, msg, data1, data2, data3, data4) \
80+
STRESS_LOG_WRITE(facility, level, msg, data1, data2, data3, data4)
10081

101-
#define STRESS_LOG5(facility, level, msg, data1, data2, data3, data4, data5) do { \
102-
if (StressLog::LogOn(facility, level)) \
103-
StressLog::LogMsg(level, facility, 5, msg, (void*)(size_t)(data1), \
104-
(void*)(size_t)(data2),(void*)(size_t)(data3),(void*)(size_t)(data4), \
105-
(void*)(size_t)(data5)); \
106-
LOG((facility, level, msg, data1, data2, data3, data4, data5)); \
107-
} while(0)
82+
#define STRESS_LOG5(facility, level, msg, data1, data2, data3, data4, data5) \
83+
STRESS_LOG_WRITE(facility, level, msg, data1, data2, data3, data4, data5)
10884

109-
#define STRESS_LOG6(facility, level, msg, data1, data2, data3, data4, data5, data6) do { \
110-
if (StressLog::LogOn(facility, level)) \
111-
StressLog::LogMsg(level, facility, 6, msg, (void*)(size_t)(data1), \
112-
(void*)(size_t)(data2),(void*)(size_t)(data3),(void*)(size_t)(data4), \
113-
(void*)(size_t)(data5), (void*)(size_t)(data6)); \
114-
LOG((facility, level, msg, data1, data2, data3, data4, data5, data6)); \
115-
} while(0)
85+
#define STRESS_LOG6(facility, level, msg, data1, data2, data3, data4, data5, data6) \
86+
STRESS_LOG_WRITE(facility, level, msg, data1, data2, data3, data4, data5, data6)
11687

117-
#define STRESS_LOG7(facility, level, msg, data1, data2, data3, data4, data5, data6, data7) do { \
118-
if (StressLog::LogOn(facility, level)) \
119-
StressLog::LogMsg(level, facility, 7, msg, (void*)(size_t)(data1), \
120-
(void*)(size_t)(data2),(void*)(size_t)(data3),(void*)(size_t)(data4), \
121-
(void*)(size_t)(data5), (void*)(size_t)(data6), (void*)(size_t)(data7)); \
122-
LOG((facility, level, msg, data1, data2, data3, data4, data5, data6, data7)); \
123-
} while(0)
88+
#define STRESS_LOG7(facility, level, msg, data1, data2, data3, data4, data5, data6, data7) \
89+
STRESS_LOG_WRITE(facility, level, msg, data1, data2, data3, data4, data5, data6, data7)
12490

12591
#define LOGALWAYS(msg)
12692

@@ -205,200 +171,53 @@ struct StressLogMsg
205171
const char* m_format;
206172
void* m_args[16];
207173

208-
StressLogMsg(const char* format) : m_cArgs(0), m_format(format)
209-
{
210-
}
211-
212-
template < typename T1 >
213-
StressLogMsg(const char* format, T1 data1) : m_cArgs(1), m_format(format)
214-
{
215-
static_assert_no_msg(sizeof(T1) <= sizeof(void*));
216-
m_args[0] = (void*)(size_t)data1;
217-
}
218-
219-
template < typename T1, typename T2 >
220-
StressLogMsg(const char* format, T1 data1, T2 data2) : m_cArgs(2), m_format(format)
221-
{
222-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*));
223-
m_args[0] = (void*)(size_t)data1;
224-
m_args[1] = (void*)(size_t)data2;
225-
}
226-
227-
template < typename T1, typename T2, typename T3 >
228-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3) : m_cArgs(3), m_format(format)
229-
{
230-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*));
231-
m_args[0] = (void*)(size_t)data1;
232-
m_args[1] = (void*)(size_t)data2;
233-
m_args[2] = (void*)(size_t)data3;
234-
}
235-
236-
template < typename T1, typename T2, typename T3, typename T4 >
237-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4) : m_cArgs(4), m_format(format)
238-
{
239-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*));
240-
m_args[0] = (void*)(size_t)data1;
241-
m_args[1] = (void*)(size_t)data2;
242-
m_args[2] = (void*)(size_t)data3;
243-
m_args[3] = (void*)(size_t)data4;
244-
}
245-
246-
template < typename T1, typename T2, typename T3, typename T4, typename T5 >
247-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5) : m_cArgs(5), m_format(format)
174+
template<typename T>
175+
static void* ConvertArgument(T arg)
248176
{
249-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*));
250-
m_args[0] = (void*)(size_t)data1;
251-
m_args[1] = (void*)(size_t)data2;
252-
m_args[2] = (void*)(size_t)data3;
253-
m_args[3] = (void*)(size_t)data4;
254-
m_args[4] = (void*)(size_t)data5;
177+
static_assert_no_msg(sizeof(T) <= sizeof(void*));
178+
return (void*)(size_t)arg;
255179
}
256180

257-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6 >
258-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6) : m_cArgs(6), m_format(format)
259-
{
260-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*));
261-
m_args[0] = (void*)(size_t)data1;
262-
m_args[1] = (void*)(size_t)data2;
263-
m_args[2] = (void*)(size_t)data3;
264-
m_args[3] = (void*)(size_t)data4;
265-
m_args[4] = (void*)(size_t)data5;
266-
m_args[5] = (void*)(size_t)data6;
267-
}
268-
269-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7 >
270-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7) : m_cArgs(7), m_format(format)
271-
{
272-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*));
273-
m_args[0] = (void*)(size_t)data1;
274-
m_args[1] = (void*)(size_t)data2;
275-
m_args[2] = (void*)(size_t)data3;
276-
m_args[3] = (void*)(size_t)data4;
277-
m_args[4] = (void*)(size_t)data5;
278-
m_args[5] = (void*)(size_t)data6;
279-
m_args[6] = (void*)(size_t)data7;
280-
}
281-
282-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8 >
283-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8) : m_cArgs(8), m_format(format)
284-
{
285-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*));
286-
m_args[0] = (void*)(size_t)data1;
287-
m_args[1] = (void*)(size_t)data2;
288-
m_args[2] = (void*)(size_t)data3;
289-
m_args[3] = (void*)(size_t)data4;
290-
m_args[4] = (void*)(size_t)data5;
291-
m_args[5] = (void*)(size_t)data6;
292-
m_args[6] = (void*)(size_t)data7;
293-
m_args[7] = (void*)(size_t)data8;
294-
}
295-
296-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9 >
297-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8, T9 data9) : m_cArgs(9), m_format(format)
298-
{
299-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*) && sizeof(T9) <= sizeof(void*));
300-
m_args[0] = (void*)(size_t)data1;
301-
m_args[1] = (void*)(size_t)data2;
302-
m_args[2] = (void*)(size_t)data3;
303-
m_args[3] = (void*)(size_t)data4;
304-
m_args[4] = (void*)(size_t)data5;
305-
m_args[5] = (void*)(size_t)data6;
306-
m_args[6] = (void*)(size_t)data7;
307-
m_args[7] = (void*)(size_t)data8;
308-
m_args[8] = (void*)(size_t)data9;
309-
}
310-
311-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10 >
312-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8, T9 data9, T10 data10) : m_cArgs(10), m_format(format)
181+
StressLogMsg(const char* format) : m_cArgs(0), m_format(format)
313182
{
314-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*) && sizeof(T9) <= sizeof(void*) && sizeof(T10) <= sizeof(void*));
315-
m_args[0] = (void*)(size_t)data1;
316-
m_args[1] = (void*)(size_t)data2;
317-
m_args[2] = (void*)(size_t)data3;
318-
m_args[3] = (void*)(size_t)data4;
319-
m_args[4] = (void*)(size_t)data5;
320-
m_args[5] = (void*)(size_t)data6;
321-
m_args[6] = (void*)(size_t)data7;
322-
m_args[7] = (void*)(size_t)data8;
323-
m_args[8] = (void*)(size_t)data9;
324-
m_args[9] = (void*)(size_t)data10;
325183
}
326184

327-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11 >
328-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8, T9 data9, T10 data10, T11 data11) : m_cArgs(11), m_format(format)
185+
template<typename... Ts>
186+
StressLogMsg(const char* format, Ts... args)
187+
: m_cArgs(sizeof...(args))
188+
, m_format(format)
189+
, m_args{ ConvertArgument(args)... }
329190
{
330-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*) && sizeof(T9) <= sizeof(void*) && sizeof(T10) <= sizeof(void*) && sizeof(T11) <= sizeof(void*));
331-
m_args[0] = (void*)(size_t)data1;
332-
m_args[1] = (void*)(size_t)data2;
333-
m_args[2] = (void*)(size_t)data3;
334-
m_args[3] = (void*)(size_t)data4;
335-
m_args[4] = (void*)(size_t)data5;
336-
m_args[5] = (void*)(size_t)data6;
337-
m_args[6] = (void*)(size_t)data7;
338-
m_args[7] = (void*)(size_t)data8;
339-
m_args[8] = (void*)(size_t)data9;
340-
m_args[9] = (void*)(size_t)data10;
341-
m_args[10] = (void*)(size_t)data11;
191+
static_assert_no_msg(sizeof...(args) <= ARRAY_SIZE(m_args));
342192
}
193+
};
343194

344-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12 >
345-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8, T9 data9, T10 data10, T11 data11, T12 data12) : m_cArgs(12), m_format(format)
346-
{
347-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*) && sizeof(T9) <= sizeof(void*) && sizeof(T10) <= sizeof(void*) && sizeof(T11) <= sizeof(void*) && sizeof(T12) <= sizeof(void*));
348-
m_args[0] = (void*)(size_t)data1;
349-
m_args[1] = (void*)(size_t)data2;
350-
m_args[2] = (void*)(size_t)data3;
351-
m_args[3] = (void*)(size_t)data4;
352-
m_args[4] = (void*)(size_t)data5;
353-
m_args[5] = (void*)(size_t)data6;
354-
m_args[6] = (void*)(size_t)data7;
355-
m_args[7] = (void*)(size_t)data8;
356-
m_args[8] = (void*)(size_t)data9;
357-
m_args[9] = (void*)(size_t)data10;
358-
m_args[10] = (void*)(size_t)data11;
359-
m_args[11] = (void*)(size_t)data12;
360-
}
195+
template<>
196+
void* StressLogMsg::ConvertArgument(float arg) = delete;
361197

198+
#if TARGET_64BIT
199+
template<>
200+
inline void* StressLogMsg::ConvertArgument(double arg)
201+
{
202+
return (void*)(size_t)(*((uint64_t*)&arg));
203+
}
204+
#else
205+
template<>
206+
void* StressLogMsg::ConvertArgument(double arg) = delete;
362207

363-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13 >
364-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8, T9 data9, T10 data10, T11 data11, T12 data12, T13 data13) : m_cArgs(13), m_format(format)
365-
{
366-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*) && sizeof(T9) <= sizeof(void*) && sizeof(T10) <= sizeof(void*) && sizeof(T11) <= sizeof(void*) && sizeof(T12) <= sizeof(void*) && sizeof(T13) <= sizeof(void*));
367-
m_args[0] = (void*)(size_t)data1;
368-
m_args[1] = (void*)(size_t)data2;
369-
m_args[2] = (void*)(size_t)data3;
370-
m_args[3] = (void*)(size_t)data4;
371-
m_args[4] = (void*)(size_t)data5;
372-
m_args[5] = (void*)(size_t)data6;
373-
m_args[6] = (void*)(size_t)data7;
374-
m_args[7] = (void*)(size_t)data8;
375-
m_args[8] = (void*)(size_t)data9;
376-
m_args[9] = (void*)(size_t)data10;
377-
m_args[10] = (void*)(size_t)data11;
378-
m_args[11] = (void*)(size_t)data12;
379-
m_args[12] = (void*)(size_t)data13;
380-
}
208+
// COMPAT: Truncate 64-bit integer arguments to 32-bit
209+
template<>
210+
inline void* StressLogMsg::ConvertArgument(uint64_t arg)
211+
{
212+
return (void*)(size_t)arg;
213+
}
381214

382-
template < typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14 >
383-
StressLogMsg(const char* format, T1 data1, T2 data2, T3 data3, T4 data4, T5 data5, T6 data6, T7 data7, T8 data8, T9 data9, T10 data10, T11 data11, T12 data12, T13 data13, T14 data14) : m_cArgs(14), m_format(format)
384-
{
385-
static_assert_no_msg(sizeof(T1) <= sizeof(void*) && sizeof(T2) <= sizeof(void*) && sizeof(T3) <= sizeof(void*) && sizeof(T4) <= sizeof(void*) && sizeof(T5) <= sizeof(void*) && sizeof(T6) <= sizeof(void*) && sizeof(T7) <= sizeof(void*) && sizeof(T8) <= sizeof(void*) && sizeof(T9) <= sizeof(void*) && sizeof(T10) <= sizeof(void*) && sizeof(T11) <= sizeof(void*) && sizeof(T12) <= sizeof(void*) && sizeof(T13) <= sizeof(void*) && sizeof(T14) <= sizeof(void*));
386-
m_args[0] = (void*)(size_t)data1;
387-
m_args[1] = (void*)(size_t)data2;
388-
m_args[2] = (void*)(size_t)data3;
389-
m_args[3] = (void*)(size_t)data4;
390-
m_args[4] = (void*)(size_t)data5;
391-
m_args[5] = (void*)(size_t)data6;
392-
m_args[6] = (void*)(size_t)data7;
393-
m_args[7] = (void*)(size_t)data8;
394-
m_args[8] = (void*)(size_t)data9;
395-
m_args[9] = (void*)(size_t)data10;
396-
m_args[10] = (void*)(size_t)data11;
397-
m_args[11] = (void*)(size_t)data12;
398-
m_args[12] = (void*)(size_t)data13;
399-
m_args[13] = (void*)(size_t)data14;
400-
}
401-
};
215+
template<>
216+
inline void* StressLogMsg::ConvertArgument(int64_t arg)
217+
{
218+
return (void*)(size_t)arg;
219+
}
220+
#endif
402221

403222
class StressLog
404223
{

0 commit comments

Comments
 (0)