|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 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: /* OSObject.cpp created by gvdl on Fri 1998-11-17 */ ! 23: ! 24: #include <libkern/c++/OSObject.h> ! 25: #include <libkern/c++/OSSerialize.h> ! 26: #include <libkern/c++/OSLib.h> ! 27: #include <libkern/c++/OSCPPDebug.h> ! 28: #include <libkern/OSAtomic.h> ! 29: ! 30: __BEGIN_DECLS ! 31: int debug_ivars_size; ! 32: __END_DECLS ! 33: ! 34: #ifdef DEBUG ! 35: #define ACCUMSIZE(s) do { debug_ivars_size += (s); } while(0) ! 36: #else ! 37: #define ACCUMSIZE(s) ! 38: #endif ! 39: ! 40: /* MetaClass bootstrap for the Top level object */ ! 41: class OSObjectMetaClass : public OSMetaClass { ! 42: public: ! 43: OSObjectMetaClass() : OSMetaClass("OSObject", "", sizeof(OSObject)) { }; ! 44: virtual OSObject *alloc() const; ! 45: }; ! 46: ! 47: OSObject *OSObjectMetaClass::alloc() const { return 0; } ! 48: ! 49: static OSObjectMetaClass sOSObjectMetaClass; ! 50: ! 51: const OSMetaClass * const ! 52: OSObject::metaClass = &sOSObjectMetaClass; ! 53: const OSMetaClass * ! 54: OSObject::getMetaClass() const { return &sOSObjectMetaClass; } ! 55: ! 56: OSObject::OSObject() ! 57: { ! 58: retainCount = 1; ! 59: } ! 60: ! 61: OSObject::OSObject(const OSMetaClass *) ! 62: { ! 63: retainCount = 1; ! 64: } ! 65: ! 66: OSObject::~OSObject() ! 67: { ! 68: void **thisVTable; ! 69: ! 70: thisVTable = (void **) ! 71: ((char *) this + sizeof(OSObject) - sizeof(thisVTable)); ! 72: *thisVTable = (void *) -1UL; ! 73: } ! 74: ! 75: bool OSObject::init() ! 76: { ! 77: return true; ! 78: } ! 79: ! 80: void OSObject::free() ! 81: { ! 82: const OSMetaClass *meta = getMetaClass(); ! 83: ! 84: if (meta) ! 85: meta->instanceDestructed(); ! 86: delete this; ! 87: } ! 88: ! 89: OSObject *OSObject::metaCast(const OSMetaClass *toMeta) const ! 90: { ! 91: return toMeta->checkMetaCast((OSObject *) this); ! 92: } ! 93: ! 94: OSObject *OSObject::metaCast(const OSSymbol *toMetaSymb) const ! 95: { ! 96: return OSMetaClass::checkMetaCastWithName(toMetaSymb, this); ! 97: } ! 98: ! 99: OSObject *OSObject::metaCast(const OSString *toMetaStr) const ! 100: { ! 101: return OSMetaClass::checkMetaCastWithName(toMetaStr, this); ! 102: } ! 103: ! 104: OSObject *OSObject::metaCast(const char *toMetaCStr) const ! 105: { ! 106: return OSMetaClass::checkMetaCastWithName(toMetaCStr, this); ! 107: } ! 108: ! 109: int OSObject::getRetainCount() const ! 110: { ! 111: return retainCount; ! 112: } ! 113: ! 114: void OSObject::retain() const ! 115: { ! 116: OSIncrementAtomic((SInt32 *)&(((OSObject *) this)->retainCount)); ! 117: } ! 118: ! 119: void OSObject::release(int when) const ! 120: { ! 121: if (OSDecrementAtomic((SInt32 *)&(((OSObject *) this)->retainCount)) <= when) ! 122: ((OSObject *) this)->free(); ! 123: } ! 124: ! 125: void OSObject::release() const ! 126: { ! 127: release(1); ! 128: } ! 129: ! 130: bool OSObject::isEqualTo(const OSObject *anObj) const ! 131: { ! 132: return this == anObj; ! 133: } ! 134: ! 135: bool OSObject::serialize(OSSerialize *s) const ! 136: { ! 137: if (s->previouslySerialized(this)) return true; ! 138: ! 139: if (!s->addXMLStartTag(this, "string")) return false; ! 140: ! 141: const OSMetaClass *meta = getMetaClass(); ! 142: if (meta) { ! 143: if (!s->addString(meta->getClassName())) return false; ! 144: } else { ! 145: if (!s->addString("unknown class ?")) return false; ! 146: } ! 147: if (!s->addString(" is not serializable")) return false; ! 148: ! 149: return s->addXMLEndTag("string"); ! 150: } ! 151: ! 152: void *OSObject::operator new(size_t size) ! 153: { ! 154: void *mem = (void *)kalloc(size); ! 155: assert(mem); ! 156: bzero(mem, size); ! 157: ! 158: ACCUMSIZE(size); ! 159: ! 160: return mem; ! 161: } ! 162: ! 163: void OSObject::operator delete(void *mem, size_t size) ! 164: { ! 165: kfree((vm_offset_t)mem, size); ! 166: ! 167: ACCUMSIZE(-size); ! 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.