public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Samuel Thibault <sthibaul@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc] hurd: Move internal functions to internal header Date: Sat, 23 Mar 2024 22:16:16 +0000 (GMT) [thread overview] Message-ID: <20240323221616.1A93C3858D28@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=7f02511e5b8879430e2b3c51601341d3c0314071 commit 7f02511e5b8879430e2b3c51601341d3c0314071 Author: Sergey Bugaev <bugaevc@gmail.com> Date: Sat Mar 23 20:32:42 2024 +0300 hurd: Move internal functions to internal header Move _hurd_self_sigstate (), _hurd_critical_section_lock (), and _hurd_critical_section_unlock () inline implementations (that were already guarded by #if defined _LIBC) to the internal version of the header. While at it, add <tls.h> to the includes, and use __LIBC_NO_TLS () unconditionally. Signed-off-by: Sergey Bugaev <bugaevc@gmail.com> Message-ID: <20240323173301.151066-2-bugaevc@gmail.com> Diff: --- hurd/hurd/signal.h | 87 -------------------------------------- sysdeps/hurd/include/hurd/signal.h | 78 ++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 87 deletions(-) diff --git a/hurd/hurd/signal.h b/hurd/hurd/signal.h index 6bc7103b0a..5d116fb2fd 100644 --- a/hurd/hurd/signal.h +++ b/hurd/hurd/signal.h @@ -40,11 +40,6 @@ #include <setjmp.h> /* For `jmp_buf'. */ #include <spin-lock.h> struct hurd_signal_preemptor; /* <hurd/sigpreempt.h> */ -#if defined __USE_EXTERN_INLINES && defined _LIBC -# if IS_IN (libc) || IS_IN (libpthread) -# include <sigsetops.h> -# endif -#endif /* Full details of a signal. */ @@ -157,33 +152,6 @@ extern void _hurd_sigstate_unlock (struct hurd_sigstate *ss); /* Used by libpthread to remove stale sigstate structures. */ extern void _hurd_sigstate_delete (thread_t thread); -#ifndef _HURD_SIGNAL_H_EXTERN_INLINE -#define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline -#endif - -#if defined __USE_EXTERN_INLINES && defined _LIBC -# if IS_IN (libc) -_HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate * -_hurd_self_sigstate (void) -{ - struct hurd_sigstate *ss = THREAD_GETMEM (THREAD_SELF, _hurd_sigstate); - if (__glibc_unlikely (ss == NULL)) - { - thread_t self = __mach_thread_self (); - - /* The thread variable is unset; this must be the first time we've - asked for it. In this case, the critical section flag cannot - possible already be set. Look up our sigstate structure the slow - way. */ - ss = _hurd_thread_sigstate (self); - THREAD_SETMEM (THREAD_SELF, _hurd_sigstate, ss); - __mach_port_deallocate (__mach_task_self (), self); - } - return ss; -} -# endif -#endif - struct machine_thread_all_state; extern mach_port_t _hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread, @@ -215,63 +183,8 @@ extern int _hurd_core_limit; avoid unexpectingly exposing EINTR to the application. */ extern void *_hurd_critical_section_lock (void); - -#if defined __USE_EXTERN_INLINES && defined _LIBC -# if IS_IN (libc) -_HURD_SIGNAL_H_EXTERN_INLINE void * -_hurd_critical_section_lock (void) -{ - struct hurd_sigstate *ss; - -#ifdef __LIBC_NO_TLS - if (__LIBC_NO_TLS ()) - /* TLS is currently initializing, no need to enter critical section. */ - return NULL; -#endif - - ss = _hurd_self_sigstate (); - - if (! __spin_try_lock (&ss->critical_section_lock)) - /* We are already in a critical section, so do nothing. */ - return NULL; - - /* With the critical section lock held no signal handler will run. - Return our sigstate pointer; this will be passed to - _hurd_critical_section_unlock to unlock it. */ - return ss; -} -# endif -#endif - extern void _hurd_critical_section_unlock (void *our_lock); -#if defined __USE_EXTERN_INLINES && defined _LIBC -# if IS_IN (libc) -_HURD_SIGNAL_H_EXTERN_INLINE void -_hurd_critical_section_unlock (void *our_lock) -{ - if (our_lock == NULL) - /* The critical section lock was held when we began. Do nothing. */ - return; - else - { - /* It was us who acquired the critical section lock. Unlock it. */ - struct hurd_sigstate *ss = (struct hurd_sigstate *) our_lock; - sigset_t pending; - _hurd_sigstate_lock (ss); - __spin_unlock (&ss->critical_section_lock); - pending = _hurd_sigstate_pending (ss) & ~ss->blocked; - _hurd_sigstate_unlock (ss); - if (__glibc_unlikely (!__sigisemptyset (&pending))) - /* There are unblocked signals pending, which weren't - delivered because we were in the critical section. - Tell the signal thread to deliver them now. */ - __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); - } -} -# endif -#endif - /* Convenient macros for simple uses of critical sections. These two must be used as a pair at the same C scoping level. */ diff --git a/sysdeps/hurd/include/hurd/signal.h b/sysdeps/hurd/include/hurd/signal.h index 1dc8a1f353..fab8d1b67c 100644 --- a/sysdeps/hurd/include/hurd/signal.h +++ b/sysdeps/hurd/include/hurd/signal.h @@ -9,6 +9,84 @@ libc_hidden_proto (_hurd_self_sigstate) #include_next <hurd/signal.h> #ifndef _ISOMAC + +#if defined __USE_EXTERN_INLINES +# if IS_IN (libc) || IS_IN (libpthread) +# include <sigsetops.h> +# include <tls.h> +# endif +#endif + +#ifndef _HURD_SIGNAL_H_EXTERN_INLINE +#define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline +#endif + +#if defined __USE_EXTERN_INLINES && IS_IN (libc) +_HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate * +_hurd_self_sigstate (void) +{ + struct hurd_sigstate *ss = THREAD_GETMEM (THREAD_SELF, _hurd_sigstate); + if (__glibc_unlikely (ss == NULL)) + { + thread_t self = __mach_thread_self (); + + /* The thread variable is unset; this must be the first time we've + asked for it. In this case, the critical section flag cannot + possible already be set. Look up our sigstate structure the slow + way. */ + ss = _hurd_thread_sigstate (self); + THREAD_SETMEM (THREAD_SELF, _hurd_sigstate, ss); + __mach_port_deallocate (__mach_task_self (), self); + } + return ss; +} + +_HURD_SIGNAL_H_EXTERN_INLINE void * +_hurd_critical_section_lock (void) +{ + struct hurd_sigstate *ss; + + if (__LIBC_NO_TLS ()) + /* TLS is currently initializing, no need to enter critical section. */ + return NULL; + + ss = _hurd_self_sigstate (); + + if (! __spin_try_lock (&ss->critical_section_lock)) + /* We are already in a critical section, so do nothing. */ + return NULL; + + /* With the critical section lock held no signal handler will run. + Return our sigstate pointer; this will be passed to + _hurd_critical_section_unlock to unlock it. */ + return ss; +} + +_HURD_SIGNAL_H_EXTERN_INLINE void +_hurd_critical_section_unlock (void *our_lock) +{ + if (our_lock == NULL) + /* The critical section lock was held when we began. Do nothing. */ + return; + else + { + /* It was us who acquired the critical section lock. Unlock it. */ + struct hurd_sigstate *ss = (struct hurd_sigstate *) our_lock; + sigset_t pending; + _hurd_sigstate_lock (ss); + __spin_unlock (&ss->critical_section_lock); + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; + _hurd_sigstate_unlock (ss); + if (__glibc_unlikely (!__sigisemptyset (&pending))) + /* There are unblocked signals pending, which weren't + delivered because we were in the critical section. + Tell the signal thread to deliver them now. */ + __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); + } +} +#endif /* defined __USE_EXTERN_INLINES && IS_IN (libc) */ + + libc_hidden_proto (_hurd_exception2signal) libc_hidden_proto (_hurd_intr_rpc_mach_msg) libc_hidden_proto (_hurd_thread_sigstate)
reply other threads:[~2024-03-23 22:16 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20240323221616.1A93C3858D28@sourceware.org \ --to=sthibaul@sourceware.org \ --cc=glibc-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).