Eggsalad
Eggsalad

Reputation: 383

How to set realtime thread in Swift?

I'm trying to implement the set_realtime() function from this OSX scheduling guide in Swift.

I'm stuck on thread_policy_set(). The following causes this compiler error:

"Cannot specialize a non-generic definition"

I've also tried a couple other things but get various type mismatch errors with &policy. Any suggestions would be greatly appreciated! Thanks!

func set_realtime(period: UInt32, computation: UInt32, constraint: UInt32) -> Bool {
    let TIME_CONSTRAINT_POLICY: UInt32 = 2
    let TIME_CONSTRAINT_POLICY_COUNT = UInt32(MemoryLayout<thread_time_constraint_policy_data_t>.size / MemoryLayout<integer_t>.size)
    let SUCCESS: Int32 = 0
    var policy: thread_time_constraint_policy
    var ret: Int32
    let thread: thread_port_t = pthread_mach_thread_np(pthread_self())

    policy.period = period
    policy.computation = computation
    policy.constraint = constraint
    policy.preemptible = 1

    ret = withUnsafeMutablePointer<integer_t>(to: &policy, { ptr -> Int32 in
        thread_policy_set(thread, TIME_CONSTRAINT_POLICY, ptr, TIME_CONSTRAINT_POLICY_COUNT)
    })

    if ret != SUCCESS {
        print(stderr, "set_realtime() failed.\n")
        return false
    }
    return true
}

Upvotes: 6

Views: 881

Answers (1)

Martin R
Martin R

Reputation: 540105

You cannot add a type placeholder to withUnsafeMutablePointer() to cast the pointer to a different type. You have to "rebind" the pointer instead:

ret = withUnsafeMutablePointer(to: &policy) {
    $0.withMemoryRebound(to: integer_t.self, capacity: Int(TIME_CONSTRAINT_POLICY_COUNT)) {
        thread_policy_set(thread, TIME_CONSTRAINT_POLICY, $0, TIME_CONSTRAINT_POLICY_COUNT)
    }
}

Upvotes: 3

Related Questions