1 /*
2  *  testthreadcall.cpp
3  *  testkext
4  *
5  */
6 
7 #include "testthreadcall.h"
8 
9 #include <kern/thread_call.h>
10 
11 #define super IOService
12 OSDefineMetaClassAndStructors(testthreadcall, super);
13 
14 extern "C" {
15 
16 static void thread_call_test_func(thread_call_param_t param0,
17 								  thread_call_param_t param1);
18 
19 }
20 
21 bool
22 testthreadcall::start( IOService * provider )
23 {
24 	boolean_t ret;
25 	uint64_t deadline;
26 
27     IOLog("%s\n", __PRETTY_FUNCTION__);
28 
29     if (!super::start(provider)) {
30         return false;
31     }
32 
33     IOLog("Attempting thread_call_allocate\n");
34 	tcall = thread_call_allocate(thread_call_test_func, this);
35     IOLog("thread_call_t %p\n", tcall);
36 
37 	tlock = IOSimpleLockAlloc();
38 	IOLog("tlock %p\n", tlock);
39 
40 	clock_interval_to_deadline(5, NSEC_PER_SEC, &deadline);
41 	IOLog("%d sec deadline is %llu\n", 5, deadline);
42 
43 	ret = thread_call_enter_delayed(tcall, deadline);
44 
45     return true;
46 }
47 
48 static void thread_call_test_func(thread_call_param_t param0,
49 								  thread_call_param_t param1)
50 {
51 	testthreadcall *self = (testthreadcall *)param0;
52 
53 	IOLog("thread_call_test_func %p %p\n", param0, param1);
54 
55 	IOSimpleLockLock(self->tlock);
56 	IOSimpleLockUnlock(self->tlock);
57 
58 #if 1
59 	IOSimpleLockLock(self->tlock);
60 #else
61 	IOSimpleLockUnlock(self->tlock);
62 #endif
63 }
64