* 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