diff options
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/ipc_object.h | 1 | ||||
-rw-r--r-- | ipc/ipc_port.c | 25 | ||||
-rw-r--r-- | ipc/ipc_port.h | 1 | ||||
-rw-r--r-- | ipc/ipc_right.c | 2 | ||||
-rw-r--r-- | ipc/ipc_space.h | 12 |
5 files changed, 39 insertions, 2 deletions
diff --git a/ipc/ipc_object.h b/ipc/ipc_object.h index 8504a23..e43c7d2 100644 --- a/ipc/ipc_object.h +++ b/ipc/ipc_object.h @@ -89,6 +89,7 @@ extern struct kmem_cache ipc_object_caches[IOT_NUMBER]; #define io_lock(io) lock_write(&(io)->io_lock_data) #define io_lock_try(io) lock_try_write(&(io)->io_lock_data) #define io_unlock(io) lock_write_done(&(io)->io_lock_data) +#define have_io_lock(io) have_write_lock(&(io)->io_lock_data) #define io_check_unlock(io) \ MACRO_BEGIN \ diff --git a/ipc/ipc_port.c b/ipc/ipc_port.c index 86a4ee2..3aa6ce6 100644 --- a/ipc/ipc_port.c +++ b/ipc/ipc_port.c @@ -103,6 +103,7 @@ ipc_port_dnrequest( ipc_port_request_t ipr, table; ipc_port_request_index_t index; + assert(have_ip_lock(port)); assert(ip_active(port)); assert(name != MACH_PORT_NULL); assert(soright != IP_NULL); @@ -147,6 +148,7 @@ ipc_port_dngrow(ipc_port_t port) ipc_table_size_t its; ipc_port_request_t otable, ntable; + assert(have_ip_lock(port)); assert(ip_active(port)); otable = port->ip_dnrequests; @@ -240,6 +242,7 @@ ipc_port_dncancel( ipc_port_request_t ipr, table; ipc_port_t dnrequest; + assert(have_ip_lock(port)); assert(ip_active(port)); assert(name != MACH_PORT_NULL); assert(index != 0); @@ -280,6 +283,7 @@ ipc_port_pdrequest( { ipc_port_t previous; + assert(have_ip_lock(port)); assert(ip_active(port)); previous = port->ip_pdrequest; @@ -311,6 +315,7 @@ ipc_port_nsrequest( ipc_port_t previous; mach_port_mscount_t mscount; + assert(have_ip_lock(port)); assert(ip_active(port)); previous = port->ip_nsrequest; @@ -344,6 +349,7 @@ ipc_port_set_qlimit( ipc_port_t port, mach_port_msgcount_t qlimit) { + assert(have_ip_lock(port)); assert(ip_active(port)); /* wake up senders allowed by the new qlimit */ @@ -383,6 +389,9 @@ ipc_port_set_qlimit( ipc_mqueue_t ipc_port_lock_mqueue(ipc_port_t port) { + assert(have_ip_lock(port)); + assert(ip_active(port)); + if (port->ip_pset != IPS_NULL) { ipc_pset_t pset = port->ip_pset; @@ -417,6 +426,9 @@ ipc_port_set_seqno( { ipc_mqueue_t mqueue; + assert(have_ip_lock(port)); + assert(ip_active(port)); + mqueue = ipc_port_lock_mqueue(port); port->ip_seqno = seqno; imq_unlock(mqueue); @@ -435,6 +447,9 @@ ipc_port_set_protected_payload(ipc_port_t port, unsigned long payload) { ipc_mqueue_t mqueue; + assert(have_ip_lock(port)); + assert(ip_active(port)); + mqueue = ipc_port_lock_mqueue(port); port->ip_protected_payload = payload; ipc_port_flag_protected_payload_set(port); @@ -454,6 +469,9 @@ ipc_port_clear_protected_payload(ipc_port_t port) { ipc_mqueue_t mqueue; + assert(have_ip_lock(port)); + assert(ip_active(port)); + mqueue = ipc_port_lock_mqueue(port); ipc_port_flag_protected_payload_clear(port); imq_unlock(mqueue); @@ -474,6 +492,7 @@ ipc_port_clear_receiver( { ipc_pset_t pset; + assert(have_ip_lock(port)); assert(ip_active(port)); pset = port->ip_pset; @@ -566,7 +585,7 @@ ipc_port_alloc( if (kr != KERN_SUCCESS) return kr; - /* port is locked */ + assert(have_ip_lock(port)); /* port is locked */ ipc_port_init(port, space, name); @@ -604,7 +623,7 @@ ipc_port_alloc_name( name, (ipc_object_t *) &port); if (kr != KERN_SUCCESS) return kr; - /* port is locked */ + assert(have_ip_lock(port)); /* port is locked */ ipc_port_init(port, space, name); @@ -636,6 +655,7 @@ ipc_port_destroy( ipc_thread_t sender; ipc_port_request_t dnrequests; + assert(have_ip_lock(port)); assert(ip_active(port)); /* port->ip_receiver_name is garbage */ /* port->ip_receiver/port->ip_destination is garbage */ @@ -916,6 +936,7 @@ ipc_port_lookup_notify( ipc_port_t port; ipc_entry_t entry; + assert(have_is_lock(space)); assert(space->is_active); entry = ipc_entry_lookup(space, name); diff --git a/ipc/ipc_port.h b/ipc/ipc_port.h index ade6967..7390950 100644 --- a/ipc/ipc_port.h +++ b/ipc/ipc_port.h @@ -119,6 +119,7 @@ struct ipc_port { #define ip_lock(port) io_lock(&(port)->ip_object) #define ip_lock_try(port) io_lock_try(&(port)->ip_object) #define ip_unlock(port) io_unlock(&(port)->ip_object) +#define have_ip_lock(port) have_io_lock(&(port)->ip_object) #define ip_check_unlock(port) io_check_unlock(&(port)->ip_object) #define ip_reference(port) io_reference(&(port)->ip_object) #define ip_release(port) io_release(&(port)->ip_object) diff --git a/ipc/ipc_right.c b/ipc/ipc_right.c index 773b3b1..2e73cc3 100644 --- a/ipc/ipc_right.c +++ b/ipc/ipc_right.c @@ -114,6 +114,7 @@ ipc_right_reverse( /* would switch on io_otype to handle multiple types of object */ + assert(have_is_lock(space)); assert(space->is_active); assert(io_otype(object) == IOT_PORT); @@ -311,6 +312,7 @@ ipc_right_dncancel( { ipc_port_t dnrequest; + assert(have_is_write_lock(space)); assert(ip_active(port)); assert(port == (ipc_port_t) entry->ie_object); diff --git a/ipc/ipc_space.h b/ipc/ipc_space.h index a2aac40..fcc36b0 100644 --- a/ipc/ipc_space.h +++ b/ipc/ipc_space.h @@ -118,6 +118,10 @@ MACRO_END #define is_write_to_read_lock(is) lock_write_to_read(&(is)->is_lock_data) +#define have_is_lock(is) have_lock(&(is)->is_lock_data) +#define have_is_read_lock(is) have_read_lock(&(is)->is_lock_data) +#define have_is_write_lock(is) have_write_lock(&(is)->is_lock_data) + extern void ipc_space_reference(struct ipc_space *space); extern void ipc_space_release(struct ipc_space *space); @@ -147,6 +151,8 @@ ipc_entry_lookup( ipc_entry_t entry; assert(space->is_active); + assert(have_is_lock(space)); + entry = rdxtree_lookup(&space->is_map, (rdxtree_key_t) name); if (entry != IE_NULL && IE_BITS_TYPE(entry->ie_bits) == MACH_PORT_TYPE_NONE) @@ -177,6 +183,7 @@ ipc_entry_get( ipc_entry_t free_entry; assert(space->is_active); + assert(have_is_write_lock(space)); /* Get entry from the free list. */ free_entry = space->is_free_list; @@ -233,6 +240,7 @@ ipc_entry_dealloc( ipc_entry_t entry) { assert(space->is_active); + assert(have_is_write_lock(space)); assert(entry->ie_object == IO_NULL); assert(entry->ie_request == 0); @@ -267,6 +275,7 @@ ipc_reverse_insert(ipc_space_t space, { assert(space != IS_NULL); assert(obj != IO_NULL); + assert(have_is_write_lock(space)); return (kern_return_t) rdxtree_insert(&space->is_reverse_map, KEY(obj), entry); } @@ -279,6 +288,7 @@ ipc_reverse_remove(ipc_space_t space, { assert(space != IS_NULL); assert(obj != IO_NULL); + assert(have_is_write_lock(space)); return rdxtree_remove(&space->is_reverse_map, KEY(obj)); } @@ -288,6 +298,7 @@ static inline void ipc_reverse_remove_all(ipc_space_t space) { assert(space != IS_NULL); + assert(have_is_write_lock(space)); rdxtree_remove_all(&space->is_reverse_map); assert(space->is_reverse_map.height == 0); assert(space->is_reverse_map.root == NULL); @@ -302,6 +313,7 @@ ipc_reverse_lookup(ipc_space_t space, { assert(space != IS_NULL); assert(obj != IO_NULL); + assert(have_is_lock(space)); return rdxtree_lookup(&space->is_reverse_map, KEY(obj)); } |