mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
refactor flockfile not to duplicate lock mechanism logic
This commit is contained in:
parent
c21f750727
commit
c1014a812c
2 changed files with 14 additions and 12 deletions
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue