X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fbarrier.c;h=f65363a67b11ab9bc625a21b47aeb5caa182f6c5;hp=4ac42d023943cd2d76d17b46f4287c9f582e8a7f;hb=ee05e7795bb9ad7d1212dd49ad362f3e9603c4fd;hpb=7566e26721ee95d6fc864e9e6654fb61bd3cd603 diff --git a/src/shared/barrier.c b/src/shared/barrier.c index 4ac42d023..f65363a67 100644 --- a/src/shared/barrier.c +++ b/src/shared/barrier.c @@ -112,15 +112,24 @@ * Returns: 0 on success, negative error code on failure. */ int barrier_create(Barrier *b) { + _cleanup_(barrier_destroyp) Barrier *staging = b; + int r; + assert(b); - if ((b->me = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) < 0 || - (b->them = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) < 0 || - pipe2(b->pipe, O_CLOEXEC | O_NONBLOCK) < 0) { - barrier_destroy(b); + b->me = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); + if (b->me < 0) + return -errno; + + b->them = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); + if (b->them < 0) return -errno; - } + r = pipe2(b->pipe, O_CLOEXEC | O_NONBLOCK); + if (r < 0) + return -errno; + + staging = NULL; return 0; } @@ -257,6 +266,8 @@ static bool barrier_read(Barrier *b, int64_t comp) { * guarantees that exit-abortions do not overwrite real * barriers. */ buf = BARRIER_ABORTION; + else + continue; /* lock if they aborted */ if (buf >= (uint64_t)BARRIER_ABORTION) {