|
|
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: /* ! 23: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 24: * ! 25: * IOOQLockFIFOQueue.h ! 26: * ! 27: * HISTORY ! 28: * ! 29: */ ! 30: ! 31: #ifndef _IOOQLOCKFIFOQUEUE_H ! 32: #define _IOOQLOCKFIFOQUEUE_H ! 33: ! 34: /* ! 35: * Aliases. ! 36: */ ! 37: #define IOLockedFIFOQueue IOOQLockFIFOQueue ! 38: ! 39: #include <IOKit/IOLocks.h> ! 40: #include <IOKit/network/IOOutputQueue.h> ! 41: ! 42: /*! @class IOOQLockFIFOQueue ! 43: @abstract A concrete implementation of an IOOutputQueue. This object ! 44: provides a FIFO packet queue to hold the incoming packets provided ! 45: by the client transmit threads. A mutex lock is used to serialize ! 46: access to the target's output handler. The mutex lock is local to the ! 47: queue and there is no serialization performed between calls to the ! 48: target's output handler, and any other threads that may be running on ! 49: the target. See IOOutputQueue for additional information. */ ! 50: ! 51: class IOOQLockFIFOQueue : public IOOutputQueue ! 52: { ! 53: OSDeclareDefaultStructors(IOOQLockFIFOQueue) ! 54: ! 55: protected: ! 56: IOLock * _mutex; ! 57: volatile bool _serviceActive; ! 58: volatile UInt32 _enqueueCount; ! 59: ! 60: /*! @function serviceThread ! 61: @discussion Provide an implementation for the interface defined in ! 62: IOOutputQueue. This method is called by a callout thread when ! 63: service() is performed asynchronously. */ ! 64: ! 65: virtual void serviceThread(); ! 66: ! 67: /*! @function dequeue ! 68: @discussion Responsible for removing all packets from the queue and calling ! 69: the target's output handler. This method returns when the queue becomes ! 70: empty or if the queue's state is no longer kIOOQStateRunning. The target's ! 71: output handler is called for every packet removed from the queue. Only a ! 72: single packet is sent to the target for every call, the packets are never ! 73: chained. A mutex lock enforces single threaded access to the target's ! 74: output handler. */ ! 75: ! 76: virtual void dequeue(); ! 77: ! 78: /*! @function free ! 79: @discussion Frees the IOOQLockFIFOQueue instance. */ ! 80: ! 81: virtual void free(); ! 82: ! 83: public: ! 84: ! 85: /*! @function init ! 86: @discussion Initialize an IOOQLockFIFOQueue instance. ! 87: @param target The object that shall receive packets from the queue, ! 88: and is usually a subclass of IONetworkController. If the target is ! 89: not an IONetworkController instance, then the target must immediately ! 90: call registerOutputHandler() after initializing the queue. ! 91: @param capacity The initial capacity of the output queue, defined as ! 92: the number of packets that the queue can hold without dropping. ! 93: @result true if initialized successfully, false otherwise. */ ! 94: ! 95: virtual bool init(OSObject * target, UInt32 capacity = 0); ! 96: ! 97: /*! @function withTarget ! 98: @discussion Factory method that will construct and initialize an ! 99: IOOQLockFIFOQueue instance. ! 100: @param target Same as init(). ! 101: @param capacity Same as init(). ! 102: @result An IOOQLockFIFOQueue instance upon success, or 0 otherwise. */ ! 103: ! 104: static IOOQLockFIFOQueue * withTarget(OSObject * target, ! 105: UInt32 capacity = 0); ! 106: ! 107: /*! @function enqueue ! 108: @discussion Handles packet (or a packet chain) sent to the queue. ! 109: This method can handle calls from multiple simultaneous client threads. ! 110: A client thread that calls enqueue() will acquire a mutex lock and ! 111: call dequeue() if it detects that no other thread is actively ! 112: dequeueing packets from the queue. The dequeue() method will return ! 113: when the queue becomes empty, or if the target stalls the queue. ! 114: This method may block its caller. ! 115: @param m The packet (or a packet chain) to be queued for transmission. ! 116: @result The number of dropped packets. */ ! 117: ! 118: virtual UInt32 enqueue(struct mbuf * m); ! 119: ! 120: /*! @function start ! 121: @discussion This method is called by the target to start the queue. ! 122: Once started, the queue will be allowed to call the target's ! 123: output handler. Before that, with the queue stopped, the queue will ! 124: absorb incoming packets sent to the enqueue() method, but no packets ! 125: will be dequeued, and the target's output handler will not be called. ! 126: @result true if the queue was successfully started, false otherwise. */ ! 127: ! 128: virtual bool start(); ! 129: ! 130: /*! @function stop ! 131: @discussion Stops the queue to prevent it from calling the target's ! 132: output handler. This call is synchronous the caller may block. ! 133: The target's output handler must never call this method, or any other ! 134: queue methods. */ ! 135: ! 136: virtual void stop(); ! 137: ! 138: /*! @function service ! 139: @discussion If the queue becomes stalled, then service() must be called ! 140: to restart the queue when the target is ready to accept more packets. ! 141: If the queue is not empty, this method will also call dequeue(). ! 142: Note that if the target never sends a kIOOQReturnActionStall action ! 143: code to the queue, then the queue will never stall on its own accord. ! 144: Calling this method on a running queue that is not stalled is harmless. ! 145: @param sync True if the service action should be performed synchronously, ! 146: false to perform the action asynchronously without blocking the caller, ! 147: but with a much higher latency cost. ! 148: @result true if the queue needed servicing, false otherwise. */ ! 149: ! 150: virtual bool service(bool sync = true); ! 151: }; ! 152: ! 153: #endif /* !_IOOQLOCKFIFOQUEUE_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.