summaryrefslogtreecommitdiff
path: root/libports/ports.h
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2013-11-23 16:12:55 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-04-07 14:23:36 +0200
commit4241dd5673566a61add85bd9eb52d4ae7db2750a (patch)
tree0c7ce8514067068a877d8181544c2870af1dac7d /libports/ports.h
parent785f4aea18b5705e63609001d2aa12871a774804 (diff)
libports: use protected payloads to optimize the object lookup
* NEWS: Mention protected payloads. * libports/Makefile (SRCS): Add `port-deref-deferred.c'. * 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 for the object lookup if provided. Add thread pool management calls. * libports/manage-one-thread.c (ports_manage_port_operations_one_thread): Likewise. * libports/destroy-right.c (ports_destroy_right): Defer the dereferencing of outstanding send rights to avoid a port_info use-after-free. * libports/port-deref-deferred.c: New file. * libports/port-deref-deferred.h: Likewise. * libports/ports.h (struct port_bucket): New field `threadpool'. (ports_lookup_payload): Check `port_right'.
Diffstat (limited to 'libports/ports.h')
-rw-r--r--libports/ports.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/libports/ports.h b/libports/ports.h
index f02edb42..9299bc40 100644
--- a/libports/ports.h
+++ b/libports/ports.h
@@ -29,6 +29,8 @@
#include <pthread.h>
#include <refcount.h>
+#include "port-deref-deferred.h"
+
#ifdef PORTS_DEFINE_EI
#define PORTS_EI
#else
@@ -73,6 +75,7 @@ struct port_bucket
int rpcs;
int flags;
int count;
+ struct ports_threadpool threadpool;
};
/* FLAGS above are the following: */
#define PORT_BUCKET_INHIBITED PORTS_INHIBITED
@@ -262,6 +265,9 @@ ports_lookup_payload (struct port_bucket *bucket,
{
struct port_info *pi = (struct port_info *) payload;
+ if (pi && ! MACH_PORT_VALID (pi->port_right))
+ pi = NULL;
+
if (pi && bucket && pi->bucket != bucket)
pi = NULL;