htl: move {,_IO_}f{,un,try}lockfile implementation into libc

This commit is contained in:
Samuel Thibault
2025-11-13 21:13:53 +01:00
parent c6908c4e24
commit f6a60e9867
14 changed files with 45 additions and 99 deletions

View File

@@ -20,7 +20,7 @@ subdir := htl
srcdir = .
MICROKERNEL := mach
SYSDEPS := lockfile
SYSDEPS :=
LCLHDRS :=
@@ -36,7 +36,6 @@ libpthread-routines := \
pt-setname-np \
cancellation \
herrno \
$(SYSDEPS) \
# libpthread-routine
headers := \
@@ -220,8 +219,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

View File

@@ -1,6 +1,7 @@
libc {
GLIBC_2.12 {
flockfile; ftrylockfile; funlockfile;
pthread_self;
__pthread_get_cleanup_stack;
__pthread_key_create;
@@ -313,12 +314,9 @@ libc {
libpthread {
GLIBC_2.2.6 {
_IO_flockfile; _IO_ftrylockfile; _IO_funlockfile;
__errno_location; __h_errno_location;
}
GLIBC_2.12 {
flockfile; ftrylockfile; funlockfile;
pthread_atfork;
pthread_create;

View File

@@ -1,53 +0,0 @@
/* lockfile - Handle locking and unlocking of streams. Hurd pthread version.
Copyright (C) 2000-2025 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/>. */
#include <pthread.h> /* Must come before <stdio.h>! */
#include <stdio.h>
#undef _IO_flockfile
#undef _IO_funlockfile
#undef _IO_ftrylockfile
void
_IO_flockfile (FILE *fp)
{
_IO_lock_lock (*fp->_lock);
}
void
_IO_funlockfile (FILE *fp)
{
_IO_lock_unlock (*fp->_lock);
}
int
_IO_ftrylockfile (FILE *fp)
{
return __libc_lock_trylock_recursive (*fp->_lock);
}
#undef flockfile
#undef funlockfile
#undef ftrylockfile
void flockfile (FILE *)
__attribute__ ((weak, alias ("_IO_flockfile")));
void funlockfile (FILE *)
__attribute__ ((weak, alias ("_IO_funlockfile")));
int ftrylockfile (FILE *)
__attribute__ ((weak, alias ("_IO_ftrylockfile")));

View File

@@ -28,9 +28,6 @@
#if IS_IN (libpthread)
static const struct pthread_functions pthread_functions = {
.ptr__IO_flockfile = _IO_flockfile,
.ptr__IO_funlockfile = _IO_funlockfile,
.ptr__IO_ftrylockfile = _IO_ftrylockfile,
};
#endif /* IS_IN (libpthread) */

View File

@@ -206,10 +206,12 @@ _Noreturn void __libc_message_wrapper (const char *vmaname,
__libc_message_wrapper (__libc_assert_vma_name, __VA_ARGS__)
/* Acquire ownership of STREAM. */
extern void __flockfile (FILE *__stream) attribute_hidden;
extern void __flockfile (FILE *__stream);
libc_hidden_proto (__flockfile)
/* Relinquish the ownership granted for STREAM. */
extern void __funlockfile (FILE *__stream) attribute_hidden;
extern void __funlockfile (FILE *__stream);
libc_hidden_proto (__funlockfile)
/* Try to acquire ownership of STREAM but do not block if it is not
possible. */

View File

@@ -24,5 +24,6 @@ __flockfile (FILE *stream)
{
_IO_lock_lock (*stream->_lock);
}
libc_hidden_def(__flockfile)
weak_alias (__flockfile, flockfile);
weak_alias (__flockfile, _IO_flockfile)

View File

@@ -25,5 +25,6 @@ __funlockfile (FILE *stream)
{
_IO_lock_unlock (*stream->_lock);
}
libc_hidden_def(__funlockfile)
weak_alias (__funlockfile, _IO_funlockfile)
weak_alias (__funlockfile, funlockfile);

View File

@@ -17,15 +17,21 @@
<https://www.gnu.org/licenses/>. */
#include <stdio.h>
#include <libc-lockP.h>
#include <stdio-lock.h>
void
__flockfile (FILE *stream)
{
#ifdef SHARED
__libc_ptf_call (_IO_flockfile, (stream), 0);
#endif
_IO_lock_lock (*stream->_lock);
}
weak_alias (__flockfile, _IO_flockfile)
weak_alias (__flockfile, flockfile)
libc_hidden_def(__flockfile)
weak_alias (__flockfile, _IO_flockfile);
#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_12)
versioned_symbol (libc, __flockfile, flockfile, GLIBC_2_0);
# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_43)
compat_symbol (libpthread, __flockfile, flockfile, GLIBC_2_12);
# endif
#else
weak_alias (__flockfile, flockfile);
#endif

View File

@@ -17,17 +17,20 @@
<https://www.gnu.org/licenses/>. */
#include <stdio.h>
#include <libc-lockP.h>
#include <stdio-lock.h>
int
__ftrylockfile (FILE *stream)
{
#ifdef SHARED
return __libc_ptf_call (_IO_ftrylockfile, (stream), 0);
#else
return 0;
#endif
return _IO_lock_trylock (*stream->_lock);
}
weak_alias (__ftrylockfile, _IO_ftrylockfile)
weak_alias (__ftrylockfile, ftrylockfile)
weak_alias (__ftrylockfile, _IO_ftrylockfile);
#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_12)
versioned_symbol (libc, __ftrylockfile, ftrylockfile, GLIBC_2_0);
# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_43)
compat_symbol (libpthread, __ftrylockfile, ftrylockfile, GLIBC_2_12);
# endif
#else
weak_alias (__ftrylockfile, ftrylockfile);
#endif

View File

@@ -23,9 +23,15 @@
void
__funlockfile (FILE *stream)
{
#ifdef SHARED
__libc_ptf_call (_IO_funlockfile, (stream), 0);
#endif
_IO_lock_unlock (*stream->_lock);
}
weak_alias (__funlockfile, _IO_funlockfile)
weak_alias (__funlockfile, funlockfile)
libc_hidden_def(__funlockfile)
weak_alias (__funlockfile, _IO_funlockfile);
#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_12)
versioned_symbol (libc, __funlockfile, funlockfile, GLIBC_2_0);
# if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_43)
compat_symbol (libpthread, __funlockfile, funlockfile, GLIBC_2_12);
# endif
#else
weak_alias (__funlockfile, funlockfile);
#endif

View File

@@ -26,9 +26,6 @@
so if possible avoid breaking it and append new hooks to the end. */
struct pthread_functions
{
void (*ptr__IO_flockfile) (FILE *);
void (*ptr__IO_funlockfile) (FILE *);
int (*ptr__IO_ftrylockfile) (FILE *);
};
/* Variable in libc.so. */

View File

@@ -33,6 +33,9 @@ GLIBC_2.12 __pthread_key_create F
GLIBC_2.12 __pthread_kill F
GLIBC_2.12 __pthread_mutex_transfer_np F
GLIBC_2.12 __pthread_self F
GLIBC_2.12 flockfile F
GLIBC_2.12 ftrylockfile F
GLIBC_2.12 funlockfile F
GLIBC_2.12 pthread_attr_destroy F
GLIBC_2.12 pthread_attr_getdetachstate F
GLIBC_2.12 pthread_attr_getguardsize F

View File

@@ -4,9 +4,6 @@ GLIBC_2.12 __pthread_spin_lock F
GLIBC_2.12 __pthread_spin_trylock F
GLIBC_2.12 __pthread_spin_unlock F
GLIBC_2.12 _pthread_spin_lock F
GLIBC_2.12 flockfile F
GLIBC_2.12 ftrylockfile F
GLIBC_2.12 funlockfile F
GLIBC_2.12 pthread_atfork F
GLIBC_2.12 pthread_create F
GLIBC_2.12 pthread_spin_destroy F
@@ -14,9 +11,6 @@ GLIBC_2.12 pthread_spin_init F
GLIBC_2.12 pthread_spin_lock F
GLIBC_2.12 pthread_spin_trylock F
GLIBC_2.12 pthread_spin_unlock F
GLIBC_2.2.6 _IO_flockfile F
GLIBC_2.2.6 _IO_ftrylockfile F
GLIBC_2.2.6 _IO_funlockfile F
GLIBC_2.2.6 __errno_location F
GLIBC_2.2.6 __h_errno_location F
GLIBC_2.21 pthread_hurd_cond_timedwait_np F

View File

@@ -1,6 +1,3 @@
GLIBC_2.38 _IO_flockfile F
GLIBC_2.38 _IO_ftrylockfile F
GLIBC_2.38 _IO_funlockfile F
GLIBC_2.38 __errno_location F
GLIBC_2.38 __h_errno_location F
GLIBC_2.38 __pthread_spin_destroy F
@@ -16,9 +13,6 @@ GLIBC_2.38 cnd_init F
GLIBC_2.38 cnd_signal F
GLIBC_2.38 cnd_timedwait F
GLIBC_2.38 cnd_wait F
GLIBC_2.38 flockfile F
GLIBC_2.38 ftrylockfile F
GLIBC_2.38 funlockfile F
GLIBC_2.38 mtx_destroy F
GLIBC_2.38 mtx_init F
GLIBC_2.38 mtx_lock F