Skip to content

Commit dbd31e1

Browse files
authored
Merge pull request #29 from mutouyun/master
Merge from master
2 parents 321dc45 + 9667d50 commit dbd31e1

File tree

3 files changed

+11
-6
lines changed

3 files changed

+11
-6
lines changed

src/ipc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ static ipc::buff_t recv(ipc::handle_t h, std::size_t tm) {
555555
recycle_storage(reinterpret_cast<std::size_t>(ptr) - 1, size);
556556
}, reinterpret_cast<void*>(buf_id + 1) };
557557
}
558-
else ipc::log("fail: shm::handle for big message. msg_id: %zd, size: %zd\n", msg.id_, remain);
558+
else ipc::log("fail: shm::handle for big message. msg_id: %zd, buf_id: %zd, size: %zd\n", msg.id_, buf_id, remain);
559559
}
560560
// gc
561561
if (rc.size() > 1024) {

src/libipc/prod_cons.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,14 @@ struct prod_cons_impl<wr<relat::multi, relat::multi, trans::broadcast>> {
376376
}
377377
// just compare & exchange
378378
if (el->rc_.compare_exchange_weak(
379-
cur_rc, inc_mask(epoch | (cur_rc & ep_mask)) | static_cast<rc_t>(cc), std::memory_order_relaxed) &&
380-
epoch_.compare_exchange_weak(epoch, epoch, std::memory_order_acq_rel)) {
381-
break;
379+
cur_rc, inc_mask(epoch | (cur_rc & ep_mask)) | static_cast<rc_t>(cc), std::memory_order_relaxed)) {
380+
if (epoch == epoch_.load(std::memory_order_acquire)) {
381+
break;
382+
}
383+
else if (push(wrapper, std::forward<F>(f), elems)) {
384+
return true;
385+
}
386+
epoch = epoch_.fetch_add(ep_incr, std::memory_order_release) + ep_incr;
382387
}
383388
ipc::yield(k);
384389
}

src/libipc/waiter_helper.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct waiter_helper {
5555
}
5656
else if (flags.need_dest_.exchange(false, std::memory_order_release)) {
5757
ret = false;
58-
ctrl.sema_wait(tm);
58+
ctrl.sema_wait(default_timeout);
5959
break;
6060
}
6161
else {
@@ -106,6 +106,7 @@ struct waiter_helper {
106106
template <typename Ctrl>
107107
static bool quit_waiting(Ctrl & ctrl) {
108108
auto & flags = ctrl.flags();
109+
flags.need_dest_.store(true, std::memory_order_relaxed);
109110
if (!flags.is_waiting_.exchange(false, std::memory_order_release)) {
110111
return true;
111112
}
@@ -116,7 +117,6 @@ struct waiter_helper {
116117
bool ret = true;
117118
IPC_UNUSED_ auto guard = ctrl.get_lock();
118119
if (counter.counter_ > 0) {
119-
flags.need_dest_.store(true, std::memory_order_relaxed);
120120
ret = ctrl.sema_post(counter.counter_);
121121
counter.counter_ -= 1;
122122
ret = ret && ctrl.handshake_wait(default_timeout);

0 commit comments

Comments
 (0)