Annotation of XNU/iokit/Tests/TestDevice.cpp, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: #if DEBUG
        !            23: 
        !            24: #include "Tests.h"
        !            25: 
        !            26: #include <IOKit/IOCommandQueue.h>
        !            27: #include <IOKit/IOInterruptEventSource.h>
        !            28: #include <IOKit/IOWorkLoop.h>
        !            29: 
        !            30: #include <mach/sync_policy.h>
        !            31: 
        !            32: #define super OSObject
        !            33: 
        !            34: static TestDevice *sDevice;
        !            35: 
        !            36: static mach_timespec_t hundredMill = { 0, 100000000 };
        !            37: static semaphore_port_t completeSema;
        !            38: 
        !            39: OSDefineMetaClassAndStructors(TestDevice, OSObject)
        !            40: 
        !            41: kern_return_t
        !            42: TestDevice::enqueueCommand(bool sleep,
        !            43:                            TestDeviceAction act, int tag, void *dataP)
        !            44: {
        !            45:     return commQ->enqueueCommand(sleep, (void *) act, (void *) tag, dataP);
        !            46: }
        !            47: 
        !            48: bool TestDevice::init()
        !            49: {
        !            50:     if ( !super::init() )
        !            51:         return false;
        !            52: 
        !            53:     workLoop = IOWorkLoop::workLoop();
        !            54:     if ( !workLoop )
        !            55:         return false;
        !            56: 
        !            57:     commQ = IOCommandQueue::commandQueue
        !            58:         (this, (IOCommandQueueAction) &rawCommandOccurred, 8);
        !            59:     if (!commQ || kIOReturnSuccess != workLoop->addEventSource(commQ))
        !            60:         return false;
        !            61: 
        !            62:     intES = IOInterruptEventSource::interruptEventSource
        !            63:         (this, (IOInterruptEventAction) &interruptAction);
        !            64:     if (!intES || kIOReturnSuccess != workLoop->addEventSource(intES))
        !            65:         return false;
        !            66: 
        !            67:     return true;
        !            68: }
        !            69: 
        !            70: void TestDevice::free()
        !            71: {
        !            72:     if (intES)    intES->release();
        !            73:     if (commQ)    commQ->release();
        !            74:     if (workLoop) workLoop->release();
        !            75: 
        !            76:     super::free(); 
        !            77: }
        !            78: 
        !            79: void
        !            80: TestDevice::rawCommandOccurred
        !            81:     (void *field0, void *field1, void *field2, void *)
        !            82: {
        !            83:     (*(TestDeviceAction) field0)(this, (int) field1, field2);
        !            84: }
        !            85: 
        !            86: void
        !            87: TestDevice::interruptAction(IOInterruptEventSource *, int count)
        !            88: {
        !            89:     logPrintf(("I(%d, %d) ", count, ++intCount));
        !            90: }
        !            91: 
        !            92: void
        !            93: TestDevice::producer1Action(int tag)
        !            94: {
        !            95:     logPrintf(("C1(%d) ", tag));
        !            96: }
        !            97: 
        !            98: void
        !            99: TestDevice::producer2Action(int tag, void *count)
        !           100: {
        !           101:     logPrintf(("C2(%d,%d) ", tag, (int) count));
        !           102:     if ( !(tag % 10) )
        !           103:         IOSleep(1000);
        !           104: }
        !           105: 
        !           106: void
        !           107: TestDevice::alarm()
        !           108: {
        !           109:     intES->interruptOccurred(0, 0, 0);
        !           110:     IOScheduleFunc((IOThreadFunc) alarm, (void *) this, hundredMill, 1);
        !           111: }
        !           112: 
        !           113: static void producer(void *inProducerId)
        !           114: {
        !           115:     int producerId = (int) inProducerId;
        !           116:     TestDeviceAction command;
        !           117:     int i;
        !           118: 
        !           119:     semaphore_wait(completeSema);
        !           120: 
        !           121:     if (producerId & 1)
        !           122:         command = (TestDeviceAction) sDevice->producer1Action;
        !           123:     else
        !           124:         command = (TestDeviceAction) sDevice->producer2Action;
        !           125: 
        !           126:     for (i = 0; i < 5 * (producerId << 1); i++) {
        !           127:         sDevice->enqueueCommand
        !           128:                 (true, command, i, (void *) (i % (producerId + 1)));
        !           129:         if ( !(i % (producerId + 1)) )
        !           130:             /* cthread_yield() */;
        !           131:         logPrintf(("TestDevice(%d): %d\n", producerId, i));
        !           132:     }
        !           133: 
        !           134:     logPrintf(("TestDevice: producer %d exiting\n", producerId));
        !           135:     semaphore_signal(completeSema);
        !           136: 
        !           137:     IOExitThread(producerId);
        !           138: }
        !           139: 
        !           140: void testWorkLoop()
        !           141: {
        !           142:     int i;
        !           143: 
        !           144:     sDevice = new TestDevice;
        !           145:     if (!sDevice || !sDevice->init()) {
        !           146:         if (sDevice) sDevice->free();
        !           147:         logPrintf(("TestDevice: couldn't create device instance\n"));
        !           148:         return;
        !           149:     }
        !           150: 
        !           151:     IOSleep(1000);
        !           152: 
        !           153:     IOScheduleFunc((IOThreadFunc) sDevice->alarm, sDevice, hundredMill, 1);
        !           154: 
        !           155:     IOSleep(2000);
        !           156: 
        !           157:     if (KERN_SUCCESS
        !           158:     !=  semaphore_create(kernel_task, &completeSema, SYNC_POLICY_FIFO, 4))
        !           159:         return;
        !           160: 
        !           161:     IOCreateThread(producer, (void *) 4);
        !           162:     IOCreateThread(producer, (void *) 3);
        !           163:     IOCreateThread(producer, (void *) 2);
        !           164:     IOCreateThread(producer, (void *) 1);
        !           165: 
        !           166:     IOSleep(2000);
        !           167: 
        !           168:     for (i = 0; i < 4; i++)
        !           169:         semaphore_wait(completeSema);
        !           170: 
        !           171:     IOUnscheduleFunc((IOThreadFunc) sDevice->alarm, sDevice);
        !           172: 
        !           173:     sDevice->free(); sDevice = 0;
        !           174: 
        !           175:     logPrintf(("TestDevice: exiting\n"));
        !           176: }
        !           177: 
        !           178: #endif /* DEBUG */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.