* [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock
@ 2021-05-27 20:44 Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 1/4] libio: Assume _IO_lock_inexpensive Adhemerval Zanella
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Adhemerval Zanella @ 2021-05-27 20:44 UTC (permalink / raw)
To: libc-alpha
This patchset removes some old unused code (_IO_lock_inexpensive
and _IO_MTSAFE_IO), consolidate the stdio-lock.h and move the
single-thread lock optimization to generic code instead of
per-function usage.
Adhemerval Zanella (4):
libio: Assume _IO_lock_inexpensive
libio: Assume _IO_MTSAFE_IO
Consolidate stdio-lock.h
Move libio lock single-thread optimization to generic libc-lock (BZ
#27842)
Makeconfig | 2 -
debug/Makefile | 43 +++++-------
grp/Makefile | 4 +-
gshadow/Makefile | 4 +-
htl/Makefile | 2 -
hurd/vpprintf.c | 4 --
include/stdio.h | 2 +-
libio/Makefile | 2 -
libio/Versions | 3 -
libio/clearerr.c | 4 --
libio/feof.c | 7 --
libio/ferror.c | 9 +--
libio/fileno.c | 2 +-
libio/fputc.c | 7 --
libio/genops.c | 66 -------------------
libio/getc.c | 8 ---
libio/getchar.c | 7 --
libio/iofdopen.c | 4 --
libio/iofflush.c | 7 --
libio/iofgets.c | 7 --
libio/iofopen.c | 4 --
libio/iofopncook.c | 6 --
libio/iofputs.c | 7 --
libio/iofread.c | 6 --
libio/iofwrite.c | 6 +-
libio/iopopen.c | 14 ----
libio/ioungetc.c | 2 -
libio/iovdprintf.c | 2 -
libio/iovsprintf.c | 2 -
libio/libio.h | 37 +++--------
libio/libioP.h | 30 ++-------
libio/memstream.c | 7 --
libio/obprintf.c | 2 -
libio/oldiofdopen.c | 4 --
libio/oldiofopen.c | 4 --
libio/oldiopopen.c | 14 ----
libio/oldstdfiles.c | 6 --
libio/putc.c | 7 --
libio/putchar.c | 5 --
libio/stdfiles.c | 11 +---
libio/vasprintf.c | 2 -
libio/vsnprintf.c | 2 -
libio/vswprintf.c | 2 -
libio/wgenops.c | 2 -
libio/wmemstream.c | 7 --
nptl/Makefile | 3 -
nptl/pthread_create.c | 3 -
pwd/Makefile | 1 -
shadow/Makefile | 4 +-
stdio-common/Makefile | 2 -
stdio-common/flockfile.c | 1 -
stdio-common/vfprintf-internal.c | 4 --
stdlib/Makefile | 9 ---
stdlib/strfmon_l.c | 2 -
stdlib/strfrom-skeleton.c | 2 -
sysdeps/generic/stdio-lock.h | 19 +++---
sysdeps/htl/stdio-lock.h | 57 ----------------
sysdeps/ieee754/float128/Makefile | 4 --
sysdeps/mach/libc-lock.h | 12 ++--
sysdeps/nptl/libc-lock.h | 9 +--
sysdeps/nptl/stdio-lock.h | 104 ------------------------------
sysdeps/unix/sysv/linux/Makefile | 1 -
wcsmbs/Makefile | 2 -
63 files changed, 58 insertions(+), 566 deletions(-)
delete mode 100644 sysdeps/htl/stdio-lock.h
delete mode 100644 sysdeps/nptl/stdio-lock.h
--
2.30.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/4] libio: Assume _IO_lock_inexpensive
2021-05-27 20:44 [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Adhemerval Zanella
@ 2021-05-27 20:44 ` Adhemerval Zanella
2021-05-30 13:11 ` Florian Weimer
2021-05-27 20:44 ` [PATCH 2/4] libio: Assume _IO_MTSAFE_IO Adhemerval Zanella
` (3 subsequent siblings)
4 siblings, 1 reply; 10+ messages in thread
From: Adhemerval Zanella @ 2021-05-27 20:44 UTC (permalink / raw)
To: libc-alpha
It is already set by both Linux and Hurd.
---
libio/libio.h | 11 ++---------
sysdeps/mach/libc-lock.h | 3 ---
sysdeps/nptl/stdio-lock.h | 3 ---
3 files changed, 2 insertions(+), 15 deletions(-)
diff --git a/libio/libio.h b/libio/libio.h
index 511b39457f..be2cde61e2 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -282,17 +282,10 @@ libc_hidden_proto (_IO_sgetn)
# undef _IO_ftrylockfile
# define _IO_peekc(_fp) _IO_peekc_locked (_fp)
-# if _IO_lock_inexpensive
-# define _IO_flockfile(_fp) \
+# define _IO_flockfile(_fp) \
if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
-# define _IO_funlockfile(_fp) \
+# define _IO_funlockfile(_fp) \
if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
-# else
-# define _IO_flockfile(_fp) \
- if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_flockfile (_fp)
-# define _IO_funlockfile(_fp) \
- if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_funlockfile (_fp)
-# endif
#endif /* _IO_MTSAFE_IO */
#endif /* _LIBIO_H */
diff --git a/sysdeps/mach/libc-lock.h b/sysdeps/mach/libc-lock.h
index d713f34b5f..220fcee921 100644
--- a/sysdeps/mach/libc-lock.h
+++ b/sysdeps/mach/libc-lock.h
@@ -24,9 +24,6 @@
#include <tls.h>
#include <lowlevellock.h>
-/* The locking here is very inexpensive, even for inlining. */
-#define _IO_lock_inexpensive 1
-
typedef unsigned int __libc_lock_t;
typedef struct
{
diff --git a/sysdeps/nptl/stdio-lock.h b/sysdeps/nptl/stdio-lock.h
index f2eee49816..a4f419b516 100644
--- a/sysdeps/nptl/stdio-lock.h
+++ b/sysdeps/nptl/stdio-lock.h
@@ -23,9 +23,6 @@
#include <lowlevellock.h>
-/* The locking here is very inexpensive, even for inlining. */
-#define _IO_lock_inexpensive 1
-
typedef struct { int lock; int cnt; void *owner; } _IO_lock_t;
#define _IO_lock_t_defined 1
--
2.30.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/4] libio: Assume _IO_MTSAFE_IO
2021-05-27 20:44 [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 1/4] libio: Assume _IO_lock_inexpensive Adhemerval Zanella
@ 2021-05-27 20:44 ` Adhemerval Zanella
2021-05-27 21:38 ` Andreas Schwab
2021-05-27 20:44 ` [PATCH 3/4] Consolidate stdio-lock.h Adhemerval Zanella
` (2 subsequent siblings)
4 siblings, 1 reply; 10+ messages in thread
From: Adhemerval Zanella @ 2021-05-27 20:44 UTC (permalink / raw)
To: libc-alpha
It is already set by default on all supported architectures and it is
an expectation that stdio works on multi-threaded environments.
---
Makeconfig | 2 --
debug/Makefile | 43 ++++++++++++-------------------
grp/Makefile | 4 +--
gshadow/Makefile | 4 +--
htl/Makefile | 2 --
hurd/vpprintf.c | 4 ---
include/stdio.h | 2 +-
libio/Makefile | 2 --
libio/clearerr.c | 4 ---
libio/feof.c | 5 ----
libio/ferror.c | 7 +----
libio/fileno.c | 2 +-
libio/fputc.c | 5 ----
libio/genops.c | 38 ---------------------------
libio/getc.c | 6 -----
libio/getchar.c | 7 +----
libio/iofdopen.c | 4 ---
libio/iofflush.c | 7 -----
libio/iofgets.c | 7 -----
libio/iofopen.c | 4 ---
libio/iofopncook.c | 4 ---
libio/iofputs.c | 7 -----
libio/iofread.c | 6 -----
libio/iofwrite.c | 6 +----
libio/iopopen.c | 14 ----------
libio/iovdprintf.c | 2 --
libio/iovsprintf.c | 2 --
libio/libio.h | 26 ++++++-------------
libio/libioP.h | 30 +++------------------
libio/memstream.c | 4 ---
libio/obprintf.c | 2 --
libio/oldiofdopen.c | 4 ---
libio/oldiofopen.c | 4 ---
libio/oldiopopen.c | 14 ----------
libio/oldstdfiles.c | 6 -----
libio/putc.c | 5 ----
libio/putchar.c | 5 ----
libio/stdfiles.c | 11 +-------
libio/vasprintf.c | 2 --
libio/vsnprintf.c | 2 --
libio/vswprintf.c | 2 --
libio/wgenops.c | 2 --
libio/wmemstream.c | 4 ---
nptl/Makefile | 3 ---
pwd/Makefile | 1 -
shadow/Makefile | 4 +--
stdio-common/Makefile | 2 --
stdio-common/vfprintf-internal.c | 4 ---
stdlib/Makefile | 9 -------
stdlib/strfmon_l.c | 2 --
stdlib/strfrom-skeleton.c | 2 --
sysdeps/generic/stdio-lock.h | 4 +--
sysdeps/ieee754/float128/Makefile | 4 ---
sysdeps/nptl/libc-lock.h | 2 +-
sysdeps/unix/sysv/linux/Makefile | 1 -
wcsmbs/Makefile | 2 --
56 files changed, 44 insertions(+), 319 deletions(-)
diff --git a/Makeconfig b/Makeconfig
index 1d5e45926c..94058063f4 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1342,8 +1342,6 @@ endif
# A sysdeps Makeconfig fragment may set libc-reentrant to yes.
ifeq (yes,$(libc-reentrant))
defines += -D_LIBC_REENTRANT
-
-libio-mtsafe = -D_IO_MTSAFE_IO
endif
# The name to give to a test in test results summaries.
diff --git a/debug/Makefile b/debug/Makefile
index 6893111cbf..b94850b8f0 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -67,32 +67,23 @@ elide-routines.o := stack_chk_fail_local
CFLAGS-stack_chk_fail.c += $(no-stack-protector)
CFLAGS-backtrace.c += -fno-omit-frame-pointer -funwind-tables
-CFLAGS-sprintf_chk.c += $(libio-mtsafe)
-CFLAGS-snprintf_chk.c += $(libio-mtsafe)
-CFLAGS-vsprintf_chk.c += $(libio-mtsafe)
-CFLAGS-vsnprintf_chk.c += $(libio-mtsafe)
-CFLAGS-asprintf_chk.c += $(libio-mtsafe)
-CFLAGS-vasprintf_chk.c += $(libio-mtsafe)
-CFLAGS-obprintf_chk.c += $(libio-mtsafe)
-CFLAGS-dprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-vdprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-printf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-vprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-vfprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-gets_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fgets_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fgets_u_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fread_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fread_u_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-swprintf_chk.c += $(libio-mtsafe)
-CFLAGS-vswprintf_chk.c += $(libio-mtsafe)
-CFLAGS-wprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fwprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-vwprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-vfwprintf_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fgetws_chk.c += $(libio-mtsafe) -fexceptions
-CFLAGS-fgetws_u_chk.c += $(libio-mtsafe) -fexceptions
+CFLAGS-dprintf_chk.c += -fexceptions
+CFLAGS-vdprintf_chk.c += -fexceptions
+CFLAGS-printf_chk.c += -fexceptions
+CFLAGS-fprintf_chk.c += -fexceptions
+CFLAGS-vprintf_chk.c += -fexceptions
+CFLAGS-vfprintf_chk.c += -fexceptions
+CFLAGS-gets_chk.c += -fexceptions
+CFLAGS-fgets_chk.c += -fexceptions
+CFLAGS-fgets_u_chk.c += -fexceptions
+CFLAGS-fread_chk.c += -fexceptions
+CFLAGS-fread_u_chk.c += -fexceptions
+CFLAGS-wprintf_chk.c += -fexceptions
+CFLAGS-fwprintf_chk.c += -fexceptions
+CFLAGS-vwprintf_chk.c += -fexceptions
+CFLAGS-vfwprintf_chk.c += -fexceptions
+CFLAGS-fgetws_chk.c += -fexceptions
+CFLAGS-fgetws_u_chk.c += -fexceptions
CFLAGS-read_chk.c += -fexceptions -fasynchronous-unwind-tables
CFLAGS-pread_chk.c += -fexceptions -fasynchronous-unwind-tables
CFLAGS-pread64_chk.c += -fexceptions -fasynchronous-unwind-tables
diff --git a/grp/Makefile b/grp/Makefile
index a394023bd0..acab87ca67 100644
--- a/grp/Makefile
+++ b/grp/Makefile
@@ -52,8 +52,8 @@ CFLAGS-getgrnam_r.c += -fexceptions
CFLAGS-getgrent_r.c += -fexceptions
CFLAGS-getgrent.c += -fexceptions
CFLAGS-fgetgrent.c += -fexceptions
-CFLAGS-fgetgrent_r.c += -fexceptions $(libio-mtsafe)
-CFLAGS-putgrent.c += -fexceptions $(libio-mtsafe)
+CFLAGS-fgetgrent_r.c += -fexceptions
+CFLAGS-putgrent.c += -fexceptions
CFLAGS-initgroups.c += -fexceptions
CFLAGS-getgrgid.c += -fexceptions
diff --git a/gshadow/Makefile b/gshadow/Makefile
index 2fdd0c7641..1712f28ac8 100644
--- a/gshadow/Makefile
+++ b/gshadow/Makefile
@@ -31,8 +31,8 @@ tests = tst-gshadow tst-putsgent tst-fgetsgent_r
CFLAGS-getsgent_r.c += -fexceptions
CFLAGS-getsgent.c += -fexceptions
CFLAGS-fgetsgent.c += -fexceptions
-CFLAGS-fgetsgent_r.c += -fexceptions $(libio-mtsafe)
-CFLAGS-putsgent.c += -fexceptions $(libio-mtsafe)
+CFLAGS-fgetsgent_r.c += -fexceptions
+CFLAGS-putsgent.c += -fexceptions
CFLAGS-getsgnam.c += -fexceptions
CFLAGS-getsgnam_r.c += -fexceptions
diff --git a/htl/Makefile b/htl/Makefile
index 4c5767b04c..32219632dc 100644
--- a/htl/Makefile
+++ b/htl/Makefile
@@ -176,8 +176,6 @@ install-lib-ldscripts := libpthread_syms.a
include ../Makeconfig
-CFLAGS-lockfile.c = -D_IO_MTSAFE_IO
-
all: # Make this the default target; it will be defined in Rules.
subdir_install: $(inst_libdir)/libpthread2.a $(inst_libdir)/libpthread_syms.a
diff --git a/hurd/vpprintf.c b/hurd/vpprintf.c
index 00493ebe39..ae8e6d310b 100644
--- a/hurd/vpprintf.c
+++ b/hurd/vpprintf.c
@@ -42,13 +42,9 @@ vpprintf (io_t port, const char *format, va_list arg)
struct locked_FILE
{
struct _IO_cookie_file cfile;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
} temp_f;
-#ifdef _IO_MTSAFE_IO
temp_f.cfile.__fp.file._lock = &temp_f.lock;
-#endif
_IO_cookie_init (&temp_f.cfile, _IO_NO_READS,
(void *) port, (cookie_io_functions_t) { write: do_write });
diff --git a/include/stdio.h b/include/stdio.h
index 2e0dc80c16..6bb5397c5f 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,5 +1,5 @@
#ifndef _STDIO_H
-# if !defined _ISOMAC && defined _IO_MTSAFE_IO
+# if !defined _ISOMAC
# include <stdio-lock.h>
# endif
diff --git a/libio/Makefile b/libio/Makefile
index 73f731e064..ac2d738372 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -92,8 +92,6 @@ routines += clearerr_u feof_u ferror_u fputc_u getc_u getchar_u \
iofputs_u
endif
-CPPFLAGS += $(libio-mtsafe)
-
# Support for exception handling.
CFLAGS-fileops.c += -fexceptions
CFLAGS-fputc.c += -fexceptions
diff --git a/libio/clearerr.c b/libio/clearerr.c
index 687b3ac5f2..d761274d6b 100644
--- a/libio/clearerr.c
+++ b/libio/clearerr.c
@@ -26,7 +26,3 @@ clearerr (FILE *fp)
_IO_clearerr (fp);
_IO_funlockfile (fp);
}
-
-#ifndef _IO_MTSAFE_IO
-weak_alias (clearerr, clearerr_unlocked)
-#endif
diff --git a/libio/feof.c b/libio/feof.c
index 8275321788..2664b4caac 100644
--- a/libio/feof.c
+++ b/libio/feof.c
@@ -41,8 +41,3 @@ _IO_feof (FILE *fp)
}
weak_alias (_IO_feof, feof)
-
-#ifndef _IO_MTSAFE_IO
-#undef feof_unlocked
-weak_alias (_IO_feof, feof_unlocked)
-#endif
diff --git a/libio/ferror.c b/libio/ferror.c
index 588f2eb50b..eef85c2602 100644
--- a/libio/ferror.c
+++ b/libio/ferror.c
@@ -40,9 +40,4 @@ _IO_ferror (FILE *fp)
return result;
}
-weak_alias (_IO_ferror, ferror)
-
-#ifndef _IO_MTSAFE_IO
-#undef ferror_unlocked
-weak_alias (_IO_ferror, ferror_unlocked)
-#endif
+weak_alias (_IO_ferror, ferror)
\ No newline at end of file
diff --git a/libio/fileno.c b/libio/fileno.c
index 4b3417abac..96f60d93ca 100644
--- a/libio/fileno.c
+++ b/libio/fileno.c
@@ -46,6 +46,6 @@ libc_hidden_weak (fileno)
/* The fileno implementation for libio does not require locking because
it only accesses once a single variable and this is already atomic
- (at least at thread level). Therefore we don't test _IO_MTSAFE_IO here. */
+ (at least at thread level). */
weak_alias (__fileno, fileno_unlocked)
diff --git a/libio/fputc.c b/libio/fputc.c
index c3a1fa47db..55877668c1 100644
--- a/libio/fputc.c
+++ b/libio/fputc.c
@@ -39,8 +39,3 @@ fputc (int c, FILE *fp)
_IO_release_lock (fp);
return result;
}
-
-#ifndef _IO_MTSAFE_IO
-#undef fputc_unlocked
-weak_alias (fputc, fputc_unlocked)
-#endif
diff --git a/libio/genops.c b/libio/genops.c
index fa509f6219..e501309b35 100644
--- a/libio/genops.c
+++ b/libio/genops.c
@@ -32,13 +32,10 @@
#include <stdbool.h>
#include <sched.h>
-#ifdef _IO_MTSAFE_IO
static _IO_lock_t list_all_lock = _IO_lock_initializer;
-#endif
static FILE *run_fp;
-#ifdef _IO_MTSAFE_IO
static void
flush_cleanup (void *not_used)
{
@@ -46,7 +43,6 @@ flush_cleanup (void *not_used)
_IO_funlockfile (run_fp);
_IO_lock_unlock (list_all_lock);
}
-#endif
void
_IO_un_link (struct _IO_FILE_plus *fp)
@@ -54,12 +50,10 @@ _IO_un_link (struct _IO_FILE_plus *fp)
if (fp->file._flags & _IO_LINKED)
{
FILE **f;
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (flush_cleanup);
_IO_lock_lock (list_all_lock);
run_fp = (FILE *) fp;
_IO_flockfile ((FILE *) fp);
-#endif
if (_IO_list_all == NULL)
;
else if (fp == _IO_list_all)
@@ -72,12 +66,10 @@ _IO_un_link (struct _IO_FILE_plus *fp)
break;
}
fp->file._flags &= ~_IO_LINKED;
-#ifdef _IO_MTSAFE_IO
_IO_funlockfile ((FILE *) fp);
run_fp = NULL;
_IO_lock_unlock (list_all_lock);
_IO_cleanup_region_end (0);
-#endif
}
}
libc_hidden_def (_IO_un_link)
@@ -88,20 +80,16 @@ _IO_link_in (struct _IO_FILE_plus *fp)
if ((fp->file._flags & _IO_LINKED) == 0)
{
fp->file._flags |= _IO_LINKED;
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (flush_cleanup);
_IO_lock_lock (list_all_lock);
run_fp = (FILE *) fp;
_IO_flockfile ((FILE *) fp);
-#endif
fp->file._chain = (FILE *) _IO_list_all;
_IO_list_all = fp;
-#ifdef _IO_MTSAFE_IO
_IO_funlockfile ((FILE *) fp);
run_fp = NULL;
_IO_lock_unlock (list_all_lock);
_IO_cleanup_region_end (0);
-#endif
}
}
libc_hidden_def (_IO_link_in)
@@ -551,10 +539,8 @@ _IO_old_init (FILE *fp, int flags)
#if _IO_JUMPS_OFFSET
fp->_vtable_offset = 0;
#endif
-#ifdef _IO_MTSAFE_IO
if (fp->_lock != NULL)
_IO_lock_init (*fp->_lock);
-#endif
}
void
@@ -617,10 +603,8 @@ _IO_default_finish (FILE *fp, int dummy)
_IO_un_link ((struct _IO_FILE_plus *) fp);
-#ifdef _IO_MTSAFE_IO
if (fp->_lock != NULL)
_IO_lock_fini (*fp->_lock);
-#endif
}
libc_hidden_def (_IO_default_finish)
@@ -687,10 +671,8 @@ _IO_flush_all_lockp (int do_lock)
int result = 0;
FILE *fp;
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (flush_cleanup);
_IO_lock_lock (list_all_lock);
-#endif
for (fp = (FILE *) _IO_list_all; fp != NULL; fp = fp->_chain)
{
@@ -711,10 +693,8 @@ _IO_flush_all_lockp (int do_lock)
run_fp = NULL;
}
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (list_all_lock);
_IO_cleanup_region_end (0);
-#endif
return result;
}
@@ -733,10 +713,8 @@ _IO_flush_all_linebuffered (void)
{
FILE *fp;
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (flush_cleanup);
_IO_lock_lock (list_all_lock);
-#endif
for (fp = (FILE *) _IO_list_all; fp != NULL; fp = fp->_chain)
{
@@ -750,10 +728,8 @@ _IO_flush_all_linebuffered (void)
run_fp = NULL;
}
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (list_all_lock);
_IO_cleanup_region_end (0);
-#endif
}
libc_hidden_def (_IO_flush_all_linebuffered)
weak_alias (_IO_flush_all_linebuffered, _flushlbf)
@@ -782,10 +758,8 @@ _IO_unbuffer_all (void)
{
FILE *fp;
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (flush_cleanup);
_IO_lock_lock (list_all_lock);
-#endif
for (fp = (FILE *) _IO_list_all; fp; fp = fp->_chain)
{
@@ -800,7 +774,6 @@ _IO_unbuffer_all (void)
/* Iff stream is un-orientated, it wasn't used. */
&& (legacy || fp->_mode != 0))
{
-#ifdef _IO_MTSAFE_IO
int cnt;
#define MAXTRIES 2
for (cnt = 0; cnt < MAXTRIES; ++cnt)
@@ -810,7 +783,6 @@ _IO_unbuffer_all (void)
/* Give the other thread time to finish up its use of the
stream. */
__sched_yield ();
-#endif
if (! legacy && ! dealloc_buffers && !(fp->_flags & _IO_USER_BUF))
{
@@ -826,10 +798,8 @@ _IO_unbuffer_all (void)
if (! legacy && fp->_mode > 0)
_IO_wsetb (fp, NULL, NULL, 0);
-#ifdef _IO_MTSAFE_IO
if (cnt < MAXTRIES && fp->_lock != NULL)
_IO_lock_unlock (*fp->_lock);
-#endif
}
/* Make sure that never again the wide char functions can be
@@ -838,10 +808,8 @@ _IO_unbuffer_all (void)
fp->_mode = -1;
}
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (list_all_lock);
_IO_cleanup_region_end (0);
-#endif
}
@@ -1092,27 +1060,21 @@ libc_hidden_def (_IO_iter_file)
void
_IO_list_lock (void)
{
-#ifdef _IO_MTSAFE_IO
_IO_lock_lock (list_all_lock);
-#endif
}
libc_hidden_def (_IO_list_lock)
void
_IO_list_unlock (void)
{
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (list_all_lock);
-#endif
}
libc_hidden_def (_IO_list_unlock)
void
_IO_list_resetlock (void)
{
-#ifdef _IO_MTSAFE_IO
_IO_lock_init (list_all_lock);
-#endif
}
libc_hidden_def (_IO_list_resetlock)
diff --git a/libio/getc.c b/libio/getc.c
index e3e658bf79..bf67362cd9 100644
--- a/libio/getc.c
+++ b/libio/getc.c
@@ -46,9 +46,3 @@ _IO_getc (FILE *fp)
weak_alias (_IO_getc, getc)
weak_alias (_IO_getc, fgetc)
-
-#ifndef _IO_MTSAFE_IO
-#undef getc_unlocked
-weak_alias (_IO_getc, getc_unlocked)
-weak_alias (_IO_getc, fgetc_unlocked)
-#endif
diff --git a/libio/getchar.c b/libio/getchar.c
index 0d6225853f..5c7307e392 100644
--- a/libio/getchar.c
+++ b/libio/getchar.c
@@ -39,9 +39,4 @@ getchar (void)
result = _IO_getc_unlocked (stdin);
_IO_release_lock (stdin);
return result;
-}
-
-#ifndef _IO_MTSAFE_IO
-#undef getchar_unlocked
-weak_alias (getchar, getchar_unlocked)
-#endif
+}
\ No newline at end of file
diff --git a/libio/iofdopen.c b/libio/iofdopen.c
index 498791b287..2c11ddfd4e 100644
--- a/libio/iofdopen.c
+++ b/libio/iofdopen.c
@@ -37,9 +37,7 @@ _IO_new_fdopen (int fd, const char *mode)
struct locked_FILE
{
struct _IO_FILE_plus fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
struct _IO_wide_data wd;
} *new_f;
int i;
@@ -122,9 +120,7 @@ _IO_new_fdopen (int fd, const char *mode)
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fp.file._lock = &new_f->lock;
-#endif
_IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd,
#if _G_HAVE_MMAP
(use_mmap && (read_write & _IO_NO_WRITES))
diff --git a/libio/iofflush.c b/libio/iofflush.c
index aea6fe9633..52d01ab023 100644
--- a/libio/iofflush.c
+++ b/libio/iofflush.c
@@ -46,10 +46,3 @@ libc_hidden_def (_IO_fflush)
weak_alias (_IO_fflush, fflush)
libc_hidden_weak (fflush)
-
-#ifndef _IO_MTSAFE_IO
-strong_alias (_IO_fflush, __fflush_unlocked)
-libc_hidden_def (__fflush_unlocked)
-weak_alias (_IO_fflush, fflush_unlocked)
-libc_hidden_weak (fflush_unlocked)
-#endif
diff --git a/libio/iofgets.c b/libio/iofgets.c
index 6223426237..25960c1108 100644
--- a/libio/iofgets.c
+++ b/libio/iofgets.c
@@ -66,10 +66,3 @@ _IO_fgets (char *buf, int n, FILE *fp)
}
weak_alias (_IO_fgets, fgets)
-
-# ifndef _IO_MTSAFE_IO
-strong_alias (_IO_fgets, __fgets_unlocked)
-libc_hidden_def (__fgets_unlocked)
-weak_alias (_IO_fgets, fgets_unlocked)
-libc_hidden_weak (fgets_unlocked)
-# endif
diff --git a/libio/iofopen.c b/libio/iofopen.c
index 965d21cd97..7779c0179c 100644
--- a/libio/iofopen.c
+++ b/libio/iofopen.c
@@ -58,17 +58,13 @@ __fopen_internal (const char *filename, const char *mode, int is32)
struct locked_FILE
{
struct _IO_FILE_plus fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
struct _IO_wide_data wd;
} *new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fp.file._lock = &new_f->lock;
-#endif
_IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &_IO_wfile_jumps);
_IO_JUMPS (&new_f->fp) = &_IO_file_jumps;
_IO_new_file_init_internal (&new_f->fp);
diff --git a/libio/iofopncook.c b/libio/iofopncook.c
index e39ef6aa6c..57285cc291 100644
--- a/libio/iofopncook.c
+++ b/libio/iofopncook.c
@@ -179,9 +179,7 @@ _IO_fopencookie (void *cookie, const char *mode,
struct locked_FILE
{
struct _IO_cookie_file cfile;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
} *new_f;
switch (*mode++)
@@ -205,9 +203,7 @@ _IO_fopencookie (void *cookie, const char *mode,
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->cfile.__fp.file._lock = &new_f->lock;
-#endif
_IO_cookie_init (&new_f->cfile, read_write, cookie, io_functions);
diff --git a/libio/iofputs.c b/libio/iofputs.c
index a8721314bc..5a71812952 100644
--- a/libio/iofputs.c
+++ b/libio/iofputs.c
@@ -44,10 +44,3 @@ libc_hidden_def (_IO_fputs)
weak_alias (_IO_fputs, fputs)
libc_hidden_weak (fputs)
-
-# ifndef _IO_MTSAFE_IO
-strong_alias (_IO_fputs, __fputs_unlocked)
-libc_hidden_def (__fputs_unlocked)
-weak_alias (_IO_fputs, fputs_unlocked)
-libc_hidden_ver (_IO_fputs, fputs_unlocked)
-# endif
diff --git a/libio/iofread.c b/libio/iofread.c
index b8453a6520..71729ea9cb 100644
--- a/libio/iofread.c
+++ b/libio/iofread.c
@@ -42,9 +42,3 @@ _IO_fread (void *buf, size_t size, size_t count, FILE *fp)
libc_hidden_def (_IO_fread)
weak_alias (_IO_fread, fread)
-
-# ifndef _IO_MTSAFE_IO
-strong_alias (_IO_fread, __fread_unlocked)
-libc_hidden_def (__fread_unlocked)
-weak_alias (_IO_fread, fread_unlocked)
-# endif
diff --git a/libio/iofwrite.c b/libio/iofwrite.c
index 71b609c526..2cc279785f 100644
--- a/libio/iofwrite.c
+++ b/libio/iofwrite.c
@@ -24,6 +24,7 @@
This exception applies to code released by its copyright holders
in files containing the exception. */
+#include <stdio.h>
#include "libioP.h"
size_t
@@ -49,10 +50,5 @@ _IO_fwrite (const void *buf, size_t size, size_t count, FILE *fp)
}
libc_hidden_def (_IO_fwrite)
-# include <stdio.h>
weak_alias (_IO_fwrite, fwrite)
libc_hidden_weak (fwrite)
-# ifndef _IO_MTSAFE_IO
-weak_alias (_IO_fwrite, fwrite_unlocked)
-libc_hidden_weak (fwrite_unlocked)
-# endif
diff --git a/libio/iopopen.c b/libio/iopopen.c
index 6b04222c24..fc8751ea46 100644
--- a/libio/iopopen.c
+++ b/libio/iopopen.c
@@ -50,7 +50,6 @@ static const struct _IO_jump_t _IO_proc_jumps;
static struct _IO_proc_file *proc_file_chain;
-#ifdef _IO_MTSAFE_IO
static _IO_lock_t proc_file_chain_lock = _IO_lock_initializer;
static void
@@ -58,7 +57,6 @@ unlock (void *not_used)
{
_IO_lock_unlock (proc_file_chain_lock);
}
-#endif
/* POSIX states popen shall ensure that any streams from previous popen()
calls that remain open in the parent process should be closed in the new
@@ -190,16 +188,12 @@ _IO_new_proc_open (FILE *fp, const char *command, const char *mode)
child_pipe_fd) != 0)
goto spawn_failure;
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (unlock);
_IO_lock_lock (proc_file_chain_lock);
-#endif
spawn_ok = spawn_process (&fa, fp, command, do_cloexec, pipe_fds,
parent_end, child_end, child_pipe_fd);
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (proc_file_chain_lock);
_IO_cleanup_region_end (0);
-#endif
__posix_spawn_file_actions_destroy (&fa);
@@ -222,18 +216,14 @@ _IO_new_popen (const char *command, const char *mode)
struct locked_FILE
{
struct _IO_proc_file fpx;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
} *new_f;
FILE *fp;
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fpx.file.file._lock = &new_f->lock;
-#endif
fp = &new_f->fpx.file.file;
_IO_init_internal (fp, 0);
_IO_JUMPS (&new_f->fpx.file) = &_IO_proc_jumps;
@@ -255,10 +245,8 @@ _IO_new_proc_close (FILE *fp)
int status = -1;
/* Unlink from proc_file_chain. */
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (unlock);
_IO_lock_lock (proc_file_chain_lock);
-#endif
for ( ; *ptr != NULL; ptr = &(*ptr)->next)
{
if (*ptr == (_IO_proc_file *) fp)
@@ -268,10 +256,8 @@ _IO_new_proc_close (FILE *fp)
break;
}
}
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (proc_file_chain_lock);
_IO_cleanup_region_end (0);
-#endif
if (status < 0 || __close_nocancel (_IO_fileno(fp)) < 0)
return -1;
diff --git a/libio/iovdprintf.c b/libio/iovdprintf.c
index 7446ce4381..6fb8c8927c 100644
--- a/libio/iovdprintf.c
+++ b/libio/iovdprintf.c
@@ -35,9 +35,7 @@ __vdprintf_internal (int d, const char *format, va_list arg,
struct _IO_wide_data wd;
int done;
-#ifdef _IO_MTSAFE_IO
tmpfil.file._lock = NULL;
-#endif
_IO_no_init (&tmpfil.file, _IO_USER_LOCK, 0, &wd, &_IO_wfile_jumps);
_IO_JUMPS (&tmpfil) = &_IO_file_jumps;
_IO_new_file_init_internal (&tmpfil);
diff --git a/libio/iovsprintf.c b/libio/iovsprintf.c
index 871383768d..7d1e37c9ab 100644
--- a/libio/iovsprintf.c
+++ b/libio/iovsprintf.c
@@ -73,9 +73,7 @@ __vsprintf_internal (char *string, size_t maxlen,
_IO_strfile sf;
int ret;
-#ifdef _IO_MTSAFE_IO
sf._sbf._f._lock = NULL;
-#endif
_IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
/* When called from fortified sprintf/vsprintf, erase the destination
buffer and try to detect overflows. When called from regular
diff --git a/libio/libio.h b/libio/libio.h
index be2cde61e2..bd42479f13 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -37,7 +37,7 @@
#include <stdio.h>
-#if defined _IO_MTSAFE_IO && !defined _IO_lock_t_defined
+#if !defined _IO_lock_t_defined
# error "Someone forgot to include stdio-lock.h"
#endif
@@ -199,10 +199,13 @@ extern void _IO_flockfile (FILE *) __THROW;
extern void _IO_funlockfile (FILE *) __THROW;
extern int _IO_ftrylockfile (FILE *) __THROW;
-#define _IO_peekc(_fp) _IO_peekc_unlocked (_fp)
-#define _IO_flockfile(_fp) /**/
-#define _IO_funlockfile(_fp) ((void) 0)
-#define _IO_ftrylockfile(_fp) /**/
+#define _IO_peekc(_fp) _IO_peekc_locked (_fp)
+#define _IO_flockfile(_fp) \
+ if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
+#define _IO_funlockfile(_fp) \
+ if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
+#define _IO_ftrylockfile(__fp) \
+ if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_trylock (*(_fp)->_lock)
#ifndef _IO_cleanup_region_start
#define _IO_cleanup_region_start(_fct, _fp) /**/
#endif
@@ -275,17 +278,4 @@ libc_hidden_proto (_IO_padn)
libc_hidden_proto (_IO_putc)
libc_hidden_proto (_IO_sgetn)
-#ifdef _IO_MTSAFE_IO
-# undef _IO_peekc
-# undef _IO_flockfile
-# undef _IO_funlockfile
-# undef _IO_ftrylockfile
-
-# define _IO_peekc(_fp) _IO_peekc_locked (_fp)
-# define _IO_flockfile(_fp) \
- if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
-# define _IO_funlockfile(_fp) \
- if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
-#endif /* _IO_MTSAFE_IO */
-
#endif /* _LIBIO_H */
diff --git a/libio/libioP.h b/libio/libioP.h
index 4bad7f3c06..d5984283ce 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -804,33 +804,18 @@ extern int __vfwscanf_internal (FILE *fp, const wchar_t *format, va_list argp,
extern int _IO_vscanf (const char *, va_list) __THROW;
-#ifdef _IO_MTSAFE_IO
/* check following! */
-# ifdef _IO_USE_OLD_IO_FILE
-# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
+#ifdef _IO_USE_OLD_IO_FILE
+# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
{ _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (FILE *) CHAIN, FD, \
0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock }
-# else
-# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
- { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (FILE *) CHAIN, FD, \
- 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\
- NULL, WDP, 0 }
-# endif
#else
-# ifdef _IO_USE_OLD_IO_FILE
-# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
+# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
{ _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (FILE *) CHAIN, FD, \
- 0, _IO_pos_BAD }
-# else
-# define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
- { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (FILE *) CHAIN, FD, \
- 0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD, \
+ 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\
NULL, WDP, 0 }
-# endif
#endif
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
@@ -885,13 +870,6 @@ _IO_acquire_lock_fct (FILE **p)
_IO_funlockfile (fp);
}
-#if !defined _IO_MTSAFE_IO && IS_IN (libc)
-# define _IO_acquire_lock(_fp) \
- do {
-# define _IO_release_lock(_fp) \
- } while (0)
-#endif
-
/* Collect all vtables in a special section for vtable verification.
These symbols cover the extent of this section. */
symbol_set_declare (__libc_IO_vtables)
diff --git a/libio/memstream.c b/libio/memstream.c
index 2bd20b30f4..6763689038 100644
--- a/libio/memstream.c
+++ b/libio/memstream.c
@@ -66,9 +66,7 @@ __open_memstream (char **bufloc, size_t *sizeloc)
struct locked_FILE
{
struct _IO_FILE_memstream fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
struct _IO_wide_data wd;
} *new_f;
char *buf;
@@ -76,9 +74,7 @@ __open_memstream (char **bufloc, size_t *sizeloc)
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fp._sf._sbf._f._lock = &new_f->lock;
-#endif
buf = calloc (1, BUFSIZ);
if (buf == NULL)
diff --git a/libio/obprintf.c b/libio/obprintf.c
index 4333276a1b..2100bd312b 100644
--- a/libio/obprintf.c
+++ b/libio/obprintf.c
@@ -128,9 +128,7 @@ __obstack_vprintf_internal (struct obstack *obstack, const char *format,
int size;
int room;
-#ifdef _IO_MTSAFE_IO
new_f.ofile.file.file._lock = NULL;
-#endif
_IO_no_init (&new_f.ofile.file.file, _IO_USER_LOCK, -1, NULL, NULL);
_IO_JUMPS (&new_f.ofile.file) = &_IO_obstack_jumps;
diff --git a/libio/oldiofdopen.c b/libio/oldiofdopen.c
index ab8f9b9886..4d3f04a0bf 100644
--- a/libio/oldiofdopen.c
+++ b/libio/oldiofdopen.c
@@ -41,9 +41,7 @@ _IO_old_fdopen (int fd, const char *mode)
struct locked_FILE
{
struct _IO_FILE_complete_plus fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
} *new_f;
int fd_flags;
@@ -96,9 +94,7 @@ _IO_old_fdopen (int fd, const char *mode)
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fp.file._file._lock = &new_f->lock;
-#endif
_IO_old_init (&new_f->fp.file._file, 0);
_IO_JUMPS_FILE_plus (&new_f->fp) = &_IO_old_file_jumps;
_IO_old_file_init_internal ((struct _IO_FILE_plus *) &new_f->fp);
diff --git a/libio/oldiofopen.c b/libio/oldiofopen.c
index 2de936347e..f3b9271616 100644
--- a/libio/oldiofopen.c
+++ b/libio/oldiofopen.c
@@ -39,16 +39,12 @@ _IO_old_fopen (const char *filename, const char *mode)
struct locked_FILE
{
struct _IO_FILE_complete_plus fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
} *new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fp.file._file._lock = &new_f->lock;
-#endif
_IO_old_init (&new_f->fp.file._file, 0);
_IO_JUMPS_FILE_plus (&new_f->fp) = &_IO_old_file_jumps;
_IO_old_file_init_internal ((struct _IO_FILE_plus *) &new_f->fp);
diff --git a/libio/oldiopopen.c b/libio/oldiopopen.c
index 68ca52c012..374d04ef72 100644
--- a/libio/oldiopopen.c
+++ b/libio/oldiopopen.c
@@ -48,7 +48,6 @@ typedef struct _IO_proc_file _IO_proc_file;
static struct _IO_proc_file *old_proc_file_chain;
-#ifdef _IO_MTSAFE_IO
static _IO_lock_t proc_file_chain_lock = _IO_lock_initializer;
static void
@@ -56,7 +55,6 @@ unlock (void *not_used)
{
_IO_lock_unlock (proc_file_chain_lock);
}
-#endif
FILE *
attribute_compat_text_section
@@ -119,16 +117,12 @@ _IO_old_proc_open (FILE *fp, const char *command, const char *mode)
_IO_fileno (fp) = parent_end;
/* Link into old_proc_file_chain. */
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (unlock);
_IO_lock_lock (proc_file_chain_lock);
-#endif
((_IO_proc_file *) fp)->next = old_proc_file_chain;
old_proc_file_chain = (_IO_proc_file *) fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (proc_file_chain_lock);
_IO_cleanup_region_end (0);
-#endif
_IO_mask_flags (fp, read_or_write, _IO_NO_READS|_IO_NO_WRITES);
return fp;
@@ -141,18 +135,14 @@ _IO_old_popen (const char *command, const char *mode)
struct locked_FILE
{
struct _IO_proc_file fpx;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
} *new_f;
FILE *fp;
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fpx.file.file._file._lock = &new_f->lock;
-#endif
fp = &new_f->fpx.file.file._file;
_IO_old_init (fp, 0);
_IO_JUMPS_FILE_plus (&new_f->fpx.file) = &_IO_old_proc_jumps;
@@ -175,10 +165,8 @@ _IO_old_proc_close (FILE *fp)
int status = -1;
/* Unlink from old_proc_file_chain. */
-#ifdef _IO_MTSAFE_IO
_IO_cleanup_region_start_noarg (unlock);
_IO_lock_lock (proc_file_chain_lock);
-#endif
for ( ; *ptr != NULL; ptr = &(*ptr)->next)
{
if (*ptr == (_IO_proc_file *) fp)
@@ -188,10 +176,8 @@ _IO_old_proc_close (FILE *fp)
break;
}
}
-#ifdef _IO_MTSAFE_IO
_IO_lock_unlock (proc_file_chain_lock);
_IO_cleanup_region_end (0);
-#endif
if (status < 0 || __close (_IO_fileno(fp)) < 0)
return -1;
diff --git a/libio/oldstdfiles.c b/libio/oldstdfiles.c
index fc55ad3a32..f59910044e 100644
--- a/libio/oldstdfiles.c
+++ b/libio/oldstdfiles.c
@@ -33,16 +33,10 @@
#define _IO_USE_OLD_IO_FILE
#include "libioP.h"
-#ifdef _IO_MTSAFE_IO
#define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
struct _IO_FILE_plus NAME \
= {FILEBUF_LITERAL(CHAIN, FLAGS, FD, NULL), &_IO_old_file_jumps};
-#else
-#define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
- struct _IO_FILE_plus NAME \
- = {FILEBUF_LITERAL(CHAIN, FLAGS, FD, NULL), &_IO_old_file_jumps};
-#endif
DEF_STDFILE(_IO_stdin_, 0, 0, _IO_NO_WRITES);
DEF_STDFILE(_IO_stdout_, 1, &_IO_stdin_, _IO_NO_READS);
diff --git a/libio/putc.c b/libio/putc.c
index 0b0dd40736..bc9dea856d 100644
--- a/libio/putc.c
+++ b/libio/putc.c
@@ -37,8 +37,3 @@ libc_hidden_def (_IO_putc)
#undef putc
weak_alias (_IO_putc, putc)
-
-#ifndef _IO_MTSAFE_IO
-#undef putc_unlocked
-weak_alias (_IO_putc, putc_unlocked)
-#endif
diff --git a/libio/putchar.c b/libio/putchar.c
index de117bf13d..834174436e 100644
--- a/libio/putchar.c
+++ b/libio/putchar.c
@@ -29,8 +29,3 @@ putchar (int c)
_IO_release_lock (stdout);
return result;
}
-
-#if defined weak_alias && !defined _IO_MTSAFE_IO
-#undef putchar_unlocked
-weak_alias (putchar, putchar_unlocked)
-#endif
diff --git a/libio/stdfiles.c b/libio/stdfiles.c
index f55bcd6e59..48d0188bda 100644
--- a/libio/stdfiles.c
+++ b/libio/stdfiles.c
@@ -32,22 +32,13 @@
#include "libioP.h"
-#ifdef _IO_MTSAFE_IO
-# define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
+#define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
static struct _IO_wide_data _IO_wide_data_##FD \
= { ._wide_vtable = &_IO_wfile_jumps }; \
struct _IO_FILE_plus NAME \
= {FILEBUF_LITERAL(CHAIN, FLAGS, FD, &_IO_wide_data_##FD), \
&_IO_file_jumps};
-#else
-# define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
- static struct _IO_wide_data _IO_wide_data_##FD \
- = { ._wide_vtable = &_IO_wfile_jumps }; \
- struct _IO_FILE_plus NAME \
- = {FILEBUF_LITERAL(CHAIN, FLAGS, FD, &_IO_wide_data_##FD), \
- &_IO_file_jumps};
-#endif
DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES);
DEF_STDFILE(_IO_2_1_stdout_, 1, &_IO_2_1_stdin_, _IO_NO_READS);
diff --git a/libio/vasprintf.c b/libio/vasprintf.c
index c9a09c11c8..a90006d268 100644
--- a/libio/vasprintf.c
+++ b/libio/vasprintf.c
@@ -45,9 +45,7 @@ __vasprintf_internal (char **result_ptr, const char *format, va_list args,
string = (char *) malloc (init_string_size);
if (string == NULL)
return -1;
-#ifdef _IO_MTSAFE_IO
sf._sbf._f._lock = NULL;
-#endif
_IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL);
_IO_JUMPS (&sf._sbf) = &_IO_str_jumps;
_IO_str_init_static_internal (&sf, string, init_string_size, string);
diff --git a/libio/vsnprintf.c b/libio/vsnprintf.c
index 9ef61131db..4f326ad39c 100644
--- a/libio/vsnprintf.c
+++ b/libio/vsnprintf.c
@@ -95,9 +95,7 @@ __vsnprintf_internal (char *string, size_t maxlen, const char *format,
{
_IO_strnfile sf;
int ret;
-#ifdef _IO_MTSAFE_IO
sf.f._sbf._f._lock = NULL;
-#endif
/* We need to handle the special case where MAXLEN is 0. Use the
overflow buffer right from the start. */
diff --git a/libio/vswprintf.c b/libio/vswprintf.c
index b7036f1480..1103e17659 100644
--- a/libio/vswprintf.c
+++ b/libio/vswprintf.c
@@ -95,9 +95,7 @@ __vswprintf_internal (wchar_t *string, size_t maxlen, const wchar_t *format,
_IO_wstrnfile sf;
int ret;
struct _IO_wide_data wd;
-#ifdef _IO_MTSAFE_IO
sf.f._sbf._f._lock = NULL;
-#endif
if (maxlen == 0)
/* Since we have to write at least the terminating L'\0' a buffer
diff --git a/libio/wgenops.c b/libio/wgenops.c
index 106ddfd278..62e3396a0e 100644
--- a/libio/wgenops.c
+++ b/libio/wgenops.c
@@ -187,10 +187,8 @@ _IO_wdefault_finish (FILE *fp, int dummy)
fp->_IO_save_base = NULL;
}
-#ifdef _IO_MTSAFE_IO
if (fp->_lock != NULL)
_IO_lock_fini (*fp->_lock);
-#endif
_IO_un_link ((struct _IO_FILE_plus *) fp);
}
diff --git a/libio/wmemstream.c b/libio/wmemstream.c
index edcc266041..037349c83c 100644
--- a/libio/wmemstream.c
+++ b/libio/wmemstream.c
@@ -67,9 +67,7 @@ open_wmemstream (wchar_t **bufloc, size_t *sizeloc)
struct locked_FILE
{
struct _IO_FILE_wmemstream fp;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
struct _IO_wide_data wd;
} *new_f;
wchar_t *buf;
@@ -77,9 +75,7 @@ open_wmemstream (wchar_t **bufloc, size_t *sizeloc)
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
if (new_f == NULL)
return NULL;
-#ifdef _IO_MTSAFE_IO
new_f->fp._sf._sbf._f._lock = &new_f->lock;
-#endif
buf = calloc (1, BUFSIZ);
if (buf == NULL)
diff --git a/nptl/Makefile b/nptl/Makefile
index 9a5628b751..6af5231a93 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -422,9 +422,6 @@ $(objpfx)multidir.mk: $(common-objpfx)config.make
endif
-CFLAGS-ftrylockfile.c += $(libio-mtsafe)
-CFLAGS-funlockfile.c += $(libio-mtsafe)
-
link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \
$(common-objpfx)libc.a
diff --git a/pwd/Makefile b/pwd/Makefile
index 825a117f2f..5c1b4136e3 100644
--- a/pwd/Makefile
+++ b/pwd/Makefile
@@ -37,6 +37,5 @@ ifeq ($(have-thread-library),yes)
CFLAGS-getpwent_r.c += -fexceptions
CFLAGS-getpwent.c += -fexceptions
CFLAGS-getpw.c += -fexceptions
-CFLAGS-fgetpwent_r.c += $(libio-mtsafe)
endif
diff --git a/shadow/Makefile b/shadow/Makefile
index 641e015cfa..ced5ee7e4c 100644
--- a/shadow/Makefile
+++ b/shadow/Makefile
@@ -32,8 +32,8 @@ tests = tst-shadow tst-putspent
CFLAGS-getspent_r.c += -fexceptions
CFLAGS-getspent.c += -fexceptions
CFLAGS-fgetspent.c += -fexceptions
-CFLAGS-fgetspent_r.c += -fexceptions $(libio-mtsafe)
-CFLAGS-putspent.c += -fexceptions $(libio-mtsafe)
+CFLAGS-fgetspent_r.c += -fexceptions
+CFLAGS-putspent.c += -fexceptions
CFLAGS-getspnam.c += -fexceptions
CFLAGS-getspnam_r.c += -fexceptions
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index b2458ba4a6..dd54b4c6e3 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -196,8 +196,6 @@ CFLAGS-tst-gets.c += -Wno-deprecated-declarations
# the fortified version had the same bug.
CFLAGS-tst-bz11319-fortify2.c += -D_FORTIFY_SOURCE=2
-CPPFLAGS += $(libio-mtsafe)
-
$(objpfx)tst-setvbuf1.out: /dev/null $(objpfx)tst-setvbuf1
$(test-program-cmd) > $@ 2>&1; \
$(evaluate-test)
diff --git a/stdio-common/vfprintf-internal.c b/stdio-common/vfprintf-internal.c
index 3f3d1e148a..c6c72ec2dd 100644
--- a/stdio-common/vfprintf-internal.c
+++ b/stdio-common/vfprintf-internal.c
@@ -2175,9 +2175,7 @@ struct helper_file
struct _IO_wide_data _wide_data;
#endif
FILE *_put_stream;
-#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
-#endif
};
static int
@@ -2285,9 +2283,7 @@ buffered_vfprintf (FILE *s, const CHAR_T *format, va_list args,
#if _IO_JUMPS_OFFSET
hp->_vtable_offset = 0;
#endif
-#ifdef _IO_MTSAFE_IO
hp->_lock = NULL;
-#endif
hp->_flags2 = s->_flags2;
_IO_JUMPS (&helper._f) = (struct _IO_jump_t *) &_IO_helper_jumps;
diff --git a/stdlib/Makefile b/stdlib/Makefile
index ec30011b4c..d8974fc4ee 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -149,15 +149,6 @@ CFLAGS-system.c += -fexceptions
CFLAGS-system.os = -fomit-frame-pointer
CFLAGS-fmtmsg.c += -fexceptions
-CFLAGS-strfmon.c += $(libio-mtsafe)
-CFLAGS-strfmon_l.c += $(libio-mtsafe)
-
-# The strfrom class of functions call __printf_fp in order to convert the
-# floating-point value to characters. This requires the value of IO_MTSAFE_IO.
-CFLAGS-strfromd.c += $(libio-mtsafe)
-CFLAGS-strfromf.c += $(libio-mtsafe)
-CFLAGS-strfroml.c += $(libio-mtsafe)
-
CFLAGS-tst-bsearch.c += $(stack-align-test-flags)
CFLAGS-tst-qsort.c += $(stack-align-test-flags)
CFLAGS-tst-makecontext.c += -funwind-tables
diff --git a/stdlib/strfmon_l.c b/stdlib/strfmon_l.c
index 9e7268141b..7ea62322f9 100644
--- a/stdlib/strfmon_l.c
+++ b/stdlib/strfmon_l.c
@@ -524,9 +524,7 @@ __vstrfmon_l_internal (char *s, size_t maxsize, locale_t loc,
out_string (sign_string);
/* Print the number. */
-#ifdef _IO_MTSAFE_IO
f._sbf._f._lock = NULL;
-#endif
_IO_init_internal (&f._sbf._f, 0);
_IO_JUMPS (&f._sbf) = &_IO_str_jumps;
_IO_str_init_static_internal (&f, dest, (s + maxsize) - dest, dest);
diff --git a/stdlib/strfrom-skeleton.c b/stdlib/strfrom-skeleton.c
index b691cc3987..e41fdc01fb 100644
--- a/stdlib/strfrom-skeleton.c
+++ b/stdlib/strfrom-skeleton.c
@@ -37,9 +37,7 @@ int
STRFROM (char *dest, size_t size, const char *format, FLOAT f)
{
_IO_strnfile sfile;
-#ifdef _IO_MTSAFE_IO
sfile.f._sbf._f._lock = NULL;
-#endif
int done;
diff --git a/sysdeps/generic/stdio-lock.h b/sysdeps/generic/stdio-lock.h
index 791009b8ce..c17b8383d9 100644
--- a/sysdeps/generic/stdio-lock.h
+++ b/sysdeps/generic/stdio-lock.h
@@ -27,8 +27,8 @@ __libc_lock_define_recursive (typedef, _IO_lock_t)
/* We need recursive (counting) mutexes. */
#ifdef _LIBC_LOCK_RECURSIVE_INITIALIZER
# define _IO_lock_initializer _LIBC_LOCK_RECURSIVE_INITIALIZER
-#elif _IO_MTSAFE_IO
- #error libio needs recursive mutexes for _IO_MTSAFE_IO
+#else
+# error libio needs recursive mutexes
#endif
#define _IO_lock_init(_name) __libc_lock_init_recursive (_name)
diff --git a/sysdeps/ieee754/float128/Makefile b/sysdeps/ieee754/float128/Makefile
index 571a841809..166e630290 100644
--- a/sysdeps/ieee754/float128/Makefile
+++ b/sysdeps/ieee754/float128/Makefile
@@ -1,10 +1,6 @@
ifeq ($(subdir),stdlib)
routines += float1282mpn strfromf128
routines += strtof128 strtof128_l strtof128_nan mpn2float128
-
-# The strfrom class of functions call __printf_fp in order to convert the
-# floating-point value to characters. This requires the value of IO_MTSAFE_IO.
-CFLAGS-strfromf128.c += $(libio-mtsafe)
endif
ifeq ($(subdir),wcsmbs)
diff --git a/sysdeps/nptl/libc-lock.h b/sysdeps/nptl/libc-lock.h
index e8a5e68a12..627b13309a 100644
--- a/sysdeps/nptl/libc-lock.h
+++ b/sysdeps/nptl/libc-lock.h
@@ -25,7 +25,7 @@
/* Mutex type. */
-#if defined _LIBC || defined _IO_MTSAFE_IO
+#if defined _LIBC
# if (!IS_IN (libc) && !IS_IN (libpthread)) || !defined _LIBC
typedef struct { pthread_mutex_t mutex; } __libc_lock_recursive_t;
# else
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index e9566e028a..834eda4553 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -248,7 +248,6 @@ tests += tst-affinity tst-affinity-pid
tests-static := tst-affinity-static
tests += $(tests-static)
-CFLAGS-fork.c = $(libio-mtsafe)
CFLAGS-getpid.o = -fomit-frame-pointer
CFLAGS-getpid.os = -fomit-frame-pointer
endif
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index f38eb5cfe1..7314f0a9ca 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -102,8 +102,6 @@ CFLAGS-isoc99_fwscanf.c += -fexceptions
CFLAGS-isoc99_vwscanf.c += -fexceptions
CFLAGS-isoc99_vfwscanf.c += -fexceptions
-CPPFLAGS += $(libio-mtsafe)
-
# We need to find the default version of strtold_l in stdlib.
CPPFLAGS-wcstold_l.c += -I../stdlib
--
2.30.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/4] Consolidate stdio-lock.h
2021-05-27 20:44 [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 1/4] libio: Assume _IO_lock_inexpensive Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 2/4] libio: Assume _IO_MTSAFE_IO Adhemerval Zanella
@ 2021-05-27 20:44 ` Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 4/4] Move libio lock single-thread optimization to generic libc-lock (BZ #27842) Adhemerval Zanella
2022-04-12 12:18 ` [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Florian Weimer
4 siblings, 0 replies; 10+ messages in thread
From: Adhemerval Zanella @ 2021-05-27 20:44 UTC (permalink / raw)
To: libc-alpha
The NPTL replicate the sysdeps/nptl/libc-lock.h recursive lock. Use
the Hurd one as generic one, which already uses the __libc_lock
functions.
Checked on x86_64-linux-gnu and i686-linux-gnu.
---
sysdeps/generic/stdio-lock.h | 15 +++---
sysdeps/htl/stdio-lock.h | 57 --------------------
sysdeps/nptl/stdio-lock.h | 101 -----------------------------------
3 files changed, 6 insertions(+), 167 deletions(-)
delete mode 100644 sysdeps/htl/stdio-lock.h
delete mode 100644 sysdeps/nptl/stdio-lock.h
diff --git a/sysdeps/generic/stdio-lock.h b/sysdeps/generic/stdio-lock.h
index c17b8383d9..a900275400 100644
--- a/sysdeps/generic/stdio-lock.h
+++ b/sysdeps/generic/stdio-lock.h
@@ -47,17 +47,14 @@ __libc_lock_define_recursive (typedef, _IO_lock_t)
#if defined _LIBC && IS_IN (libc)
-# ifdef __EXCEPTIONS
# define _IO_acquire_lock(_fp) \
do { \
- FILE *_IO_acquire_lock_file \
- __attribute__((cleanup (_IO_acquire_lock_fct))) \
- = (_fp); \
- _IO_flockfile (_IO_acquire_lock_file);
-# else
-# define _IO_acquire_lock(_fp) _IO_acquire_lock_needs_exceptions_enabled
-# endif
-# define _IO_release_lock(_fp) ; } while (0)
+ _IO_cleanup_region_start((void (*) (void *)) &_IO_funlockfile, _fp); \
+ _IO_flockfile (_fp);
+# define _IO_release_lock(_fp) \
+ _IO_funlockfile (_fp); \
+ _IO_cleanup_region_end (0); \
+ } while (0)
#endif
diff --git a/sysdeps/htl/stdio-lock.h b/sysdeps/htl/stdio-lock.h
deleted file mode 100644
index 59969de45d..0000000000
--- a/sysdeps/htl/stdio-lock.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Thread package specific definitions of stream lock type. Hurd version.
- Copyright (C) 2000-2021 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _STDIO_LOCK_H
-#define _STDIO_LOCK_H 1
-
-#include <libc-lock.h>
-
-__libc_lock_define_recursive (typedef, _IO_lock_t)
-#define _IO_lock_t_defined 1
-
-/* We need recursive (counting) mutexes. */
-# define _IO_lock_initializer _LIBC_LOCK_RECURSIVE_INITIALIZER
-
-#define _IO_lock_init(_name) __libc_lock_init_recursive (_name)
-#define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name)
-#define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name)
-#define _IO_lock_trylock(_name) __libc_lock_trylock_recursive (_name)
-#define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name)
-
-
-#define _IO_cleanup_region_start(_fct, _fp) \
- __libc_cleanup_region_start (((_fp)->_flags & _IO_USER_LOCK) == 0, _fct, _fp)
-#define _IO_cleanup_region_start_noarg(_fct) \
- __libc_cleanup_region_start (1, _fct, NULL)
-#define _IO_cleanup_region_end(_doit) \
- __libc_cleanup_region_end (_doit)
-
-#if defined _LIBC && IS_IN (libc)
-
-# define _IO_acquire_lock(_fp) \
- do { \
- _IO_cleanup_region_start((void (*) (void *)) &_IO_funlockfile, _fp); \
- _IO_flockfile (_fp);
-# define _IO_release_lock(_fp) \
- _IO_funlockfile (_fp); \
- _IO_cleanup_region_end (0); \
- } while (0)
-
-#endif
-
-#endif /* stdio-lock.h */
diff --git a/sysdeps/nptl/stdio-lock.h b/sysdeps/nptl/stdio-lock.h
deleted file mode 100644
index a4f419b516..0000000000
--- a/sysdeps/nptl/stdio-lock.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Thread package specific definitions of stream lock type. NPTL version.
- Copyright (C) 2000-2021 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _STDIO_LOCK_H
-#define _STDIO_LOCK_H 1
-
-#include <libc-lock.h>
-#include <lowlevellock.h>
-
-
-typedef struct { int lock; int cnt; void *owner; } _IO_lock_t;
-#define _IO_lock_t_defined 1
-
-#define _IO_lock_initializer { LLL_LOCK_INITIALIZER, 0, NULL }
-
-#define _IO_lock_init(_name) \
- ((void) ((_name) = (_IO_lock_t) _IO_lock_initializer))
-
-#define _IO_lock_fini(_name) \
- ((void) 0)
-
-#define _IO_lock_lock(_name) \
- do { \
- void *__self = THREAD_SELF; \
- if ((_name).owner != __self) \
- { \
- lll_lock ((_name).lock, LLL_PRIVATE); \
- (_name).owner = __self; \
- } \
- ++(_name).cnt; \
- } while (0)
-
-#define _IO_lock_trylock(_name) \
- ({ \
- int __result = 0; \
- void *__self = THREAD_SELF; \
- if ((_name).owner != __self) \
- { \
- if (lll_trylock ((_name).lock) == 0) \
- { \
- (_name).owner = __self; \
- (_name).cnt = 1; \
- } \
- else \
- __result = EBUSY; \
- } \
- else \
- ++(_name).cnt; \
- __result; \
- })
-
-#define _IO_lock_unlock(_name) \
- do { \
- if (--(_name).cnt == 0) \
- { \
- (_name).owner = NULL; \
- lll_unlock ((_name).lock, LLL_PRIVATE); \
- } \
- } while (0)
-
-
-
-#define _IO_cleanup_region_start(_fct, _fp) \
- __libc_cleanup_region_start (((_fp)->_flags & _IO_USER_LOCK) == 0, _fct, _fp)
-#define _IO_cleanup_region_start_noarg(_fct) \
- __libc_cleanup_region_start (1, _fct, NULL)
-#define _IO_cleanup_region_end(_doit) \
- __libc_cleanup_region_end (_doit)
-
-#if defined _LIBC && IS_IN (libc)
-
-# ifdef __EXCEPTIONS
-# define _IO_acquire_lock(_fp) \
- do { \
- FILE *_IO_acquire_lock_file \
- __attribute__((cleanup (_IO_acquire_lock_fct))) \
- = (_fp); \
- _IO_flockfile (_IO_acquire_lock_file);
-# else
-# define _IO_acquire_lock(_fp) _IO_acquire_lock_needs_exceptions_enabled
-# endif
-# define _IO_release_lock(_fp) ; } while (0)
-
-#endif
-
-#endif /* stdio-lock.h */
--
2.30.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 4/4] Move libio lock single-thread optimization to generic libc-lock (BZ #27842)
2021-05-27 20:44 [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Adhemerval Zanella
` (2 preceding siblings ...)
2021-05-27 20:44 ` [PATCH 3/4] Consolidate stdio-lock.h Adhemerval Zanella
@ 2021-05-27 20:44 ` Adhemerval Zanella
2022-04-12 12:18 ` [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Florian Weimer
4 siblings, 0 replies; 10+ messages in thread
From: Adhemerval Zanella @ 2021-05-27 20:44 UTC (permalink / raw)
To: libc-alpha
This patch moves the single thread stdio optimization (d2e04918833d9)
to the generic libc-lock. It simplifies the support, since there is
no need to add per-function code to handle the single-thread case,
and removes the _IO_enable_locks (the SINGLE_THREAD_P uses the either
the TCB or the global variable which indicates wether the process
is multi-threaded).
As for current approach, once the process goes multithreaded the
single-thread is disabled (it won't be enable back if the process
become single-threaded).
It also handles the memory streams requirement (de895ddcd7fc), since
the SINGLE_THREAD_P already contains te information whether the
process is multithread (so there is no need to disable the optimization
because such stream are listed in _IO_list_all).
Finally it also removed the flockfile uses a read-modify-write operation
on _flags2 outside a lock region (BZ #27842).
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
---
libio/Versions | 3 ---
libio/feof.c | 2 --
libio/ferror.c | 2 --
libio/fputc.c | 2 --
libio/genops.c | 28 ----------------------------
libio/getc.c | 2 --
libio/getchar.c | 4 +---
libio/iofopncook.c | 2 --
libio/ioungetc.c | 2 --
libio/libio.h | 4 ----
libio/memstream.c | 3 ---
libio/putc.c | 2 --
libio/wmemstream.c | 3 ---
nptl/pthread_create.c | 3 ---
stdio-common/flockfile.c | 1 -
sysdeps/mach/libc-lock.h | 9 +++++----
sysdeps/nptl/libc-lock.h | 7 ++++---
17 files changed, 10 insertions(+), 69 deletions(-)
diff --git a/libio/Versions b/libio/Versions
index 6f1ab96100..73852bd007 100644
--- a/libio/Versions
+++ b/libio/Versions
@@ -156,9 +156,6 @@ libc {
# Used by NPTL and librt
__libc_fatal;
- # Used by NPTL
- _IO_enable_locks;
-
__fseeko64;
__ftello64;
}
diff --git a/libio/feof.c b/libio/feof.c
index 2664b4caac..7b4e9a60e3 100644
--- a/libio/feof.c
+++ b/libio/feof.c
@@ -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);
diff --git a/libio/ferror.c b/libio/ferror.c
index eef85c2602..dd3f0c8302 100644
--- a/libio/ferror.c
+++ b/libio/ferror.c
@@ -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);
diff --git a/libio/fputc.c b/libio/fputc.c
index 55877668c1..8abe5e80f0 100644
--- a/libio/fputc.c
+++ b/libio/fputc.c
@@ -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);
diff --git a/libio/genops.c b/libio/genops.c
index e501309b35..44b7ba9926 100644
--- a/libio/genops.c
+++ b/libio/genops.c
@@ -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;
diff --git a/libio/getc.c b/libio/getc.c
index bf67362cd9..78709bffa8 100644
--- a/libio/getc.c
+++ b/libio/getc.c
@@ -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);
diff --git a/libio/getchar.c b/libio/getchar.c
index 5c7307e392..270ccc0905 100644
--- a/libio/getchar.c
+++ b/libio/getchar.c
@@ -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
+}
diff --git a/libio/iofopncook.c b/libio/iofopncook.c
index 57285cc291..b6761f1e25 100644
--- a/libio/iofopncook.c
+++ b/libio/iofopncook.c
@@ -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. */
diff --git a/libio/ioungetc.c b/libio/ioungetc.c
index dcf1c4ca9e..9c149f15d3 100644
--- a/libio/ioungetc.c
+++ b/libio/ioungetc.c
@@ -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);
diff --git a/libio/libio.h b/libio/libio.h
index bd42479f13..60431e726d 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -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);
diff --git a/libio/memstream.c b/libio/memstream.c
index 6763689038..368c23f7e8 100644
--- a/libio/memstream.c
+++ b/libio/memstream.c
@@ -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)
diff --git a/libio/putc.c b/libio/putc.c
index bc9dea856d..72e7ec3f0b 100644
--- a/libio/putc.c
+++ b/libio/putc.c
@@ -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);
diff --git a/libio/wmemstream.c b/libio/wmemstream.c
index 037349c83c..d441c4248c 100644
--- a/libio/wmemstream.c
+++ b/libio/wmemstream.c
@@ -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;
}
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 2d2535b07d..d856c7bce3 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -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;
diff --git a/stdio-common/flockfile.c b/stdio-common/flockfile.c
index a66e0a731e..da382aebdf 100644
--- a/stdio-common/flockfile.c
+++ b/stdio-common/flockfile.c
@@ -22,7 +22,6 @@
void
__flockfile (FILE *stream)
{
- stream->_flags2 |= _IO_FLAGS2_NEED_LOCK;
_IO_lock_lock (*stream->_lock);
}
weak_alias (__flockfile, flockfile);
diff --git a/sysdeps/mach/libc-lock.h b/sysdeps/mach/libc-lock.h
index 220fcee921..7b20d45470 100644
--- a/sysdeps/mach/libc-lock.h
+++ b/sysdeps/mach/libc-lock.h
@@ -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); \
} \
})
diff --git a/sysdeps/nptl/libc-lock.h b/sysdeps/nptl/libc-lock.h
index 627b13309a..fd5ab91abf 100644
--- a/sysdeps/nptl/libc-lock.h
+++ b/sysdeps/nptl/libc-lock.h
@@ -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
--
2.30.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/4] libio: Assume _IO_MTSAFE_IO
2021-05-27 20:44 ` [PATCH 2/4] libio: Assume _IO_MTSAFE_IO Adhemerval Zanella
@ 2021-05-27 21:38 ` Andreas Schwab
0 siblings, 0 replies; 10+ messages in thread
From: Andreas Schwab @ 2021-05-27 21:38 UTC (permalink / raw)
To: Adhemerval Zanella via Libc-alpha
On Mai 27 2021, Adhemerval Zanella via Libc-alpha wrote:
> diff --git a/libio/ferror.c b/libio/ferror.c
> index 588f2eb50b..eef85c2602 100644
> --- a/libio/ferror.c
> +++ b/libio/ferror.c
> @@ -40,9 +40,4 @@ _IO_ferror (FILE *fp)
> return result;
> }
>
> -weak_alias (_IO_ferror, ferror)
> -
> -#ifndef _IO_MTSAFE_IO
> -#undef ferror_unlocked
> -weak_alias (_IO_ferror, ferror_unlocked)
> -#endif
> +weak_alias (_IO_ferror, ferror)
> \ No newline at end of file
Please keep the newline.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/4] libio: Assume _IO_lock_inexpensive
2021-05-27 20:44 ` [PATCH 1/4] libio: Assume _IO_lock_inexpensive Adhemerval Zanella
@ 2021-05-30 13:11 ` Florian Weimer
0 siblings, 0 replies; 10+ messages in thread
From: Florian Weimer @ 2021-05-30 13:11 UTC (permalink / raw)
To: Adhemerval Zanella via Libc-alpha
* Adhemerval Zanella via Libc-alpha:
> It is already set by both Linux and Hurd.
Looks okay to me, thanks.
Florian
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock
2021-05-27 20:44 [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Adhemerval Zanella
` (3 preceding siblings ...)
2021-05-27 20:44 ` [PATCH 4/4] Move libio lock single-thread optimization to generic libc-lock (BZ #27842) Adhemerval Zanella
@ 2022-04-12 12:18 ` Florian Weimer
2022-04-14 14:23 ` Adhemerval Zanella
4 siblings, 1 reply; 10+ messages in thread
From: Florian Weimer @ 2022-04-12 12:18 UTC (permalink / raw)
To: Adhemerval Zanella via Libc-alpha
* Adhemerval Zanella via Libc-alpha:
> This patchset removes some old unused code (_IO_lock_inexpensive
> and _IO_MTSAFE_IO), consolidate the stdio-lock.h and move the
> single-thread lock optimization to generic code instead of
> per-function usage.
>
> Adhemerval Zanella (4):
> libio: Assume _IO_lock_inexpensive
> libio: Assume _IO_MTSAFE_IO
> Consolidate stdio-lock.h
> Move libio lock single-thread optimization to generic libc-lock (BZ
> #27842)
This series is still assigned to me in Patchwork. Is it still active?
Thanks,
Florian
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock
2022-04-12 12:18 ` [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Florian Weimer
@ 2022-04-14 14:23 ` Adhemerval Zanella
2022-04-14 15:28 ` Florian Weimer
0 siblings, 1 reply; 10+ messages in thread
From: Adhemerval Zanella @ 2022-04-14 14:23 UTC (permalink / raw)
To: Florian Weimer, Adhemerval Zanella via Libc-alpha
On 12/04/2022 09:18, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
>
>> This patchset removes some old unused code (_IO_lock_inexpensive
>> and _IO_MTSAFE_IO), consolidate the stdio-lock.h and move the
>> single-thread lock optimization to generic code instead of
>> per-function usage.
>>
>> Adhemerval Zanella (4):
>> libio: Assume _IO_lock_inexpensive
>> libio: Assume _IO_MTSAFE_IO
>> Consolidate stdio-lock.h
>> Move libio lock single-thread optimization to generic libc-lock (BZ
>> #27842)
>
> This series is still assigned to me in Patchwork. Is it still active?
I think it would be a good micro-optimization and a code consolidation,
although I am not sure if it still applies. If you think it would be
a good addition I can work on rebase and send a new version.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock
2022-04-14 14:23 ` Adhemerval Zanella
@ 2022-04-14 15:28 ` Florian Weimer
0 siblings, 0 replies; 10+ messages in thread
From: Florian Weimer @ 2022-04-14 15:28 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: Adhemerval Zanella via Libc-alpha
* Adhemerval Zanella:
> On 12/04/2022 09:18, Florian Weimer wrote:
>> * Adhemerval Zanella via Libc-alpha:
>>
>>> This patchset removes some old unused code (_IO_lock_inexpensive
>>> and _IO_MTSAFE_IO), consolidate the stdio-lock.h and move the
>>> single-thread lock optimization to generic code instead of
>>> per-function usage.
>>>
>>> Adhemerval Zanella (4):
>>> libio: Assume _IO_lock_inexpensive
>>> libio: Assume _IO_MTSAFE_IO
>>> Consolidate stdio-lock.h
>>> Move libio lock single-thread optimization to generic libc-lock (BZ
>>> #27842)
>>
>> This series is still assigned to me in Patchwork. Is it still active?
>
> I think it would be a good micro-optimization and a code consolidation,
> although I am not sure if it still applies. If you think it would be
> a good addition I can work on rebase and send a new version.
I'm interested in the _IO_MTSAFE_IO consolidation, but the rest looks
useful as well. I think we have some places where we define stdio
locking macros differently for no apparent reason, that that's just
waiting to cause trouble.
Thanks,
Florian
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-04-14 15:28 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-27 20:44 [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 1/4] libio: Assume _IO_lock_inexpensive Adhemerval Zanella
2021-05-30 13:11 ` Florian Weimer
2021-05-27 20:44 ` [PATCH 2/4] libio: Assume _IO_MTSAFE_IO Adhemerval Zanella
2021-05-27 21:38 ` Andreas Schwab
2021-05-27 20:44 ` [PATCH 3/4] Consolidate stdio-lock.h Adhemerval Zanella
2021-05-27 20:44 ` [PATCH 4/4] Move libio lock single-thread optimization to generic libc-lock (BZ #27842) Adhemerval Zanella
2022-04-12 12:18 ` [PATCH 0/4] Move libio lock single-thread optimization to generic libc-lock Florian Weimer
2022-04-14 14:23 ` Adhemerval Zanella
2022-04-14 15:28 ` Florian Weimer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).