Skip to content

Commit dc7b06e

Browse files
committed
fix lock implementation
1 parent d3204e4 commit dc7b06e

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

keyvi/include/keyvi/index/internal/index_writer_worker.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)