@@ -74,7 +74,8 @@ class IndexWriterWorker final {
7474 compiler_(),
7575 write_counter_(0 ),
7676 segments_(),
77- mutex_(),
77+ segments_mutex_(),
78+ flush_mutex_(),
7879 index_directory_(index_directory),
7980 index_toc_file_(index_directory_ / " index.toc" ),
8081 index_toc_file_part_(index_directory_ / " index.toc.part" ),
@@ -94,7 +95,8 @@ class IndexWriterWorker final {
9495 std::atomic_size_t write_counter_;
9596 segments_t segments_;
9697 std::weak_ptr<segment_vec_t > segments_weak_;
97- std::mutex mutex_;
98+ std::mutex segments_mutex_;
99+ std::mutex flush_mutex_;
98100 const boost::filesystem::path index_directory_;
99101 const boost::filesystem::path index_toc_file_;
100102 const boost::filesystem::path index_toc_file_part_;
@@ -138,7 +140,7 @@ class IndexWriterWorker final {
138140 segments_t segments = payload_.segments_weak_ .lock ();
139141 if (!segments) {
140142 TRACE (" recreate segments weak ptr" );
141- std::unique_lock<std::mutex> lock (payload_.mutex_ );
143+ std::unique_lock<std::mutex> lock (payload_.segments_mutex_ );
142144 payload_.segments_weak_ = payload_.segments_ ;
143145 segments = payload_.segments_ ;
144146 }
@@ -207,13 +209,15 @@ class IndexWriterWorker final {
207209 Compile (&payload);
208210 });
209211 } else {
210- std::mutex m;
211212 std::condition_variable c;
212- std::unique_lock<std::mutex> lock (m );
213+ std::unique_lock<std::mutex> lock (payload_. flush_mutex_ );
213214
214215 compiler_active_object_ ([&c](IndexPayload& payload) {
215- PersistDeletes (&payload);
216- Compile (&payload);
216+ {
217+ PersistDeletes (&payload);
218+ Compile (&payload);
219+ std::unique_lock<std::mutex> lock (payload.flush_mutex_ );
220+ }
217221 c.notify_all ();
218222 });
219223
@@ -320,7 +324,7 @@ class IndexWriterWorker final {
320324
321325 // thread-safe swap
322326 {
323- std::unique_lock<std::mutex> lock (payload_.mutex_ );
327+ std::unique_lock<std::mutex> lock (payload_.segments_mutex_ );
324328 payload_.segments_ .swap (new_segments);
325329 }
326330 WriteToc (&payload_);
@@ -468,7 +472,7 @@ class IndexWriterWorker final {
468472
469473 // thread-safe swap
470474 {
471- std::unique_lock<std::mutex> lock (payload->mutex_ );
475+ std::unique_lock<std::mutex> lock (payload->segments_mutex_ );
472476 payload->segments_ .swap (new_segments);
473477 }
474478
0 commit comments