|
|
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: #include <IOKit/pwr_mgt/IOPM.h> ! 23: #include <IOKit/pwr_mgt/IOPMchangeNoteList.h> ! 24: ! 25: #define super OSObject ! 26: OSDefineMetaClassAndStructors(IOPMchangeNoteList,OSObject) ! 27: ! 28: //********************************************************************************* ! 29: // init ! 30: // ! 31: //********************************************************************************* ! 32: void IOPMchangeNoteList::initialize ( void ) ! 33: { ! 34: long i; ! 35: ! 36: firstInList = 0; ! 37: firstUnused = 0; ! 38: for ( i = 0; i < IOPMMaxChangeNotes; i++ ) { ! 39: changeNote[i].flags = IOPMNotInUse; ! 40: } ! 41: } ! 42: ! 43: //********************************************************************************* ! 44: // createChangeNote ! 45: // ! 46: //********************************************************************************* ! 47: ! 48: long IOPMchangeNoteList::createChangeNote ( void ) ! 49: { ! 50: unsigned long i, j; ! 51: ! 52: i = increment(firstUnused); ! 53: if ( firstInList == i ) { ! 54: return -1; ! 55: } ! 56: j = firstUnused; ! 57: firstUnused = i; ! 58: ! 59: return j; ! 60: } ! 61: ! 62: //********************************************************************************* ! 63: // currentChange ! 64: // ! 65: // Return the ordinal of the first change note in the list. ! 66: // If the list is empty, return -1. ! 67: //********************************************************************************* ! 68: ! 69: long IOPMchangeNoteList::currentChange ( void ) ! 70: { ! 71: if ( firstUnused == firstInList ) { ! 72: return -1; ! 73: } ! 74: else { ! 75: return firstInList; ! 76: } ! 77: } ! 78: ! 79: //********************************************************************************* ! 80: // latestChange ! 81: // ! 82: // Return the ordinal of the last change note in the list. ! 83: // If the list is empty, return -1. ! 84: //********************************************************************************* ! 85: ! 86: long IOPMchangeNoteList::latestChange ( void ) ! 87: { ! 88: if ( firstUnused == firstInList ) { ! 89: return -1; ! 90: } ! 91: else { ! 92: return decrement(firstUnused); ! 93: } ! 94: } ! 95: ! 96: //********************************************************************************* ! 97: // releaseHeadChangeNote ! 98: // ! 99: // Mark the head node unused. ! 100: // This happens when the first change in the list is completely processed. ! 101: // That is, all interested parties have acknowledged it, and power is settled ! 102: // at the new level. ! 103: //********************************************************************************* ! 104: ! 105: IOReturn IOPMchangeNoteList::releaseHeadChangeNote ( void ) ! 106: { ! 107: changeNote[firstInList].flags = IOPMNotInUse; ! 108: firstInList = increment(firstInList); ! 109: return IOPMNoErr; ! 110: } ! 111: ! 112: //********************************************************************************* ! 113: // releaseTailChangeNote ! 114: // ! 115: // Mark the tail node unused. ! 116: // This happens when a power change is queued up after another which has ! 117: // not yet been started, and the second one supercedes the first. The data in ! 118: // the second is copied into the first and the the second is released. This ! 119: // collapses the first change out of the list. ! 120: //********************************************************************************* ! 121: ! 122: IOReturn IOPMchangeNoteList::releaseTailChangeNote ( void ) ! 123: { ! 124: firstUnused = decrement(firstUnused); ! 125: changeNote[firstUnused].flags = IOPMNotInUse; ! 126: return IOPMNoErr; ! 127: } ! 128: ! 129: //********************************************************************************* ! 130: // changeNoteInUse ! 131: // ! 132: //********************************************************************************* ! 133: ! 134: bool IOPMchangeNoteList::changeNoteInUse ( unsigned long ordinal ) ! 135: { ! 136: if ( changeNote[ordinal].flags == IOPMNotInUse ) { ! 137: return false; ! 138: } ! 139: else { ! 140: return true; ! 141: } ! 142: } ! 143: ! 144: //********************************************************************************* ! 145: // nextChangeNote ! 146: // ! 147: // If the parameter corresponds to the most recent power change notification ! 148: // passed to drivers and children, return -1. Otherwise, return the array ! 149: // position of the next notification in the circular list. ! 150: //********************************************************************************* ! 151: ! 152: long IOPMchangeNoteList::nextChangeNote ( unsigned long ordinal ) ! 153: { ! 154: unsigned long i; ! 155: ! 156: i = increment(ordinal); ! 157: if ( i == firstUnused) { ! 158: return -1; ! 159: } ! 160: return ( i ); ! 161: } ! 162: ! 163: //********************************************************************************* ! 164: // increment ! 165: // ! 166: // Increment the parameter mod the circular list size and return it. ! 167: //********************************************************************************* ! 168: ! 169: unsigned long IOPMchangeNoteList::increment ( unsigned long ordinal ) ! 170: { ! 171: if ( ordinal == (IOPMMaxChangeNotes - 1) ) { ! 172: return 0; ! 173: } ! 174: else { ! 175: return ordinal + 1; ! 176: } ! 177: } ! 178: ! 179: //********************************************************************************* ! 180: // decrement ! 181: // ! 182: // Decrement the parameter mod the circular list size and return it. ! 183: //********************************************************************************* ! 184: ! 185: unsigned long IOPMchangeNoteList::decrement ( unsigned long ordinal ) ! 186: { ! 187: if ( ordinal == 0 ) { ! 188: return IOPMMaxChangeNotes - 1; ! 189: } ! 190: else { ! 191: return ordinal - 1; ! 192: } ! 193: } ! 194: ! 195: //********************************************************************************* ! 196: // previousChangeNote ! 197: // ! 198: // If the parameter corresponds to the oldest power change notification ! 199: // passed to drivers and children, return -1. Otherwise, return the array ! 200: // position of the previous notification in the circular list. ! 201: //********************************************************************************* ! 202: ! 203: long IOPMchangeNoteList::previousChangeNote ( unsigned long ordinal ) ! 204: { ! 205: if ( ordinal == firstInList ) { ! 206: return -1; ! 207: } ! 208: return decrement(ordinal); ! 209: } ! 210: ! 211: //********************************************************************************* ! 212: // listEmpty ! 213: // ! 214: //********************************************************************************* ! 215: ! 216: bool IOPMchangeNoteList::listEmpty ( void ) ! 217: { ! 218: return ( firstInList == firstUnused ) ; ! 219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.