@@ -156,9 +156,6 @@ libc {
# Used by NPTL and librt
__libc_fatal;
- # Used by NPTL
- _IO_enable_locks;
-
__fseeko64;
__ftello64;
}
@@ -32,8 +32,6 @@ _IO_feof (FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
- if (!_IO_need_lock (fp))
- return _IO_feof_unlocked (fp);
_IO_flockfile (fp);
result = _IO_feof_unlocked (fp);
_IO_funlockfile (fp);
@@ -32,8 +32,6 @@ _IO_ferror (FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
- if (!_IO_need_lock (fp))
- return _IO_ferror_unlocked (fp);
_IO_flockfile (fp);
result = _IO_ferror_unlocked (fp);
_IO_funlockfile (fp);
@@ -32,8 +32,6 @@ fputc (int c, FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
- if (!_IO_need_lock (fp))
- return _IO_putc_unlocked (c, fp);
_IO_acquire_lock (fp);
result = _IO_putc_unlocked (c, fp);
_IO_release_lock (fp);
@@ -488,39 +488,11 @@ _IO_init (FILE *fp, int flags)
_IO_init_internal (fp, flags);
}
-static int stdio_needs_locking;
-
-/* In a single-threaded process most stdio locks can be omitted. After
- _IO_enable_locks is called, locks are not optimized away any more.
- It must be first called while the process is still single-threaded.
-
- This lock optimization can be disabled on a per-file basis by setting
- _IO_FLAGS2_NEED_LOCK, because a file can have user-defined callbacks
- or can be locked with flockfile and then a thread may be created
- between a lock and unlock, so omitting the lock is not valid.
-
- Here we have to make sure that the flag is set on all existing files
- and files created later. */
-void
-_IO_enable_locks (void)
-{
- _IO_ITER i;
-
- if (stdio_needs_locking)
- return;
- stdio_needs_locking = 1;
- for (i = _IO_iter_begin (); i != _IO_iter_end (); i = _IO_iter_next (i))
- _IO_iter_file (i)->_flags2 |= _IO_FLAGS2_NEED_LOCK;
-}
-libc_hidden_def (_IO_enable_locks)
-
void
_IO_old_init (FILE *fp, int flags)
{
fp->_flags = _IO_MAGIC|flags;
fp->_flags2 = 0;
- if (stdio_needs_locking)
- fp->_flags2 |= _IO_FLAGS2_NEED_LOCK;
fp->_IO_buf_base = NULL;
fp->_IO_buf_end = NULL;
fp->_IO_read_base = NULL;
@@ -34,8 +34,6 @@ _IO_getc (FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
- if (!_IO_need_lock (fp))
- return _IO_getc_unlocked (fp);
_IO_acquire_lock (fp);
result = _IO_getc_unlocked (fp);
_IO_release_lock (fp);
@@ -33,10 +33,8 @@ int
getchar (void)
{
int result;
- if (!_IO_need_lock (stdin))
- return _IO_getc_unlocked (stdin);
_IO_acquire_lock (stdin);
result = _IO_getc_unlocked (stdin);
_IO_release_lock (stdin);
return result;
-}
\ No newline at end of file
+}
@@ -162,8 +162,6 @@ _IO_cookie_init (struct _IO_cookie_file *cfile, int read_write,
_IO_mask_flags (&cfile->__fp.file, read_write,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
- cfile->__fp.file._flags2 |= _IO_FLAGS2_NEED_LOCK;
-
/* We use a negative number different from -1 for _fileno to mark that
this special stream is not associated with a real file, but still has
to be treated as such. */
@@ -33,8 +33,6 @@ _IO_ungetc (int c, FILE *fp)
CHECK_FILE (fp, EOF);
if (c == EOF)
return EOF;
- if (!_IO_need_lock (fp))
- return _IO_sputbackc (fp, (unsigned char) c);
_IO_acquire_lock (fp);
result = _IO_sputbackc (fp, (unsigned char) c);
_IO_release_lock (fp);
@@ -89,7 +89,6 @@ typedef struct
#define _IO_FLAGS2_USER_WBUF 8
#define _IO_FLAGS2_NOCLOSE 32
#define _IO_FLAGS2_CLOEXEC 64
-#define _IO_FLAGS2_NEED_LOCK 128
/* _IO_pos_BAD is an off64_t value indicating error, unknown, or EOF. */
#define _IO_pos_BAD ((off64_t) -1)
@@ -213,9 +212,6 @@ extern int _IO_ftrylockfile (FILE *) __THROW;
#define _IO_cleanup_region_end(_Doit) /**/
#endif
-#define _IO_need_lock(_fp) \
- (((_fp)->_flags2 & _IO_FLAGS2_NEED_LOCK) != 0)
-
extern int _IO_vfscanf (FILE * __restrict, const char * __restrict,
__gnuc_va_list, int *__restrict);
extern __ssize_t _IO_padn (FILE *, int, __ssize_t);
@@ -92,9 +92,6 @@ __open_memstream (char **bufloc, size_t *sizeloc)
new_f->fp.bufloc = bufloc;
new_f->fp.sizeloc = sizeloc;
- /* Disable single thread optimization. BZ 21735. */
- new_f->fp._sf._sbf._f._flags2 |= _IO_FLAGS2_NEED_LOCK;
-
return (FILE *) &new_f->fp._sf._sbf;
}
libc_hidden_def (__open_memstream)
@@ -25,8 +25,6 @@ _IO_putc (int c, FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
- if (!_IO_need_lock (fp))
- return _IO_putc_unlocked (c, fp);
_IO_acquire_lock (fp);
result = _IO_putc_unlocked (c, fp);
_IO_release_lock (fp);
@@ -94,9 +94,6 @@ open_wmemstream (wchar_t **bufloc, size_t *sizeloc)
new_f->fp.bufloc = bufloc;
new_f->fp.sizeloc = sizeloc;
- /* Disable single thread optimization. BZ 21735. */
- new_f->fp._sf._sbf._f._flags2 |= _IO_FLAGS2_NEED_LOCK;
-
return (FILE *) &new_f->fp._sf._sbf;
}
@@ -718,9 +718,6 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
collect_default_sched (pd);
}
- if (__glibc_unlikely (__nptl_nthreads == 1))
- _IO_enable_locks ();
-
/* Pass the descriptor to the caller. */
*newthread = (pthread_t) pd;
@@ -22,7 +22,6 @@
void
__flockfile (FILE *stream)
{
- stream->_flags2 |= _IO_FLAGS2_NEED_LOCK;
_IO_lock_lock (*stream->_lock);
}
weak_alias (__flockfile, flockfile);
@@ -106,9 +106,9 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
__libc_lock_recursive_t *const __lock = &(NAME); \
void *__self = __libc_lock_owner_self (); \
int __r = 0; \
- if (__self == __lock->owner) \
+ if (!SINGLE_THREAD_P && __self == __lock->owner) \
++__lock->cnt; \
- else if ((__r = lll_trylock (__lock->lock)) == 0) \
+ else if (!SINGLE_THREAD_P && (__r = lll_trylock (__lock->lock)) == 0) \
__lock->owner = __self, __lock->cnt = 1; \
__r; \
})
@@ -117,7 +117,7 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
({ \
__libc_lock_recursive_t *const __lock = &(NAME); \
void *__self = __libc_lock_owner_self (); \
- if (__self != __lock->owner) \
+ if (!SINGLE_THREAD_P && __self != __lock->owner) \
{ \
lll_lock (__lock->lock, 0); \
__lock->owner = __self; \
@@ -132,7 +132,8 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
if (--__lock->cnt == 0) \
{ \
__lock->owner = 0; \
- lll_unlock (__lock->lock, 0); \
+ if (!SINGLE_THREAD_P) \
+ lll_unlock (__lock->lock, 0); \
} \
})
@@ -90,7 +90,7 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
# define __libc_lock_lock_recursive(NAME) \
do { \
void *self = THREAD_SELF; \
- if ((NAME).owner != self) \
+ if (!SINGLE_THREAD_P && (NAME).owner != self) \
{ \
lll_lock ((NAME).lock, LLL_PRIVATE); \
(NAME).owner = self; \
@@ -108,7 +108,7 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
({ \
int result = 0; \
void *self = THREAD_SELF; \
- if ((NAME).owner != self) \
+ if (!SINGLE_THREAD_P && (NAME).owner != self) \
{ \
if (lll_trylock ((NAME).lock) == 0) \
{ \
@@ -135,7 +135,8 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
if (--(NAME).cnt == 0) \
{ \
(NAME).owner = NULL; \
- lll_unlock ((NAME).lock, LLL_PRIVATE); \
+ if (!SINGLE_THREAD_P) \
+ lll_unlock ((NAME).lock, LLL_PRIVATE); \
} \
} while (0)
#else