Annotation of kernel/driverkit/KernLock.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: /*
                     26:  * Copyright (c) 1994 NeXT Computer, Inc.
                     27:  *
                     28:  * Kernel generic lock object.
                     29:  *
                     30:  * HISTORY
                     31:  *
                     32:  * 4 July 1994 ? at NeXT
                     33:  *     Created.
                     34:  */
                     35: 
                     36: #import <cpus.h>
                     37: 
                     38: #import <mach/mach_types.h>
                     39: 
                     40: #import <driverkit/KernLock.h>
                     41: 
                     42: @implementation KernLock
                     43: 
                     44: - initWithLevel:       (int)level
                     45: {
                     46: #if    NCPUS > 1
                     47:     _slock = simple_lock_alloc();
                     48:     simple_lock_init(_slock);
                     49: #else
                     50:     if (level == 0)
                     51:        return [super free];
                     52: #endif
                     53: 
                     54:     _lockLevel = level;
                     55:     
                     56:     return self;
                     57: }
                     58: 
                     59: - init
                     60: {
                     61:     return [self initWithLevel:0];
                     62: }
                     63: 
                     64: - free
                     65: {
                     66: #if    NCPUS > 1
                     67:     simple_lock_free(_slock);
                     68: #endif
                     69:     
                     70:     return [super free];
                     71: }
                     72: 
                     73: - (int)level
                     74: {
                     75:     return _lockLevel;
                     76: }
                     77: 
                     78: - (void)acquire
                     79: {
                     80:     int                oldLevel = curipl();
                     81:     
                     82:     if (oldLevel < _lockLevel)
                     83:        spln(ipltospl(_lockLevel));
                     84: 
                     85: #if    NCPUS > 1       
                     86:     simple_lock(_slock);
                     87: #endif
                     88:     _savedLevel = oldLevel;
                     89: }
                     90: 
                     91: - (void)release
                     92: {
                     93:     int                oldLevel = _savedLevel;
                     94: 
                     95: #if    NCPUS > 1    
                     96:     simple_unlock(_slock);
                     97: #endif
                     98:     spln(ipltospl(oldLevel));
                     99: }
                    100: 
                    101: @end
                    102: 
                    103: typedef struct KernLock_ {
                    104:     @defs(KernLock)
                    105: } KernLock_;
                    106: 
                    107: void
                    108: KernLockAcquire(
                    109:     KernLock           *_lock
                    110: )
                    111: {
                    112:     KernLock_          *lock = (KernLock_ *)_lock;
                    113:     int                        oldLevel = curipl();
                    114:     
                    115:     if (_lock == nil)
                    116:        return;
                    117:     
                    118:     if (oldLevel < lock->_lockLevel)
                    119:        spln(ipltospl(lock->_lockLevel));
                    120: 
                    121: #if    NCPUS > 1       
                    122:     simple_lock(lock->_slock);
                    123: #endif
                    124:     lock->_savedLevel = oldLevel;
                    125: }
                    126: 
                    127: void
                    128: KernLockRelease(
                    129:     KernLock           *_lock
                    130: )
                    131: {
                    132:     KernLock_          *lock = (KernLock_ *)_lock;
                    133:     int                        oldLevel;
                    134:     
                    135:     if (_lock == nil)
                    136:        return;
                    137: 
                    138:     oldLevel = lock->_savedLevel;
                    139: 
                    140: #if    NCPUS > 1    
                    141:     simple_unlock(lock->_slock);
                    142: #endif
                    143:     spln(ipltospl(oldLevel));
                    144: }

unix.superglobalmegacorp.com

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