]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/atm/atm.c
xnu-4903.221.2.tar.gz
[apple/xnu.git] / osfmk / atm / atm.c
index 707a5be66e830fcd5e39dd46714b8a6fbfe3837d..fcf59e3d3ba88856fe70a599474e5bc79c8ce600 100644 (file)
@@ -68,11 +68,11 @@ queue_head_t atm_values_list;
 ipc_voucher_attr_control_t  voucher_attr_control;    /* communication channel from ATM to voucher system */
 static zone_t atm_value_zone, atm_descriptors_zone, atm_link_objects_zone;
 
-static aid_t get_aid();
-static mach_atm_subaid_t get_subaid();
+static aid_t get_aid(void);
+static mach_atm_subaid_t get_subaid(void);
 static atm_value_t atm_value_alloc_init(aid_t);
 static void atm_value_dealloc(atm_value_t atm_value);
-static void atm_hash_table_init();
+static void atm_hash_table_init(void);
 static kern_return_t atm_value_hash_table_insert(atm_value_t new_atm_value);
 static void atm_value_hash_table_delete(atm_value_t atm_value);
 static atm_value_t get_atm_value_from_aid(aid_t aid) __unused;
@@ -725,15 +725,18 @@ atm_send_user_notification(
                return KERN_FAILURE;
        }
 
-       /* Set the honor queue limit option on the thread. */
-       th->options |= TH_OPT_HONOR_QLIMIT;
+       thread_set_honor_qlimit(th);
        kr = atm_collect_trace_info(user_port, aid, sub_aid, flags, buffers_array, count, sizes_array, count);
-       /* Make sure that honor queue limit option is unset on the thread. */
-       th->options &= (~TH_OPT_HONOR_QLIMIT);
+       thread_clear_honor_qlimit(th);
 
-       if (kr == MACH_SEND_TIMED_OUT) {
-               kr = KERN_SUCCESS;
+       if (kr != KERN_SUCCESS) {
+               ipc_port_release_send(user_port);
+
+               if (kr == MACH_SEND_TIMED_OUT) {
+                       kr = KERN_SUCCESS;
+               }
        }
+
        return kr;
 }
 
@@ -788,14 +791,16 @@ atm_send_proc_inspect_notification(
                return KERN_FAILURE;
        }
 
-       /* Set the honor queue limit option on the thread. */
-       th->options |= TH_OPT_HONOR_QLIMIT;
+       thread_set_honor_qlimit(th);
        kr =  atm_inspect_process_buffer(user_port, traced_pid, traced_uniqueid, buffer_size, memory_port);
-       /* Make sure that honor queue limit option is unset on the thread. */
-       th->options &= (~TH_OPT_HONOR_QLIMIT);
+       thread_clear_honor_qlimit(th);
 
-       if (kr == MACH_SEND_TIMED_OUT) {
-               kr = KERN_SUCCESS;
+       if (kr != KERN_SUCCESS) {
+               ipc_port_release_send(user_port);
+
+               if (kr == MACH_SEND_TIMED_OUT) {
+                       kr = KERN_SUCCESS;
+               }
        }
 
        ipc_port_release_send(memory_port);