Annotation of driverkit/Examples/IOStub/IOStubDevice.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: /*     IOStubDevice.m  1.0     02/07/91        (c) 1991 NeXT   
                     25:  *
                     26:  * IOStubDevice.m - Implementation of "Device-specific" IOStub functions.
                     27:  *
                     28:  * HISTORY
                     29:  * 07-Feb-91    Doug Mitchell at NeXT
                     30:  *      Created. 
                     31:  */
                     32:  
                     33: #import <bsd/sys/types.h>
                     34: #import <mach/mach.h>
                     35: #import <mach/vm_param.h>
                     36: #import <mach/mach_error.h>
                     37: #import <bsd/libc.h>
                     38: #import <driverkit/return.h>
                     39: #import <driverkit/IODevice.h>
                     40: #import "IOStub.h"
                     41: #import "IOStubThread.h"
                     42: #import "IOStubDevice.h"
                     43: #import "IOStubUxpr.h"
                     44: #import <machkit/NXLock.h>
                     45: 
                     46: @implementation IOStub(Device)
                     47: 
                     48: /*
                     49:  * These are the methods which actually do the work of this device. All
                     50:  * of these methods run in the IOStub_thread thread.
                     51:  */
                     52: - (void)deviceRead : (IOBuf_t *)IOBuf
                     53: {
                     54:        char *source;
                     55:        u_int block_size;
                     56:        
                     57:        xpr_stub("deviceRead:\n", 1,2,3,4,5);
                     58:        block_size = [self blockSize];
                     59:        source = stub_data + IOBuf->offset * block_size;
                     60:        bcopy(source, IOBuf->buf, IOBuf->bytesReq);
                     61:        IOBuf->status = IO_R_SUCCESS;
                     62:        if(IOBuf->pending) {
                     63:                /*
                     64:                 * Async I/O. Notify client.
                     65:                 */
                     66: #if            SUPPORT_ASYNC
                     67:                [self ioComplete:IOBuf->pending
                     68:                        dirRead : 1
                     69:                        status : IO_R_SUCCESS
                     70:                        bytesXfr : IOBuf->bytesReq];
                     71:                IOFree(IOBuf, sizeof(*IOBuf));
                     72: #else          SUPPORT_ASYNC
                     73:                IOLog("Bogus async request in deviceRead\n");
                     74:                exit(1);
                     75: #endif         SUPPORT_ASYNC
                     76:        }
                     77:        else {
                     78:                /*
                     79:                 * Synchronous I/O. Notify sleeping thread.
                     80:                 */
                     81:                *IOBuf->bytesXfr = IOBuf->bytesReq;
                     82:                [IOBuf->waitLock unlockWith:YES];
                     83:        }
                     84: }
                     85: 
                     86: - (void)deviceWrite : (IOBuf_t *)IOBuf
                     87: {
                     88:        char *dest;
                     89:        u_int block_size;
                     90:        
                     91:        xpr_stub("deviceWrite:\n", 1,2,3,4,5);
                     92:        block_size = [self blockSize];
                     93:        dest = stub_data + IOBuf->offset * block_size;
                     94:        bcopy(IOBuf->buf, dest, IOBuf->bytesReq);
                     95:        IOBuf->status = IO_R_SUCCESS;
                     96:        if(IOBuf->pending) {
                     97: #if            SUPPORT_ASYNC
                     98:                /*
                     99:                 * Async I/O. Notify client.
                    100:                 */
                    101:                [self ioComplete:IOBuf->pending
                    102:                        dirRead : 0
                    103:                        status : IO_R_SUCCESS
                    104:                        bytesXfr : IOBuf->bytesReq];
                    105:                IOFree(IOBuf, sizeof(*IOBuf));
                    106: #else          SUPPORT_ASYNC
                    107:                IOLog("Bogus async request in deviceZero\n");
                    108: #endif         SUPPORT_ASYNC
                    109:        }
                    110:        else {
                    111:                /*
                    112:                 * Synchronous I/O. Notify sleeping thread.
                    113:                 */
                    114:                *IOBuf->bytesXfr = IOBuf->bytesReq;
                    115:                [IOBuf->waitLock unlockWith:YES];
                    116:        }
                    117: }
                    118: 
                    119: /*
                    120:  * Zero all of memory. No dispatch for this one...
                    121:  */
                    122: - (void)deviceZero : (IOBuf_t *)IOBuf
                    123: {
                    124:        u_int block_size;
                    125:        u_int dev_size;
                    126:        
                    127:        xpr_stub("deviceZero:\n", 1,2,3,4,5);
                    128:        block_size = [self blockSize];
                    129:        dev_size = [self diskSize];
                    130:        bzero(stub_data, block_size * dev_size);
                    131:        IOBuf->status = IO_R_SUCCESS;
                    132:        if(IOBuf->pending) {
                    133: #if            SUPPORT_ASYNC
                    134:                /*
                    135:                 * Async I/O. Notify client.
                    136:                 */
                    137:                [self ioComplete:IOBuf->pending
                    138:                        dirRead : 1
                    139:                        status : IO_R_SUCCESS
                    140:                        bytesXfr : 0];
                    141:                IOFree(IOBuf, sizeof(*IOBuf));
                    142: #else          SUPPORT_ASYNC
                    143:                IOLog("Bogus async request in deviceZero\n");
                    144: #endif         SUPPORT_ASYNC
                    145:        }
                    146:        else {
                    147:                /*
                    148:                 * Synchronous I/O. Notify sleeping thread.
                    149:                 */
                    150:                [IOBuf->waitLock unlockWith:YES];
                    151:        }
                    152: }
                    153: 
                    154: 
                    155: @end
                    156: 

unix.superglobalmegacorp.com

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