+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]
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. */
#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)
kern_return_t err;
__mach_task_self_ = (__mach_task_self) ();
+ __mach_host_self_ = (__mach_host_self) ();
__mig_init (0);
#ifdef HAVE_HOST_PAGE_SIZE
#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;
__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_);
}
\f