Annotation of driverkit/Examples/lockTest/lockTest.m, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: /*
        !            25:  * Test of NXLock, NXConditionLock, and NXSpinLock (user version).
        !            26:  */
        !            27: 
        !            28: #import <machkit/NXLock.h>
        !            29: #import <driverkit/generalFuncs.h>
        !            30: #import <bsd/sys/printf.h>
        !            31: 
        !            32: static int ioThread();
        !            33: 
        !            34: id lock;
        !            35: id condLock;
        !            36: id spinLock;
        !            37: 
        !            38: /*
        !            39:  * flags meean "I'm waiting for you" when YES.
        !            40:  */
        !            41: BOOL threadFlag = NO;
        !            42: BOOL mainFlag = NO;
        !            43: 
        !            44: /*
        !            45:  *  part       main                    thread
        !            46:  *  ----        -------------------     -----------------------
        !            47:  *   1         mainFlag NO             threadFlag NO 
        !            48:  *             grab spin lock          wait for mainFlag
        !            49:  *             mainFlag YES            
        !            50:  *             wait for threadFlag
        !            51:  *                                     threadFlag YES
        !            52:  *                                     try to acquire spinLock (held by main)
        !            53:  *             mainFlag NO
        !            54:  *             sleep
        !            55:  *             unlock spin lock        
        !            56:  *             wait for threadFlag NO
        !            57:  *                                     unlock spinLock
        !            58:  *                                     threadFlag NO
        !            59:  *
        !            60:  *  2          grab lock               wait for mainFlag
        !            61:  *             mainFlag YES            
        !            62:  *             wait for threadFlag
        !            63:  *                                     threadFlag YES
        !            64:  *                                     try to acquire lock (held by main)
        !            65:  *             mainFlag NO
        !            66:  *             sleep
        !            67:  *             unlock lock     
        !            68:  *             wait for threadFlag NO
        !            69:  *                                     unlock spinLock
        !            70:  *                                     threadFlag NO
        !            71:  *
        !            72:  *  3          grab condLock           wait for mainFlag
        !            73:  *             mainFlag YES
        !            74:  *             wait for threadFlag
        !            75:  *                                     threadFlag YES
        !            76:  *                                     [condLock lockWhen 1]
        !            77:  *             mainFlag NO
        !            78:  *             sleep
        !            79:  *             [condLock unlockWith 1]
        !            80:  *             [condLock lockWhen 2]
        !            81:  *                                     sleep
        !            82:  *                                     [condLock unlockWith 2]
        !            83:  *             done                    done
        !            84:  */
        !            85:  
        !            86: int main(int argc, char **argv)
        !            87: {
        !            88:        /*
        !            89:         * Init the three locks.
        !            90:         */
        !            91:        lock     = [NXLock new];
        !            92:        condLock = [NXConditionLock alloc];
        !            93:        [condLock initWith:0];
        !            94:        spinLock = [NXSpinLock new];
        !            95:        
        !            96:        /*
        !            97:         * Start up the I/O thread.
        !            98:         */
        !            99:        IOForkThread((IOThreadFunc)ioThread, (void *)ioThread);
        !           100:        
        !           101:        /*
        !           102:         * Part 1.
        !           103:         */
        !           104:        [spinLock lock];
        !           105:        mainFlag = YES;
        !           106:        while(!threadFlag)
        !           107:                ;
        !           108:        mainFlag = NO;
        !           109:        printf("1 (main) - threadFlag YES, main() holds spin lock\n");
        !           110:        IOSleep(1000);
        !           111:        [spinLock unlock];
        !           112:        
        !           113:        /*
        !           114:         * Wait for I/O Thread to finish part 1.
        !           115:         */
        !           116:        while(threadFlag)
        !           117:                ;
        !           118:                
        !           119:        /*
        !           120:         * Part 2.
        !           121:         */
        !           122:        [lock lock];
        !           123:        mainFlag = YES;
        !           124:        while(!threadFlag)
        !           125:                ;
        !           126:        mainFlag = NO;
        !           127:        printf("2 (main) - threadFlag YES, main() holds lock\n");
        !           128:        IOSleep(1000);
        !           129:        [lock unlock];
        !           130:        
        !           131:        /*
        !           132:         * Wait for I/O Thread to finish part 2.
        !           133:         */
        !           134:        while(threadFlag)
        !           135:                ;
        !           136: 
        !           137:        /*
        !           138:         * Part 3.
        !           139:         */             
        !           140:        [condLock lock];
        !           141:        mainFlag = YES;
        !           142:        while(!threadFlag)
        !           143:                ;
        !           144:        printf("3 (main) - threadFlag YES, main() holds condLock\n");
        !           145:        IOSleep(1000);
        !           146:        [condLock unlockWith:1];
        !           147:        [condLock lockWhen:2];
        !           148:        printf("3 (main) - got condLock:2; done\n");
        !           149:        return(0);
        !           150: }
        !           151: 
        !           152: static int ioThread()
        !           153: {
        !           154:        /*
        !           155:         * part 1.
        !           156:         */
        !           157:        while(!mainFlag)
        !           158:                ;
        !           159:        threadFlag = YES;
        !           160:        [spinLock lock];
        !           161:        printf("1 (thread) - thread got spinLock\n");
        !           162:        [spinLock unlock];
        !           163:        threadFlag = NO;
        !           164:        
        !           165:        /*
        !           166:         * part 2.
        !           167:         */
        !           168:        while(!mainFlag)
        !           169:                ;
        !           170:        threadFlag = YES;
        !           171:        [lock lock];
        !           172:        printf("2 (thread) - thread got lock\n");
        !           173:        [lock unlock];
        !           174:        threadFlag = NO;
        !           175:        
        !           176:        /*
        !           177:         * Part 3.
        !           178:         */
        !           179:        while(!mainFlag)
        !           180:                ;
        !           181:        threadFlag = YES;
        !           182:        [condLock lockWhen:1];
        !           183:        printf("3 (thread) - got condLock:1\n");
        !           184:        IOSleep(1000);
        !           185:        [condLock unlockWith:2];
        !           186:        IOExitThread();
        !           187: }

unix.superglobalmegacorp.com

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