refactor flockfile not to duplicate lock mechanism logic
authorRich Felker <dalias@aerifal.cx>
Wed, 18 Apr 2018 04:16:12 +0000 (00:16 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 18 Apr 2018 18:22:49 +0000 (14:22 -0400)
src/stdio/flockfile.c
src/stdio/ftrylockfile.c

index 6b574cf0905f8ac4bd58458c2730d5e79b739634..6806cf8b32e0c13f1b67c2d920e8485a94c42f42 100644 (file)
@@ -1,14 +1,11 @@
 #include "stdio_impl.h"
 #include "pthread_impl.h"
 
-#define MAYBE_WAITERS 0x40000000
+void __register_locked_file(FILE *, pthread_t);
 
 void flockfile(FILE *f)
 {
-       while (ftrylockfile(f)) {
-               int owner = f->lock;
-               if (!owner) continue;
-               a_cas(&f->lock, owner, owner|MAYBE_WAITERS);
-               __futexwait(&f->lock, owner|MAYBE_WAITERS, 1);
-       }
+       if (!ftrylockfile(f)) return;
+       __lockfile(f);
+       __register_locked_file(f, __pthread_self());
 }
index 3b1d5f20fdcc9ef1af84990c32a5464ef31c0f51..3b97807a5e64df7705cce562e834ca2f9c86a07c 100644 (file)
@@ -20,6 +20,15 @@ void __unlist_locked_file(FILE *f)
        }
 }
 
+void __register_locked_file(FILE *f, pthread_t self)
+{
+       f->lockcount = 1;
+       f->prev_locked = 0;
+       f->next_locked = self->stdio_locks;
+       if (f->next_locked) f->next_locked->prev_locked = f;
+       self->stdio_locks = f;
+}
+
 int ftrylockfile(FILE *f)
 {
        pthread_t self = __pthread_self();
@@ -34,10 +43,6 @@ int ftrylockfile(FILE *f)
        if (owner < 0) f->lock = owner = 0;
        if (owner || a_cas(&f->lock, 0, tid))
                return -1;
-       f->lockcount = 1;
-       f->prev_locked = 0;
-       f->next_locked = self->stdio_locks;
-       if (f->next_locked) f->next_locked->prev_locked = f;
-       self->stdio_locks = f;
+       __register_locked_file(f, self);
        return 0;
 }