diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/stdio/flockfile.c | 11 | ||||
| -rw-r--r-- | src/stdio/ftrylockfile.c | 15 | 
2 files changed, 14 insertions, 12 deletions
diff --git a/src/stdio/flockfile.c b/src/stdio/flockfile.c index 6b574cf0..6806cf8b 100644 --- a/src/stdio/flockfile.c +++ b/src/stdio/flockfile.c @@ -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());  } diff --git a/src/stdio/ftrylockfile.c b/src/stdio/ftrylockfile.c index 3b1d5f20..3b97807a 100644 --- a/src/stdio/ftrylockfile.c +++ b/src/stdio/ftrylockfile.c @@ -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;  }  | 
