xref: /xnu-12377.41.6/iokit/Tests/TestServices/TestIODataQueues.cpp (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1 #include <IOKit/IOKitKeys.h>
2 #include "TestIODataQueues.h"
3 
4 #if DEVELOPMENT || DEBUG
5 
6 OSDefineMetaClassAndStructors(TestIODataQueues, IOService);
7 
8 OSDefineMetaClassAndStructors(TestIODataQueuesUserClient, IOUserClient2022);
9 
10 bool
start(IOService * provider)11 TestIODataQueues::start(IOService * provider)
12 {
13 	OSString * str = OSString::withCStringNoCopy("TestIODataQueuesUserClient");
14 	bool ok = IOService::start(provider);
15 	if (ok && str != NULL) {
16 		IOReturn ret;
17 		ret = IOCircularDataQueueCreateWithEntries(kIOCircularDataQueueCreateProducer, 128, 16, &fCDQueue);
18 		assert(kIOReturnSuccess == ret);
19 		ret = IOCircularDataQueueEnqueue(fCDQueue, "hello", sizeof("hello"));
20 		assert(kIOReturnSuccess == ret);
21 
22 		setProperty(gIOUserClientClassKey, str);
23 		registerService();
24 	}
25 	OSSafeReleaseNULL(str);
26 	return ok;
27 }
28 
29 
30 IOReturn
clientClose()31 TestIODataQueuesUserClient::clientClose()
32 {
33 	if (!isInactive()) {
34 		terminate();
35 	}
36 	return kIOReturnSuccess;
37 }
38 
39 bool
start(IOService * provider)40 TestIODataQueuesUserClient::start(IOService * provider)
41 {
42 	bool ok = IOUserClient2022::start(provider);
43 	if (!ok) {
44 		return false;
45 	}
46 	fTestIODataQueues = OSRequiredCast(TestIODataQueues, provider);
47 
48 	setProperty(kIOUserClientDefaultLockingKey, kOSBooleanTrue);
49 	setProperty(kIOUserClientDefaultLockingSetPropertiesKey, kOSBooleanTrue);
50 	setProperty(kIOUserClientDefaultLockingSingleThreadExternalMethodKey, kOSBooleanTrue);
51 	setProperty(kIOUserClientEntitlementsKey, "com.apple.iokit.TestIODataQueues");
52 
53 	return true;
54 }
55 
56 IOReturn
clientMemoryForType(UInt32 type,IOOptionBits * koptions,IOMemoryDescriptor ** kmemory)57 TestIODataQueuesUserClient::clientMemoryForType(UInt32 type,
58     IOOptionBits * koptions,
59     IOMemoryDescriptor ** kmemory)
60 {
61 	IOReturn ret = kIOReturnSuccess;
62 
63 	*kmemory = IOCircularDataQueueCopyMemoryDescriptor(fTestIODataQueues->fCDQueue);
64 	assert(*kmemory);
65 	*koptions = kIOMapReadOnly;
66 
67 	return ret;
68 }
69 
70 IOReturn
externalMethod(uint32_t selector,IOExternalMethodArgumentsOpaque * args)71 TestIODataQueuesUserClient::externalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque * args)
72 {
73 	static const IOExternalMethodDispatch2022 dispatchArray[] = {
74 	};
75 
76 	return dispatchExternalMethod(selector, args, dispatchArray, sizeof(dispatchArray) / sizeof(dispatchArray[0]), this, NULL);
77 }
78 
79 #endif /* DEVELOPMENT || DEBUG */
80