about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--mach/mach/mach_traps.h7
-rw-r--r--mach/mach_init.c2
-rw-r--r--mach/mach_init.h5
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c1
5 files changed, 28 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 32ec6f97c1..e9cc796862 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2015-09-16  Justus Winter  <4winter@informatik.uni-hamburg.de>
+
+	Cache the host port like we cache the task port.  This way we do not
+	need to call the kernel just to get the port.  Furthermore, we no
+	longer increase the reference count on every invocation of
+	`mach_host_self'.
+
+	* mach/mach/mach_traps.h (__mach_host_self, mach_host_self):
+	Protect declarations against the macro expansion.
+	* mach/mach_init.c (__mach_host_self_): New variable.
+	(mach_init): Initialize `__mach_host_self_'.
+	* mach/mach_init.h (__mach_host_self_): New declaration.
+	(__mach_host_self, mach_host_self): New macros.
+	* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start_cleanup):
+	Release reference.
+
 2015-09-16  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #4404]
diff --git a/mach/mach/mach_traps.h b/mach/mach/mach_traps.h
index 53ec21e2d2..c778caa685 100644
--- a/mach/mach/mach_traps.h
+++ b/mach/mach/mach_traps.h
@@ -41,9 +41,10 @@ extern mach_port_t __mach_thread_self (void);
 extern mach_port_t (mach_task_self) (void);
 extern mach_port_t (__mach_task_self) (void);
 
-/* Return the host information port for the host of the calling task.  */
-extern mach_port_t mach_host_self (void);
-extern mach_port_t __mach_host_self (void);
+/* Return the host information port for the host of the calling task.
+   The parens are needed to protect against the macro in <mach_init.h>.  */
+extern mach_port_t (mach_host_self) (void);
+extern mach_port_t (__mach_host_self) (void);
 
 /* Attempt to context switch the current thread off the processor.  Returns
    true if there are other threads that can be run and false if not.  */
diff --git a/mach/mach_init.c b/mach/mach_init.c
index cf8ac3bb31..8acb71f7e9 100644
--- a/mach/mach_init.c
+++ b/mach/mach_init.c
@@ -20,6 +20,7 @@
 #include <unistd.h>
 
 mach_port_t __mach_task_self_;
+mach_port_t __mach_host_self_;
 vm_size_t __vm_page_size = 0;	/* Must be data not bss for weak alias.  */
 weak_alias (__vm_page_size, vm_page_size)
 
@@ -34,6 +35,7 @@ __mach_init (void)
   kern_return_t err;
 
   __mach_task_self_ = (__mach_task_self) ();
+  __mach_host_self_ = (__mach_host_self) ();
   __mig_init (0);
 
 #ifdef HAVE_HOST_PAGE_SIZE
diff --git a/mach/mach_init.h b/mach/mach_init.h
index 44a7ce2c50..26b2639fd8 100644
--- a/mach/mach_init.h
+++ b/mach/mach_init.h
@@ -31,6 +31,11 @@ extern mach_port_t __mach_task_self_;
 #define __mach_task_self()	(__mach_task_self_ + 0)	/* Not an lvalue.  */
 #define mach_task_self()	(__mach_task_self ())
 
+/* This cache is initialized at startup.  */
+extern mach_port_t __mach_host_self_;
+#define __mach_host_self()	(__mach_host_self_ + 0)	/* Not an lvalue.  */
+#define mach_host_self()	(__mach_host_self ())
+
 /* Kernel page size.  */
 extern vm_size_t __vm_page_size;
 extern vm_size_t vm_page_size;
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 8bb9fad090..317605b425 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -279,6 +279,7 @@ _dl_sysdep_start_cleanup (void)
      __mach_init.  We are done with them now, and the user will
      reacquire them for himself when he wants them.  */
   __mig_dealloc_reply_port (MACH_PORT_NULL);
+  __mach_port_deallocate (__mach_task_self (), __mach_host_self_);
   __mach_port_deallocate (__mach_task_self (), __mach_task_self_);
 }