While signals are currently blocked in these helpers, they may not always be... --- lib/PublicInbox/XapHelper.pm | 4 ++-- lib/PublicInbox/xap_helper.h | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/lib/PublicInbox/XapHelper.pm b/lib/PublicInbox/XapHelper.pm index 8c2b86d6..f90b283d 100644 --- a/lib/PublicInbox/XapHelper.pm +++ b/lib/PublicInbox/XapHelper.pm @@ -109,9 +109,9 @@ sub dump_roots_iter ($$$) { sub dump_roots_flush ($$) { my ($req, $fh) = @_; if ($req->{wbuf} ne '') { - flock($fh, LOCK_EX) or die "flock: $!"; + until (flock($fh, LOCK_EX)) { die "LOCK_EX: $!" if !$!{EINTR} } print { $req->{0} } $req->{wbuf} or die "print: $!"; - flock($fh, LOCK_UN) or die "flock: $!"; + until (flock($fh, LOCK_UN)) { die "LOCK_UN: $!" if !$!{EINTR} } $req->{wbuf} = ''; } } diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h index 5f04316c..a78a3f76 100644 --- a/lib/PublicInbox/xap_helper.h +++ b/lib/PublicInbox/xap_helper.h @@ -441,7 +441,8 @@ static bool dump_roots_flush(struct req *req, struct dump_roots_tmp *drt) } drt->wbuf.fp = NULL; if (!drt->wbuf.len) goto done_free; - if (flock(drt->root2id_fd, LOCK_EX)) { + while (flock(drt->root2id_fd, LOCK_EX)) { + if (errno == EINTR) continue; perror("LOCK_EX"); return false; } @@ -456,7 +457,8 @@ static bool dump_roots_flush(struct req *req, struct dump_roots_tmp *drt) return false; } } while (drt->wbuf.len); - if (flock(drt->root2id_fd, LOCK_UN)) { + while (flock(drt->root2id_fd, LOCK_UN)) { + if (errno == EINTR) continue; perror("LOCK_UN"); return false; }