2020#include " parse_hex.hpp"
2121#include " raw_csv_data.hpp"
2222
23+ #if CSV_ENABLE_THREADS
24+ #define CSV_INIT_WITH_OPTIONAL_DCL (data_ref, value_ref, ...) \
25+ do { \
26+ if ((value_ref).empty ()) { \
27+ std::lock_guard<std::mutex> lock ((data_ref).double_quote_init_lock ); \
28+ if ((value_ref).empty ()) { \
29+ __VA_ARGS__ \
30+ } \
31+ } \
32+ } while (0 )
33+ #else
34+ #define CSV_INIT_WITH_OPTIONAL_DCL (data_ref, value_ref, ...) \
35+ do { \
36+ (void )(data_ref); \
37+ if ((value_ref).empty ()) { \
38+ __VA_ARGS__ \
39+ } \
40+ } while (0 )
41+ #endif
42+
2343namespace csv {
2444 namespace internals {
2545 class IBasicCSVParser ;
@@ -404,31 +424,7 @@ namespace csv {
404424
405425 if (field.has_double_quote ) {
406426 auto & value = _data->double_quote_fields [field_index];
407- #if CSV_ENABLE_THREADS
408- // Double-check locking: minimize lock contention by checking before acquiring lock
409- if (value.empty ()) {
410- std::lock_guard<std::mutex> lock (_data->double_quote_init_lock );
411-
412- // Check again after acquiring lock in case another thread initialized it
413- if (value.empty ()) {
414- bool prev_ch_quote = false ;
415- for (size_t i = 0 ; i < field.length ; i++) {
416- if (_data->parse_flags [field_str[i] + CHAR_OFFSET] == ParseFlags::QUOTE) {
417- if (prev_ch_quote) {
418- prev_ch_quote = false ;
419- continue ;
420- }
421- else {
422- prev_ch_quote = true ;
423- }
424- }
425-
426- value += field_str[i];
427- }
428- }
429- }
430- #else
431- if (value.empty ()) {
427+ CSV_INIT_WITH_OPTIONAL_DCL ((*_data), value,
432428 bool prev_ch_quote = false ;
433429 for (size_t i = 0 ; i < field.length ; i++) {
434430 if (_data->parse_flags [field_str[i] + CHAR_OFFSET] == ParseFlags::QUOTE) {
@@ -443,8 +439,7 @@ namespace csv {
443439
444440 value += field_str[i];
445441 }
446- }
447- #endif
442+ );
448443
449444 return csv::string_view (value);
450445 }
@@ -551,3 +546,5 @@ inline std::ostream& operator << (std::ostream& os, csv::CSVField const& value)
551546 os << std::string (value);
552547 return os;
553548}
549+
550+ #undef CSV_INIT_WITH_OPTIONAL_DCL
0 commit comments