mirror of
https://github.com/fluencelabs/musl
synced 2025-06-20 18:26:52 +00:00
simplify and optimize FILE lock handling
This commit is contained in:
@ -23,8 +23,8 @@
|
|||||||
|
|
||||||
#define UNGET 4
|
#define UNGET 4
|
||||||
|
|
||||||
#define FLOCK(f) ((libc.lockfile && (f)->owner>=0) ? (libc.lockfile((f)),0) : 0)
|
#define FLOCK(f) ((libc.lockfile && (f)->lock>=0) ? (libc.lockfile((f)),0) : 0)
|
||||||
#define FUNLOCK(f) ((f)->lockcount && (--(f)->lockcount || ((f)->owner=(f)->lock=0)))
|
#define FUNLOCK(f) ((f)->lockcount && (--(f)->lockcount || ((f)->lock=0)))
|
||||||
|
|
||||||
#define F_PERM 1
|
#define F_PERM 1
|
||||||
#define F_NORD 4
|
#define F_NORD 4
|
||||||
@ -59,7 +59,6 @@ struct __FILE_s {
|
|||||||
off_t (*seek)(FILE *, off_t, int);
|
off_t (*seek)(FILE *, off_t, int);
|
||||||
int mode;
|
int mode;
|
||||||
int (*close)(FILE *);
|
int (*close)(FILE *);
|
||||||
int owner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t __stdio_read(FILE *, unsigned char *, size_t);
|
size_t __stdio_read(FILE *, unsigned char *, size_t);
|
||||||
|
@ -3,17 +3,18 @@
|
|||||||
|
|
||||||
void __lockfile(FILE *f)
|
void __lockfile(FILE *f)
|
||||||
{
|
{
|
||||||
int spins;
|
int spins=100000;
|
||||||
if (f->owner < 0) return;
|
int tid;
|
||||||
if (f->owner && f->owner == __pthread_self()->tid) {
|
|
||||||
|
if (f->lock < 0) return;
|
||||||
|
tid = __pthread_self()->tid;
|
||||||
|
if (f->lock == tid) {
|
||||||
while (f->lockcount == INT_MAX);
|
while (f->lockcount == INT_MAX);
|
||||||
f->lockcount++;
|
f->lockcount++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
spins = 100000;
|
while (f->lock || a_cas(&f->lock, 0, tid))
|
||||||
while (a_swap(&f->lock, 1))
|
|
||||||
if (spins) spins--, a_spin();
|
if (spins) spins--, a_spin();
|
||||||
else syscall(SYS_sched_yield);
|
else syscall(SYS_sched_yield);
|
||||||
f->owner = __pthread_self()->tid;
|
|
||||||
f->lockcount = 1;
|
f->lockcount = 1;
|
||||||
}
|
}
|
||||||
|
@ -3,16 +3,16 @@
|
|||||||
|
|
||||||
int ftrylockfile(FILE *f)
|
int ftrylockfile(FILE *f)
|
||||||
{
|
{
|
||||||
|
int tid = pthread_self()->tid;
|
||||||
if (!libc.lockfile) libc.lockfile = __lockfile;
|
if (!libc.lockfile) libc.lockfile = __lockfile;
|
||||||
if (f->owner && f->owner == pthread_self()->tid) {
|
if (f->lock == tid) {
|
||||||
if (f->lockcount == INT_MAX)
|
if (f->lockcount == INT_MAX)
|
||||||
return -1;
|
return -1;
|
||||||
f->lockcount++;
|
f->lockcount++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (a_swap(&f->lock, 1))
|
if (f->lock || a_cas(&f->lock, 0, tid))
|
||||||
return -1;
|
return -1;
|
||||||
f->owner = pthread_self()->tid;
|
|
||||||
f->lockcount = 1;
|
f->lockcount = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ int vsnprintf(char *s, size_t n, const char *fmt, va_list ap)
|
|||||||
f.write = sn_write;
|
f.write = sn_write;
|
||||||
f.buf_size = 1;
|
f.buf_size = 1;
|
||||||
f.buf = buf;
|
f.buf = buf;
|
||||||
f.owner = -1;
|
f.lock = -1;
|
||||||
if (n > INT_MAX) {
|
if (n > INT_MAX) {
|
||||||
errno = EOVERFLOW;
|
errno = EOVERFLOW;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -32,7 +32,7 @@ int vswprintf(wchar_t *s, size_t n, const wchar_t *fmt, va_list ap)
|
|||||||
f.write = sw_write;
|
f.write = sw_write;
|
||||||
f.buf_size = sizeof buf;
|
f.buf_size = sizeof buf;
|
||||||
f.buf = buf;
|
f.buf = buf;
|
||||||
f.owner = -1;
|
f.lock = -1;
|
||||||
f.cookie = &c;
|
f.cookie = &c;
|
||||||
if (!n) {
|
if (!n) {
|
||||||
return -1;
|
return -1;
|
||||||
|
Reference in New Issue
Block a user