diff options
Diffstat (limited to 'sysdeps/mach/hurd/mig-reply.c')
-rw-r--r-- | sysdeps/mach/hurd/mig-reply.c | 45 |
1 files changed, 15 insertions, 30 deletions
diff --git a/sysdeps/mach/hurd/mig-reply.c b/sysdeps/mach/hurd/mig-reply.c index 5471cf220d..8350354500 100644 --- a/sysdeps/mach/hurd/mig-reply.c +++ b/sysdeps/mach/hurd/mig-reply.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994-2016 Free Software Foundation, Inc. +/* Copyright (C) 1994-2018 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 @@ -16,47 +16,40 @@ <http://www.gnu.org/licenses/>. */ #include <mach.h> +#include <mach/mig_support.h> #include <hurd/threadvar.h> -#define GETPORT \ - mach_port_t *portloc = \ - (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY) -#define reply_port (*(use_threadvar ? portloc : &global_reply_port)) - -static int use_threadvar; -static mach_port_t global_reply_port; - /* These functions are called by MiG-generated code. */ +mach_port_t __hurd_reply_port0; + /* Called by MiG to get a reply port. */ mach_port_t __mig_get_reply_port (void) { - GETPORT; - - if (reply_port == MACH_PORT_NULL) - reply_port = __mach_reply_port (); + if (__hurd_local_reply_port == MACH_PORT_NULL || + (&__hurd_local_reply_port != &__hurd_reply_port0 + && __hurd_local_reply_port == __hurd_reply_port0)) + __hurd_local_reply_port = __mach_reply_port (); - return reply_port; + return __hurd_local_reply_port; } weak_alias (__mig_get_reply_port, mig_get_reply_port) +libc_hidden_def (__mig_get_reply_port) /* Called by MiG to deallocate the reply port. */ void __mig_dealloc_reply_port (mach_port_t arg) { - mach_port_t port; - - GETPORT; - - port = reply_port; - reply_port = MACH_PORT_NULL; /* So the mod_refs RPC won't use it. */ + mach_port_t port = __hurd_local_reply_port; + __hurd_local_reply_port = MACH_PORT_NULL; /* So the mod_refs RPC won't use it. */ if (MACH_PORT_VALID (port)) __mach_port_mod_refs (__mach_task_self (), port, MACH_PORT_RIGHT_RECEIVE, -1); } weak_alias (__mig_dealloc_reply_port, mig_dealloc_reply_port) +libc_hidden_def (__mig_dealloc_reply_port) /* Called by mig interfaces when done with a port. Used to provide the same interface as needed when a custom allocator is used. */ @@ -73,15 +66,7 @@ weak_alias (__mig_put_reply_port, mig_put_reply_port) void __mig_init (void *stack) { - use_threadvar = stack != 0; - - if (use_threadvar) - { - /* Recycle the reply port used before multithreading was enabled. */ - mach_port_t *portloc = (mach_port_t *) - __hurd_threadvar_location_from_sp (_HURD_THREADVAR_MIG_REPLY, stack); - *portloc = global_reply_port; - global_reply_port = MACH_PORT_NULL; - } + /* Do nothing. */ } weak_alias (__mig_init, mig_init) +libc_hidden_def (__mig_init) |