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) 1998 Apple Computer, Inc. All rights reserved. 24 * 25 * HISTORY 26 * 27 */ 28 29 #include <IOKit/IOKitDebug.h> 30 #include <IOKit/IOLib.h> 31 #include <IOKit/assert.h> 32 #include <IOKit/IODeviceTreeSupport.h> 33 #include <IOKit/IOService.h> 34 35 #include <libkern/c++/OSContainers.h> 36 #include <libkern/c++/OSCPPDebug.h> 37 38 extern "C" { 39 40 SInt64 gIOKitDebug 41 #ifdef IOKITDEBUG 42 = IOKITDEBUG 43 #endif 44 ; 45 46 int debug_malloc_size; 47 int debug_iomalloc_size; 48 int debug_container_malloc_size; 49 // int debug_ivars_size; // in OSObject.cpp 50 51 void IOPrintPlane( const IORegistryPlane * plane ) 52 { 53 IORegistryEntry * next; 54 IORegistryIterator * iter; 55 OSOrderedSet * all; 56 char format[] = "%xxxs"; 57 IOService * service; 58 59 iter = IORegistryIterator::iterateOver( plane ); 60 assert( iter ); 61 all = iter->iterateAll(); 62 if( all) { 63 IOLog("Count %d\n", all->getCount() ); 64 all->release(); 65 } else 66 IOLog("Empty\n"); 67 68 iter->reset(); 69 while( (next = iter->getNextObjectRecursive())) { 70 sprintf( format + 1, "%ds", next->getDepth( plane )); 71 IOLog( format, ""); 72 if( (service = OSDynamicCast(IOService, next))) 73 IOLog("<%ld>", service->getBusyState()); 74 IOLog( "%s\n", next->getName()); 75 } 76 iter->release(); 77 } 78 79 void IOPrintMemory( void ) 80 { 81 82 // OSMetaClass::printInstanceCounts(); 83 84 IOLog("\n" 85 "ivar kalloc() 0x%08x\n" 86 "malloc() 0x%08x\n" 87 "containers kalloc() 0x%08x\n" 88 "IOMalloc() 0x%08x\n" 89 "----------------------------------------\n", 90 debug_ivars_size, 91 debug_malloc_size, 92 debug_container_malloc_size, 93 debug_iomalloc_size 94 ); 95 } 96 97 } /* extern "C" */ 98 99 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 100 101 #define super OSObject 102 OSDefineMetaClassAndStructors(IOKitDiagnostics, OSObject) 103 104 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 105 106 OSObject * IOKitDiagnostics::diagnostics( void ) 107 { 108 IOKitDiagnostics * diags; 109 110 diags = new IOKitDiagnostics; 111 if( diags && !diags->init()) { 112 diags->release(); 113 diags = 0; 114 } 115 116 return( diags ); 117 } 118 119 void IOKitDiagnostics::updateOffset( OSDictionary * dict, 120 UInt32 value, const char * name ) 121 { 122 OSNumber * off; 123 124 off = OSNumber::withNumber( value, 32 ); 125 if( !off) 126 return; 127 128 dict->setObject( name, off ); 129 off->release(); 130 } 131 132 133 bool IOKitDiagnostics::serialize(OSSerialize *s) const 134 { 135 OSDictionary * dict; 136 bool ok; 137 138 dict = OSDictionary::withCapacity( 5 ); 139 if( !dict) 140 return( false ); 141 142 updateOffset( dict, debug_ivars_size, "Instance allocation" ); 143 updateOffset( dict, debug_container_malloc_size, "Container allocation" ); 144 updateOffset( dict, debug_iomalloc_size, "IOMalloc allocation" ); 145 146 dict->setObject( "Classes", OSMetaClass::getClassDictionary() ); 147 148 ok = dict->serialize( s ); 149 150 dict->release(); 151 152 return( ok ); 153 } 154 155 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 156