hurd: take __USE_EXTERN_INLINES into account and restrict inlines

* hurd/hurd.h (__hurd_fail): Always declare function, and provide inline
version only if __USE_EXTERN_INLINES is defined.
* hurd/hurd/fd.h (_hurd_fd_error_signal, _hurd_fd_error, __hurd_dfail,
__hurd_sockfail): Likewise.
(_hurd_fd_get): Always declare functions, and provide inline versions
only if __USE_EXTERN_INLINES and _LIBC are defined and IS_IN(libc).
* hurd/hurd/port.h (_hurd_port_init, _hurd_port_locked_get,
_hurd_port_get, _hurd_port_free, _hurd_port_locked_set,
_hurd_port_set): Always declare functions, and provide inline versions
only if __USE_EXTERN_INLINES and _LIBC are defined and
IS_IN(libc).
* hurd/hurd/signal.h (_hurd_self_sigstate, _hurd_critical_section_lock,
_hurd_critical_section_unlock): Likewise.
* hurd/hurd/threadvar.h (__hurd_threadvar_location_from_sp,
* __hurd_threadvar_location): Likewise.
* hurd/hurd/userlink.h (_hurd_userlink_link, _hurd_userlink_unlink,
_hurd_userlink_clear): Likewise.
* mach/lock-intern.h (__spin_lock_init, __spin_lock, __mutex_lock,
__mutex_unlock, __mutex_trylock): Always declare functions, and provide
inline versions only if __USE_EXTERN_INLINES and _LIBC are defined.
* mach/mach/mig_support.h (__mig_strncpy): Likewise.
* sysdeps/generic/machine-lock.h (__spin_unlock, __spin_try_lock,
__spin_lock_locked): Likewise.
* sysdeps/mach/i386/machine-lock.h (__spin_unlock, __spin_try_lock,
__spin_lock_locked): Likewise.
* mach/spin-lock.c (__USE_EXTERN_INLINES): Define to 1.
* hurd/Versions (libc: GLIBC_2.27): Add _hurd_fd_error_signal,
_hurd_fd_error, __hurd_dfail, __hurd_sockfail, _hurd_port_locked_set,
__hurd_threadvar_location_from_sp, __hurd_threadvar_location,
_hurd_userlink_link, _hurd_userlink_unlink, _hurd_userlink_clear.
This commit is contained in:
Samuel Thibault 2018-01-28 18:43:10 +01:00
parent 3fc1ecf935
commit 28f6186f3e
13 changed files with 204 additions and 0 deletions

View File

@ -60,6 +60,36 @@
_POSIX_CHOWN_RESTRICTED is defined to 0. _POSIX_CHOWN_RESTRICTED is defined to 0.
* io/tst-copy_file_range.c [!defined CLONE_NEWNS]: Do not include * io/tst-copy_file_range.c [!defined CLONE_NEWNS]: Do not include
<sys/mount.h>. <sys/mount.h>.
* hurd/hurd.h (__hurd_fail): Always declare function, and provide inline
version only if __USE_EXTERN_INLINES is defined.
* hurd/hurd/fd.h (_hurd_fd_error_signal, _hurd_fd_error, __hurd_dfail,
__hurd_sockfail): Likewise.
(_hurd_fd_get): Always declare functions, and provide inline versions
only if __USE_EXTERN_INLINES and _LIBC are defined and IS_IN(libc).
* hurd/hurd/port.h (_hurd_port_init, _hurd_port_locked_get,
_hurd_port_get, _hurd_port_free, _hurd_port_locked_set,
_hurd_port_set): Always declare functions, and provide inline versions
only if __USE_EXTERN_INLINES and _LIBC are defined and
IS_IN(libc).
* hurd/hurd/signal.h (_hurd_self_sigstate, _hurd_critical_section_lock,
_hurd_critical_section_unlock): Likewise.
* hurd/hurd/threadvar.h (__hurd_threadvar_location_from_sp,
* __hurd_threadvar_location): Likewise.
* hurd/hurd/userlink.h (_hurd_userlink_link, _hurd_userlink_unlink,
_hurd_userlink_clear): Likewise.
* mach/lock-intern.h (__spin_lock_init, __spin_lock, __mutex_lock,
__mutex_unlock, __mutex_trylock): Always declare functions, and provide
inline versions only if __USE_EXTERN_INLINES and _LIBC are defined.
* mach/mach/mig_support.h (__mig_strncpy): Likewise.
* sysdeps/generic/machine-lock.h (__spin_unlock, __spin_try_lock,
__spin_lock_locked): Likewise.
* sysdeps/mach/i386/machine-lock.h (__spin_unlock, __spin_try_lock,
__spin_lock_locked): Likewise.
* mach/spin-lock.c (__USE_EXTERN_INLINES): Define to 1.
* hurd/Versions (libc: GLIBC_2.27): Add _hurd_fd_error_signal,
_hurd_fd_error, __hurd_dfail, __hurd_sockfail, _hurd_port_locked_set,
__hurd_threadvar_location_from_sp, __hurd_threadvar_location,
_hurd_userlink_link, _hurd_userlink_unlink, _hurd_userlink_clear.
2008-12-18 Thomas Schwinge <tschwinge@gnu.org> 2008-12-18 Thomas Schwinge <tschwinge@gnu.org>

View File

@ -130,6 +130,14 @@ libc {
__errno_location; __errno_location;
} }
GLIBC_2.27 { GLIBC_2.27 {
# These always existed as inlines but the real functions were not exported.
_hurd_fd_error_signal; _hurd_fd_error;
__hurd_dfail; __hurd_sockfail;
_hurd_port_locked_set;
__hurd_threadvar_location_from_sp;
__hurd_threadvar_location;
_hurd_userlink_link; _hurd_userlink_unlink; _hurd_userlink_clear;
# "quasi-internal" functions # "quasi-internal" functions
_hurd_exec_paths; _hurd_exec_paths;
} }

View File

@ -46,6 +46,9 @@
#define _HURD_H_EXTERN_INLINE __extern_inline #define _HURD_H_EXTERN_INLINE __extern_inline
#endif #endif
extern int __hurd_fail (error_t err);
#ifdef __USE_EXTERN_INLINES
_HURD_H_EXTERN_INLINE int _HURD_H_EXTERN_INLINE int
__hurd_fail (error_t err) __hurd_fail (error_t err)
{ {
@ -75,6 +78,7 @@ __hurd_fail (error_t err)
errno = err; errno = err;
return -1; return -1;
} }
#endif
/* Basic ports and info, initialized by startup. */ /* Basic ports and info, initialized by startup. */

View File

@ -59,6 +59,10 @@ extern struct mutex _hurd_dtable_lock; /* Locks those two variables. */
NULL. The cell is unlocked; when ready to use it, lock it and check for NULL. The cell is unlocked; when ready to use it, lock it and check for
it being unused. */ it being unused. */
extern struct hurd_fd *_hurd_fd_get (int fd);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_FD_H_EXTERN_INLINE struct hurd_fd * _HURD_FD_H_EXTERN_INLINE struct hurd_fd *
_hurd_fd_get (int fd) _hurd_fd_get (int fd)
{ {
@ -91,6 +95,8 @@ _hurd_fd_get (int fd)
return descriptor; return descriptor;
} }
# endif
#endif
/* Evaluate EXPR with the variable `descriptor' bound to a pointer to the /* Evaluate EXPR with the variable `descriptor' bound to a pointer to the
@ -138,6 +144,9 @@ _hurd_fd_get (int fd)
/* Check if ERR should generate a signal. /* Check if ERR should generate a signal.
Returns the signal to take, or zero if none. */ Returns the signal to take, or zero if none. */
extern int _hurd_fd_error_signal (error_t err);
#ifdef __USE_EXTERN_INLINES
_HURD_FD_H_EXTERN_INLINE int _HURD_FD_H_EXTERN_INLINE int
_hurd_fd_error_signal (error_t err) _hurd_fd_error_signal (error_t err)
{ {
@ -154,11 +163,15 @@ _hurd_fd_error_signal (error_t err)
return 0; return 0;
} }
} }
#endif
/* Handle an error from an RPC on a file descriptor's port. You should /* Handle an error from an RPC on a file descriptor's port. You should
always use this function to handle errors from RPCs made on file always use this function to handle errors from RPCs made on file
descriptor ports. Some errors are translated into signals. */ descriptor ports. Some errors are translated into signals. */
extern error_t _hurd_fd_error (int fd, error_t err);
#ifdef __USE_EXTERN_INLINES
_HURD_FD_H_EXTERN_INLINE error_t _HURD_FD_H_EXTERN_INLINE error_t
_hurd_fd_error (int fd, error_t err) _hurd_fd_error (int fd, error_t err)
{ {
@ -171,20 +184,28 @@ _hurd_fd_error (int fd, error_t err)
} }
return err; return err;
} }
#endif
/* Handle error code ERR from an RPC on file descriptor FD's port. /* Handle error code ERR from an RPC on file descriptor FD's port.
Set `errno' to the appropriate error code, and always return -1. */ Set `errno' to the appropriate error code, and always return -1. */
extern int __hurd_dfail (int fd, error_t err);
#ifdef __USE_EXTERN_INLINES
_HURD_FD_H_EXTERN_INLINE int _HURD_FD_H_EXTERN_INLINE int
__hurd_dfail (int fd, error_t err) __hurd_dfail (int fd, error_t err)
{ {
errno = _hurd_fd_error (fd, err); errno = _hurd_fd_error (fd, err);
return -1; return -1;
} }
#endif
/* Likewise, but do not raise SIGPIPE on EPIPE if flags contain /* Likewise, but do not raise SIGPIPE on EPIPE if flags contain
MSG_NOSIGNAL. */ MSG_NOSIGNAL. */
exern int __hurd_sockfail (int fd, int flags, error_t err);
#ifdef __USE_EXTERN_INLINES
_HURD_FD_H_EXTERN_INLINE int _HURD_FD_H_EXTERN_INLINE int
__hurd_sockfail (int fd, int flags, error_t err) __hurd_sockfail (int fd, int flags, error_t err)
{ {
@ -193,6 +214,7 @@ __hurd_sockfail (int fd, int flags, error_t err)
errno = err; errno = err;
return -1; return -1;
} }
#endif
/* Set up *FD to have PORT its server port, doing appropriate ctty magic. /* Set up *FD to have PORT its server port, doing appropriate ctty magic.
Does no locking or unlocking. */ Does no locking or unlocking. */
@ -258,6 +280,8 @@ extern int _hurd_select (int nfds, struct pollfd *pollfds,
/* Apply AT_FLAGS on FLAGS, in preparation for calling /* Apply AT_FLAGS on FLAGS, in preparation for calling
__hurd_file_name_lookup. */ __hurd_file_name_lookup. */
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_FD_H_EXTERN_INLINE error_t _HURD_FD_H_EXTERN_INLINE error_t
__hurd_at_flags (int *at_flags, int *flags) __hurd_at_flags (int *at_flags, int *flags)
{ {
@ -274,6 +298,8 @@ __hurd_at_flags (int *at_flags, int *flags)
return 0; return 0;
} }
# endif
#endif
/* Variant of file_name_lookup used in *at function implementations. /* Variant of file_name_lookup used in *at function implementations.
AT_FLAGS may only contain AT_SYMLINK_FOLLOW or AT_SYMLINK_NOFOLLOW, AT_FLAGS may only contain AT_SYMLINK_FOLLOW or AT_SYMLINK_NOFOLLOW,

View File

@ -60,6 +60,10 @@ struct hurd_port
/* Initialize *PORT to INIT. */ /* Initialize *PORT to INIT. */
extern void _hurd_port_init (struct hurd_port *port, mach_port_t init);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_PORT_H_EXTERN_INLINE void _HURD_PORT_H_EXTERN_INLINE void
_hurd_port_init (struct hurd_port *port, mach_port_t init) _hurd_port_init (struct hurd_port *port, mach_port_t init)
{ {
@ -67,6 +71,8 @@ _hurd_port_init (struct hurd_port *port, mach_port_t init)
port->users = NULL; port->users = NULL;
port->port = init; port->port = init;
} }
# endif
#endif
/* Cleanup function for non-local exits. */ /* Cleanup function for non-local exits. */
@ -75,6 +81,12 @@ extern void _hurd_port_cleanup (void *, jmp_buf, int);
/* Get a reference to *PORT, which is locked. /* Get a reference to *PORT, which is locked.
Pass return value and LINK to _hurd_port_free when done. */ Pass return value and LINK to _hurd_port_free when done. */
extern mach_port_t
_hurd_port_locked_get (struct hurd_port *port,
struct hurd_userlink *link);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_PORT_H_EXTERN_INLINE mach_port_t _HURD_PORT_H_EXTERN_INLINE mach_port_t
_hurd_port_locked_get (struct hurd_port *port, _hurd_port_locked_get (struct hurd_port *port,
struct hurd_userlink *link) struct hurd_userlink *link)
@ -90,9 +102,17 @@ _hurd_port_locked_get (struct hurd_port *port,
__spin_unlock (&port->lock); __spin_unlock (&port->lock);
return result; return result;
} }
# endif
#endif
/* Same, but locks PORT first. */ /* Same, but locks PORT first. */
extern mach_port_t
_hurd_port_get (struct hurd_port *port,
struct hurd_userlink *link);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_PORT_H_EXTERN_INLINE mach_port_t _HURD_PORT_H_EXTERN_INLINE mach_port_t
_hurd_port_get (struct hurd_port *port, _hurd_port_get (struct hurd_port *port,
struct hurd_userlink *link) struct hurd_userlink *link)
@ -104,10 +124,19 @@ _hurd_port_get (struct hurd_port *port,
HURD_CRITICAL_END; HURD_CRITICAL_END;
return result; return result;
} }
# endif
#endif
/* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */ /* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */
extern void
_hurd_port_free (struct hurd_port *port,
struct hurd_userlink *link,
mach_port_t used_port);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_PORT_H_EXTERN_INLINE void _HURD_PORT_H_EXTERN_INLINE void
_hurd_port_free (struct hurd_port *port, _hurd_port_free (struct hurd_port *port,
struct hurd_userlink *link, struct hurd_userlink *link,
@ -127,11 +156,17 @@ _hurd_port_free (struct hurd_port *port,
if (dealloc) if (dealloc)
__mach_port_deallocate (__mach_task_self (), used_port); __mach_port_deallocate (__mach_task_self (), used_port);
} }
# endif
#endif
/* Set *PORT's port to NEWPORT. NEWPORT's reference is consumed by PORT->port. /* Set *PORT's port to NEWPORT. NEWPORT's reference is consumed by PORT->port.
PORT->lock is locked. */ PORT->lock is locked. */
extern void _hurd_port_locked_set (struct hurd_port *port, mach_port_t newport);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_PORT_H_EXTERN_INLINE void _HURD_PORT_H_EXTERN_INLINE void
_hurd_port_locked_set (struct hurd_port *port, mach_port_t newport) _hurd_port_locked_set (struct hurd_port *port, mach_port_t newport)
{ {
@ -142,9 +177,15 @@ _hurd_port_locked_set (struct hurd_port *port, mach_port_t newport)
if (old != MACH_PORT_NULL) if (old != MACH_PORT_NULL)
__mach_port_deallocate (__mach_task_self (), old); __mach_port_deallocate (__mach_task_self (), old);
} }
# endif
#endif
/* Same, but locks PORT first. */ /* Same, but locks PORT first. */
extern void _hurd_port_set (struct hurd_port *port, mach_port_t newport);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_PORT_H_EXTERN_INLINE void _HURD_PORT_H_EXTERN_INLINE void
_hurd_port_set (struct hurd_port *port, mach_port_t newport) _hurd_port_set (struct hurd_port *port, mach_port_t newport)
{ {
@ -153,6 +194,8 @@ _hurd_port_set (struct hurd_port *port, mach_port_t newport)
_hurd_port_locked_set (port, newport); _hurd_port_locked_set (port, newport);
HURD_CRITICAL_END; HURD_CRITICAL_END;
} }
# endif
#endif
#endif /* hurd/port.h */ #endif /* hurd/port.h */

View File

@ -129,6 +129,8 @@ extern struct hurd_sigstate *_hurd_self_sigstate (void)
#define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline #define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline
#endif #endif
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate * _HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate *
_hurd_self_sigstate (void) _hurd_self_sigstate (void)
{ {
@ -138,6 +140,8 @@ _hurd_self_sigstate (void)
*location = _hurd_thread_sigstate (__mach_thread_self ()); *location = _hurd_thread_sigstate (__mach_thread_self ());
return *location; return *location;
} }
# endif
#endif
/* Thread listening on our message port; also called the "signal thread". */ /* Thread listening on our message port; also called the "signal thread". */
@ -164,6 +168,10 @@ extern int _hurd_core_limit;
interrupted lest the signal handler try to take the same lock and interrupted lest the signal handler try to take the same lock and
deadlock result. */ deadlock result. */
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_SIGNAL_H_EXTERN_INLINE void *
_hurd_critical_section_lock (void) _hurd_critical_section_lock (void)
{ {
@ -188,7 +196,13 @@ _hurd_critical_section_lock (void)
_hurd_critical_section_unlock to unlock it. */ _hurd_critical_section_unlock to unlock it. */
return ss; 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_SIGNAL_H_EXTERN_INLINE void
_hurd_critical_section_unlock (void *our_lock) _hurd_critical_section_unlock (void *our_lock)
{ {
@ -211,6 +225,8 @@ _hurd_critical_section_unlock (void *our_lock)
__msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
} }
} }
# endif
#endif
/* Convenient macros for simple uses of critical sections. /* Convenient macros for simple uses of critical sections.
These two must be used as a pair at the same C scoping level. */ These two must be used as a pair at the same C scoping level. */

View File

@ -81,6 +81,9 @@ enum __hurd_threadvar_index
extern unsigned long int *__hurd_threadvar_location_from_sp extern unsigned long int *__hurd_threadvar_location_from_sp
(enum __hurd_threadvar_index __index, void *__sp); (enum __hurd_threadvar_index __index, void *__sp);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_THREADVAR_H_EXTERN_INLINE unsigned long int * _HURD_THREADVAR_H_EXTERN_INLINE unsigned long int *
__hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index, __hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index,
void *__sp) void *__sp)
@ -92,6 +95,8 @@ __hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index,
: (unsigned long int *) ((__stack & __hurd_threadvar_stack_mask) + : (unsigned long int *) ((__stack & __hurd_threadvar_stack_mask) +
__hurd_threadvar_stack_offset))[__index]; __hurd_threadvar_stack_offset))[__index];
} }
# endif
#endif
#include <machine-sp.h> /* Define __thread_stack_pointer. */ #include <machine-sp.h> /* Define __thread_stack_pointer. */
@ -105,12 +110,16 @@ __hurd_threadvar_location (enum __hurd_threadvar_index __index) __THROW
the same stack frame by different threads. */ the same stack frame by different threads. */
__attribute__ ((__const__)); __attribute__ ((__const__));
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_THREADVAR_H_EXTERN_INLINE unsigned long int * _HURD_THREADVAR_H_EXTERN_INLINE unsigned long int *
__hurd_threadvar_location (enum __hurd_threadvar_index __index) __hurd_threadvar_location (enum __hurd_threadvar_index __index)
{ {
return __hurd_threadvar_location_from_sp (__index, return __hurd_threadvar_location_from_sp (__index,
__thread_stack_pointer ()); __thread_stack_pointer ());
} }
# endif
#endif
#endif /* hurd/threadvar.h */ #endif /* hurd/threadvar.h */

View File

@ -76,6 +76,12 @@ struct hurd_userlink
/* Attach LINK to the chain of users at *CHAINP. */ /* Attach LINK to the chain of users at *CHAINP. */
extern void
_hurd_userlink_link (struct hurd_userlink **chainp,
struct hurd_userlink *link);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_USERLINK_H_EXTERN_INLINE void _HURD_USERLINK_H_EXTERN_INLINE void
_hurd_userlink_link (struct hurd_userlink **chainp, _hurd_userlink_link (struct hurd_userlink **chainp,
struct hurd_userlink *link) struct hurd_userlink *link)
@ -96,11 +102,17 @@ _hurd_userlink_link (struct hurd_userlink **chainp,
link->thread.prevp = thread_chainp; link->thread.prevp = thread_chainp;
*thread_chainp = link; *thread_chainp = link;
} }
# endif
#endif
/* Detach LINK from its chain. Returns nonzero iff this was the /* Detach LINK from its chain. Returns nonzero iff this was the
last user of the resource and it should be deallocated. */ last user of the resource and it should be deallocated. */
extern int _hurd_userlink_unlink (struct hurd_userlink *link);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_USERLINK_H_EXTERN_INLINE int _HURD_USERLINK_H_EXTERN_INLINE int
_hurd_userlink_unlink (struct hurd_userlink *link) _hurd_userlink_unlink (struct hurd_userlink *link)
{ {
@ -123,6 +135,8 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
return dealloc; return dealloc;
} }
# endif
#endif
/* Clear all users from *CHAINP. Call this when the resource *CHAINP /* Clear all users from *CHAINP. Call this when the resource *CHAINP
@ -131,6 +145,10 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
value is zero, someone is still using the resource and they will value is zero, someone is still using the resource and they will
deallocate it when they are finished. */ deallocate it when they are finished. */
extern int _hurd_userlink_clear (struct hurd_userlink **chainp);
#if defined __USE_EXTERN_INLINES && defined _LIBC
# if IS_IN (libc)
_HURD_USERLINK_H_EXTERN_INLINE int _HURD_USERLINK_H_EXTERN_INLINE int
_hurd_userlink_clear (struct hurd_userlink **chainp) _hurd_userlink_clear (struct hurd_userlink **chainp)
{ {
@ -143,5 +161,7 @@ _hurd_userlink_clear (struct hurd_userlink **chainp)
*chainp = NULL; *chainp = NULL;
return 0; return 0;
} }
# endif
#endif
#endif /* hurd/userlink.h */ #endif /* hurd/userlink.h */

View File

@ -28,11 +28,15 @@
/* Initialize LOCK. */ /* Initialize LOCK. */
extern void __spin_lock_init (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void _EXTERN_INLINE void
__spin_lock_init (__spin_lock_t *__lock) __spin_lock_init (__spin_lock_t *__lock)
{ {
*__lock = __SPIN_LOCK_INITIALIZER; *__lock = __SPIN_LOCK_INITIALIZER;
} }
#endif
/* Lock LOCK, blocking if we can't get it. */ /* Lock LOCK, blocking if we can't get it. */
@ -40,12 +44,16 @@ extern void __spin_lock_solid (__spin_lock_t *__lock);
/* Lock the spin lock LOCK. */ /* Lock the spin lock LOCK. */
extern void __spin_lock (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void _EXTERN_INLINE void
__spin_lock (__spin_lock_t *__lock) __spin_lock (__spin_lock_t *__lock)
{ {
if (! __spin_try_lock (__lock)) if (! __spin_try_lock (__lock))
__spin_lock_solid (__lock); __spin_lock_solid (__lock);
} }
#endif
/* Name space-clean internal interface to mutex locks. /* Name space-clean internal interface to mutex locks.
@ -70,27 +78,39 @@ extern void __mutex_unlock_solid (void *__lock);
/* Lock the mutex lock LOCK. */ /* Lock the mutex lock LOCK. */
extern void __mutex_lock (void *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void _EXTERN_INLINE void
__mutex_lock (void *__lock) __mutex_lock (void *__lock)
{ {
if (! __spin_try_lock ((__spin_lock_t *) __lock)) if (! __spin_try_lock ((__spin_lock_t *) __lock))
__mutex_lock_solid (__lock); __mutex_lock_solid (__lock);
} }
#endif
/* Unlock the mutex lock LOCK. */ /* Unlock the mutex lock LOCK. */
extern void __mutex_unlock (void *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void _EXTERN_INLINE void
__mutex_unlock (void *__lock) __mutex_unlock (void *__lock)
{ {
__spin_unlock ((__spin_lock_t *) __lock); __spin_unlock ((__spin_lock_t *) __lock);
__mutex_unlock_solid (__lock); __mutex_unlock_solid (__lock);
} }
#endif
extern int __mutex_trylock (void *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int _EXTERN_INLINE int
__mutex_trylock (void *__lock) __mutex_trylock (void *__lock)
{ {
return __spin_try_lock ((__spin_lock_t *) __lock); return __spin_try_lock ((__spin_lock_t *) __lock);
} }
#endif
#endif /* lock-intern.h */ #endif /* lock-intern.h */

View File

@ -66,6 +66,8 @@ extern void mig_reply_setup (const mach_msg_header_t *__request,
/* Idiocy support function. */ /* Idiocy support function. */
extern vm_size_t mig_strncpy (char *__dst, const char *__src, vm_size_t __len); extern vm_size_t mig_strncpy (char *__dst, const char *__src, vm_size_t __len);
extern vm_size_t __mig_strncpy (char *__dst, const char *__src, vm_size_t); extern vm_size_t __mig_strncpy (char *__dst, const char *__src, vm_size_t);
#if defined __USE_EXTERN_INLINES && defined _LIBC
__extern_inline vm_size_t __extern_inline vm_size_t
__mig_strncpy (char *__dst, const char *__src, vm_size_t __len) __mig_strncpy (char *__dst, const char *__src, vm_size_t __len)
{ {
@ -76,6 +78,7 @@ mig_strncpy (char *__dst, const char *__src, vm_size_t __len)
{ {
return __mig_strncpy (__dst, __src, __len); return __mig_strncpy (__dst, __src, __len);
} }
#endif

View File

@ -1,3 +1,4 @@
#define __USE_EXTERN_INLINES 1
#define _EXTERN_INLINE /* Empty to define the real functions. */ #define _EXTERN_INLINE /* Empty to define the real functions. */
#include "spin-lock.h" #include "spin-lock.h"

View File

@ -34,14 +34,21 @@ typedef volatile int __spin_lock_t;
/* Unlock LOCK. */ /* Unlock LOCK. */
extern void __spin_unlock (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void _EXTERN_INLINE void
__spin_unlock (__spin_lock_t *__lock) __spin_unlock (__spin_lock_t *__lock)
{ {
*__lock = 0; *__lock = 0;
} }
#endif
/* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ /* Try to lock LOCK; return nonzero if we locked it, zero if another has. */
extern int __spin_try_lock (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int _EXTERN_INLINE int
__spin_try_lock (__spin_lock_t *__lock) __spin_try_lock (__spin_lock_t *__lock)
{ {
@ -50,14 +57,19 @@ __spin_try_lock (__spin_lock_t *__lock)
*__lock = 1; *__lock = 1;
return 1; return 1;
} }
#endif
/* Return nonzero if LOCK is locked. */ /* Return nonzero if LOCK is locked. */
extern int __spin_lock_locked (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int _EXTERN_INLINE int
__spin_lock_locked (__spin_lock_t *__lock) __spin_lock_locked (__spin_lock_t *__lock)
{ {
return *__lock != 0; return *__lock != 0;
} }
#endif
#endif /* machine-lock.h */ #endif /* machine-lock.h */

View File

@ -34,6 +34,9 @@ typedef volatile int __spin_lock_t;
/* Unlock LOCK. */ /* Unlock LOCK. */
extern void __spin_unlock (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE void _EXTERN_INLINE void
__spin_unlock (__spin_lock_t *__lock) __spin_unlock (__spin_lock_t *__lock)
{ {
@ -42,9 +45,13 @@ __spin_unlock (__spin_lock_t *__lock)
: "=&r" (__unlocked), "=m" (*__lock) : "0" (0) : "=&r" (__unlocked), "=m" (*__lock) : "0" (0)
: "memory"); : "memory");
} }
#endif
/* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ /* Try to lock LOCK; return nonzero if we locked it, zero if another has. */
extern int __spin_try_lock (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int _EXTERN_INLINE int
__spin_try_lock (__spin_lock_t *__lock) __spin_try_lock (__spin_lock_t *__lock)
{ {
@ -54,14 +61,19 @@ __spin_try_lock (__spin_lock_t *__lock)
: "memory"); : "memory");
return !__locked; return !__locked;
} }
#endif
/* Return nonzero if LOCK is locked. */ /* Return nonzero if LOCK is locked. */
extern int __spin_lock_locked (__spin_lock_t *__lock);
#if defined __USE_EXTERN_INLINES && defined _LIBC
_EXTERN_INLINE int _EXTERN_INLINE int
__spin_lock_locked (__spin_lock_t *__lock) __spin_lock_locked (__spin_lock_t *__lock)
{ {
return *__lock != 0; return *__lock != 0;
} }
#endif
#endif /* machine-lock.h */ #endif /* machine-lock.h */