Annotation of driverkit/Examples/lockTest/lockTest.m, revision 1.1.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.