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 [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 . */ +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 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_); }