[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
- [PATCH 12/23] pflocal: add a payload-aware intrans functions, (continued)
- [PATCH 12/23] pflocal: add a payload-aware intrans functions, Justus Winter, 2013/11/28
- [PATCH 14/23] trans: add a payload-aware intrans function to password, Justus Winter, 2013/11/28
- [PATCH 15/23] proc: add a payload-aware intrans function, Justus Winter, 2013/11/28
- [PATCH 17/23] trans: disable default payload to port mapping in fsysServer.c, Justus Winter, 2013/11/28
- [PATCH 16/23] init: disable default payload to port mapping, Justus Winter, 2013/11/28
- [PATCH 18/23] libports: add ports_payload_get_name, Justus Winter, 2013/11/28
- [PATCH 19/23] hurd: add intranpayload functions to all hurd types, Justus Winter, 2013/11/28
- [PATCH 22/23] Fix build, Justus Winter, 2013/11/28
- [PATCH 23/23] XXX i broke rpctrace, Justus Winter, 2013/11/28
- [PATCH 21/23] XXX libports: clear payload prior to port destruction, Justus Winter, 2013/11/28
- [PATCH 20/23] libports: use protected payloads to optimize the object lookup,
Justus Winter <=