always add memory streams to stdio open file list

per interpretation for austin group issue #626, fflush(0) and exit()
must block waiting for a lock if another thread has locked a memory
stream with flockfile. this adds some otherwise-unnecessary
synchronization cost to use of memory streams, but there was already a
synchronization cost calling malloc anyway.

previously the stream was only added to the open file list in
single-threaded programs, so that upon subsequent call to
pthread_create, locking could be turned on for the stream.
This commit is contained in:
Rich Felker 2012-11-09 14:26:25 -05:00
parent 65465101ee
commit dc059f03e8
3 changed files with 21 additions and 18 deletions

View File

@ -108,12 +108,13 @@ FILE *fmemopen(void *restrict buf, size_t size, const char *restrict mode)
f->seek = mseek; f->seek = mseek;
f->close = mclose; f->close = mclose;
if (!libc.threaded) { if (!libc.threaded) f->lock = -1;
f->lock = -1;
f->next = libc.ofl_head; OFLLOCK();
if (libc.ofl_head) libc.ofl_head->prev = f; f->next = libc.ofl_head;
libc.ofl_head = f; if (libc.ofl_head) libc.ofl_head->prev = f;
} libc.ofl_head = f;
OFLUNLOCK();
return f; return f;
} }

View File

@ -77,12 +77,13 @@ FILE *open_memstream(char **bufp, size_t *sizep)
f->seek = ms_seek; f->seek = ms_seek;
f->close = ms_close; f->close = ms_close;
if (!libc.threaded) { if (!libc.threaded) f->lock = -1;
f->lock = -1;
f->next = libc.ofl_head; OFLLOCK();
if (libc.ofl_head) libc.ofl_head->prev = f; f->next = libc.ofl_head;
libc.ofl_head = f; if (libc.ofl_head) libc.ofl_head->prev = f;
} libc.ofl_head = f;
OFLUNLOCK();
return f; return f;
} }

View File

@ -79,12 +79,13 @@ FILE *open_wmemstream(wchar_t **bufp, size_t *sizep)
f->seek = wms_seek; f->seek = wms_seek;
f->close = wms_close; f->close = wms_close;
if (!libc.threaded) { if (!libc.threaded) f->lock = -1;
f->lock = -1;
f->next = libc.ofl_head; OFLLOCK();
if (libc.ofl_head) libc.ofl_head->prev = f; f->next = libc.ofl_head;
libc.ofl_head = f; if (libc.ofl_head) libc.ofl_head->prev = f;
} libc.ofl_head = f;
OFLUNLOCK();
return f; return f;
} }