Loading...
iokit/Tests/TestServices/TestIOServiceUserNotification.cpp xnu-12377.101.15 /dev/null
--- xnu/xnu-12377.101.15/iokit/Tests/TestServices/TestIOServiceUserNotification.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#if DEVELOPMENT || DEBUG
-#include "TestIOServiceUserNotification.h"
-#include <IOKit/IOService.h>
-#include <IOKit/IOUserClient.h>
-#include <IOKit/IOKitServer.h>
-#include <kern/ipc_kobject.h>
-#include "../../Kernel/IOServicePrivate.h"
-
-OSDefineMetaClassAndStructors(TestIOServiceUserNotification, IOService);
-
-OSDefineMetaClassAndStructors(TestIOServiceUserNotificationUserClient, IOUserClient);
-
-bool
-TestIOServiceUserNotification::start(IOService * provider)
-{
-	OSString * str = OSString::withCStringNoCopy("TestIOServiceUserNotificationUserClient");
-	bool ret = IOService::start(provider);
-	if (ret && str != NULL) {
-		setProperty(gIOUserClientClassKey, str);
-		fUserNotifications = OSArray::withCapacity(1);
-		fLock = IOLockAlloc();
-		registerService();
-	}
-	OSSafeReleaseNULL(str);
-	return ret;
-}
-
-void
-TestIOServiceUserNotification::free()
-{
-	if (fLock) {
-		IOLockFree(fLock);
-		fLock = NULL;
-	}
-	OSSafeReleaseNULL(fUserNotifications);
-	IOService::free();
-}
-
-void
-TestIOServiceUserNotification::registerUserNotification(OSObject * notification)
-{
-	IOLockLock(fLock);
-	// Proactively trim the list to avoid holding too many objects
-	trimUserNotificationsLocked();
-	assert(fUserNotifications->getNextIndexOfObject(notification, 0) == -1);
-	fUserNotifications->setObject(notification);
-	IOLockUnlock(fLock);
-}
-
-void
-TestIOServiceUserNotification::trimUserNotificationsLocked()
-{
-	OSArray * remaining = OSArray::withCapacity(1);
-	if (!remaining) {
-		return;
-	}
-	fUserNotifications->iterateObjects(^(OSObject * obj) {
-		if (obj->getRetainCount() != 1) {
-		        remaining->setObject(obj);
-		}
-		return false;
-	});
-	fUserNotifications->release();
-	fUserNotifications = remaining;
-}
-
-size_t
-TestIOServiceUserNotification::getUserNotificationLeakCount()
-{
-	size_t count = 0;
-	IOLockLock(fLock);
-	trimUserNotificationsLocked();
-	count = fUserNotifications->getCount();
-	IOLockUnlock(fLock);
-	return count;
-}
-
-bool
-TestIOServiceUserNotificationUserClient::start(IOService * provider)
-{
-	if (!IOUserClient::start(provider)) {
-		return false;
-	}
-	fProvider = OSDynamicCast(TestIOServiceUserNotification, provider);
-	assert(fProvider);
-	return true;
-}
-
-IONotifier *
-TestIOServiceUserNotificationUserClient::registerInterest(const OSSymbol * typeOfInterest,
-    IOServiceInterestHandler handler,
-    void * target,
-    void * ref)
-{
-	IONotifier * notify = IOService::registerInterest(typeOfInterest, handler, target, ref);
-
-	// No straightforward way to make sure registerInterest is called from the test app
-	// Could check if handler is _ZN32IOServiceMessageUserNotification8_handlerEPvS0_jP9IOServiceS0_m
-	// But still cannot rule out other user process regisering interest
-	OSObject * obj = (OSObject *)target;
-	// Just panic the system if target isn't OSObject
-	fProvider->registerUserNotification(obj);
-
-	return notify;
-}
-
-IOReturn
-TestIOServiceUserNotificationUserClient::clientClose()
-{
-	if (!isInactive()) {
-		terminate();
-	}
-	return kIOReturnSuccess;
-}
-
-IOReturn
-TestIOServiceUserNotificationUserClient::externalMethod(uint32_t selector, IOExternalMethodArguments * args,
-    IOExternalMethodDispatch * dispatch, OSObject * target, void * reference)
-{
-	if (selector == 0) {
-		registerService();
-	} else if (selector == 1 && args->scalarOutputCount >= 1) {
-		args->scalarOutput[0] = fProvider->getUserNotificationLeakCount();
-	}
-	return kIOReturnSuccess;
-}
-
-#endif /* DEVELOPMENT || DEBUG */