bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 20/23] libports: use protected payloads to optimize the object lo


From: Justus Winter
Subject: [PATCH 20/23] libports: use protected payloads to optimize the object lookup
Date: Fri, 29 Nov 2013 01:03:48 +0100

* libports/create-internal.c (_ports_create_port_internal): Set the
  protected payload to the objects address.
* libports/import-port.c (ports_import_port): Likewise.
* libports/reallocate-from-external.c (ports_reallocate_from_external):
  Likewise.
* libports/reallocate-port.c (ports_reallocate_port): Likewise.
* libports/transfer-right.c (ports_transfer_right): Likewise.
* libports/manage-multithread.c (ports_manage_port_operations_multithread):
  Use the protected payload as the objects address if provided.
* libports/manage-one-thread.c (ports_manage_port_operations_one_thread):
  Likewise.
---
 libports/create-internal.c          |    3 +++
 libports/import-port.c              |    3 +++
 libports/manage-multithread.c       |   22 +++++++++++++++++++++-
 libports/manage-one-thread.c        |   22 +++++++++++++++++++++-
 libports/reallocate-from-external.c |    2 ++
 libports/reallocate-port.c          |    2 ++
 libports/transfer-right.c           |    4 ++++
 7 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/libports/create-internal.c b/libports/create-internal.c
index 8551297..c391adc 100644
--- a/libports/create-internal.c
+++ b/libports/create-internal.c
@@ -85,6 +85,9 @@ _ports_create_port_internal (struct port_class *class,
   if (err)
     goto lose;
 
+  /* This is an optimization.  It may fail.  */
+  mach_port_set_protected_payload (mach_task_self (), port, pi);
+
   pi->next = class->ports;
   pi->prevp = &class->ports;
   if (class->ports)
diff --git a/libports/import-port.c b/libports/import-port.c
index 226f47e..79072db 100644
--- a/libports/import-port.c
+++ b/libports/import-port.c
@@ -79,6 +79,9 @@ ports_import_port (struct port_class *class, struct 
port_bucket *bucket,
   if (err)
     goto lose;
 
+  /* This is an optimization.  It may fail.  */
+  mach_port_set_protected_payload (mach_task_self (), port, pi);
+
   pi->next = class->ports;
   pi->prevp = &class->ports;
   if (class->ports)
diff --git a/libports/manage-multithread.c b/libports/manage-multithread.c
index be08030..2019806 100644
--- a/libports/manage-multithread.c
+++ b/libports/manage-multithread.c
@@ -160,7 +160,27 @@ ports_manage_port_operations_multithread (struct 
port_bucket *bucket,
       outp->RetCodeType = RetCodeType;
       outp->RetCode = MIG_BAD_ID;
 
-      pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
+      if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) ==
+         MACH_MSG_TYPE_PROTECTED_PAYLOAD)
+       {
+         pi = (struct port_info *) inp->msgh_protected_payload;
+         if (pi && pi->bucket == bucket)
+           ports_port_ref (pi);
+         else
+           pi = NULL;
+       }
+      else
+       {
+         pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
+         if (pi)
+           {
+             inp->msgh_bits = MACH_MSGH_BITS (
+               MACH_MSGH_BITS_REMOTE (inp->msgh_bits),
+               MACH_MSG_TYPE_PROTECTED_PAYLOAD);
+             inp->msgh_protected_payload = (unsigned long) pi;
+           }
+       }
+
       if (pi)
        {
          error_t err = ports_begin_rpc (pi, inp->msgh_id, &link);
diff --git a/libports/manage-one-thread.c b/libports/manage-one-thread.c
index 4ea740b..3f5880d 100644
--- a/libports/manage-one-thread.c
+++ b/libports/manage-one-thread.c
@@ -57,7 +57,27 @@ ports_manage_port_operations_one_thread (struct port_bucket 
*bucket,
       outp->RetCodeType = RetCodeType;
       outp->RetCode = MIG_BAD_ID;
 
-      pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
+      if (MACH_MSGH_BITS_LOCAL (inp->msgh_bits) ==
+         MACH_MSG_TYPE_PROTECTED_PAYLOAD)
+       {
+         pi = (struct port_info *) inp->msgh_protected_payload;
+         if (pi && pi->bucket == bucket)
+           ports_port_ref (pi);
+         else
+           pi = NULL;
+       }
+      else
+       {
+         pi = ports_lookup_port (bucket, inp->msgh_local_port, 0);
+         if (pi)
+           {
+             inp->msgh_bits = MACH_MSGH_BITS (
+               MACH_MSGH_BITS_REMOTE (inp->msgh_bits),
+               MACH_MSG_TYPE_PROTECTED_PAYLOAD);
+             inp->msgh_protected_payload = (unsigned long) pi;
+           }
+       }
+
       if (pi)
        {
          err = ports_begin_rpc (pi, inp->msgh_id, &link);
diff --git a/libports/reallocate-from-external.c 
b/libports/reallocate-from-external.c
index 8cccb2a..a07904b 100644
--- a/libports/reallocate-from-external.c
+++ b/libports/reallocate-from-external.c
@@ -62,6 +62,8 @@ ports_reallocate_from_external (void *portstruct, mach_port_t 
receive)
   
   err = hurd_ihash_add (&pi->bucket->htable, receive, pi);
   assert_perror (err);
+  /* This is an optimization.  It may fail.  */
+  mach_port_set_protected_payload (mach_task_self (), pi->port_right, pi);
   pthread_mutex_unlock (&_ports_lock);
   
   mach_port_move_member (mach_task_self (), receive, pi->bucket->portset);
diff --git a/libports/reallocate-port.c b/libports/reallocate-port.c
index d2adaeb..7843dbd 100644
--- a/libports/reallocate-port.c
+++ b/libports/reallocate-port.c
@@ -50,6 +50,8 @@ ports_reallocate_port (void *portstruct)
   pi->mscount = 0;
   err = hurd_ihash_add (&pi->bucket->htable, pi->port_right, pi);
   assert_perror (err);
+  /* This is an optimization.  It may fail.  */
+  err = mach_port_set_protected_payload (mach_task_self (), pi->port_right, 
pi);
   pthread_mutex_unlock (&_ports_lock);
 
   err = mach_port_move_member (mach_task_self (), pi->port_right, 
diff --git a/libports/transfer-right.c b/libports/transfer-right.c
index 72488a9..e62a25f 100644
--- a/libports/transfer-right.c
+++ b/libports/transfer-right.c
@@ -79,6 +79,10 @@ ports_transfer_right (void *tostruct,
     {
       err = hurd_ihash_add (&topi->bucket->htable, port, topi);
       assert_perror (err);
+      /* This is an optimization.  It may fail.  */
+      /* XXX otoh, if this once succeeded, we do want to update this
+        and fail otherwise */
+      mach_port_set_protected_payload (mach_task_self (), port, topi);
       if (topi->bucket != frompi->bucket)
         {
          err = mach_port_move_member (mach_task_self (), port,
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]