]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/mk_timer.c
xnu-3789.51.2.tar.gz
[apple/xnu.git] / osfmk / kern / mk_timer.c
index fdb6174dd2487769b40b3dec1149e7316494bdf2..7ca764dac6a03e950a4bdc7fdc78b553e628bc96 100644 (file)
@@ -167,10 +167,12 @@ mk_timer_expire(
                timer->is_armed = FALSE;
                simple_unlock(&timer->lock);
 
-               msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
+               msg.header.msgh_bits =
+                   MACH_MSGH_BITS_SET(MACH_MSG_TYPE_COPY_SEND, 0, 0, 0);
                msg.header.msgh_remote_port = port;
                msg.header.msgh_local_port = MACH_PORT_NULL;
-               msg.header.msgh_reserved = msg.header.msgh_id = 0;
+               msg.header.msgh_voucher_port = MACH_PORT_NULL;
+               msg.header.msgh_id = 0;
 
                msg.unused[0] = msg.unused[1] = msg.unused[2] = 0;
 
@@ -240,12 +242,9 @@ mk_timer_destroy_trap(
  *                !0                      Not success           
  *
  */
-kern_return_t
-mk_timer_arm_trap(
-       struct mk_timer_arm_trap_args *args)
-{
-       mach_port_name_t                name = args->name;
-       uint64_t                        expire_time = args->expire_time;
+
+static kern_return_t
+mk_timer_arm_trap_internal(mach_port_name_t name, uint64_t expire_time, uint64_t mk_leeway, uint64_t mk_timer_flags) {
        mk_timer_t                      timer;
        ipc_space_t                     myspace = current_space();
        ipc_port_t                      port;
@@ -267,26 +266,46 @@ mk_timer_arm_trap(
                        timer->is_armed = TRUE;
 
                        if (expire_time > mach_absolute_time()) {
-                               if (!thread_call_enter_delayed_with_leeway(&timer->call_entry, NULL,
-                                                                          expire_time, 0, THREAD_CALL_DELAY_USER_NORMAL))
+                               uint32_t tcflags = THREAD_CALL_DELAY_USER_NORMAL;
+
+                               if (mk_timer_flags & MK_TIMER_CRITICAL) {
+                                       tcflags = THREAD_CALL_DELAY_USER_CRITICAL;
+                               }
+
+                               if (mk_leeway != 0) {
+                                       tcflags |= THREAD_CALL_DELAY_LEEWAY;
+                               }
+
+                               if (!thread_call_enter_delayed_with_leeway(
+                                       &timer->call_entry, NULL,
+                                       expire_time, mk_leeway, tcflags)) {
+
                                        timer->active++;
-                       }
-                       else {
+                               }
+                       else {
                                if (!thread_call_enter1(&timer->call_entry, NULL))
                                        timer->active++;
                        }
                }
 
                simple_unlock(&timer->lock);
-       }
-       else {
+       } else {
                ip_unlock(port);
                result = KERN_INVALID_ARGUMENT;
        }
-
        return (result);
 }
 
+kern_return_t
+mk_timer_arm_trap(struct mk_timer_arm_trap_args *args) {
+       return mk_timer_arm_trap_internal(args->name, args->expire_time, 0, MK_TIMER_NORMAL);
+}
+
+kern_return_t
+mk_timer_arm_leeway_trap(struct mk_timer_arm_leeway_trap_args *args) {
+       return mk_timer_arm_trap_internal(args->name, args->expire_time, args->mk_leeway, args->mk_timer_flags);
+}
+
 /*
  * mk_timer_cancel_trap: Cancel a timer
  *