Annotation of objc/Test/ostats/ObjcImage.m, revision 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.0 (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: 
        !            25: #import <objc/Storage.h>
        !            26: #import <objc/List.h>
        !            27: #import <objc/HashTable.h>
        !            28: #import <objc/objc-runtime.h>
        !            29: 
        !            30: 
        !            31: #import "RegionManager.h"
        !            32: #import "ObjcImage.h"
        !            33: #import <sys/loader.h>
        !            34: 
        !            35: struct section *getsectbynamefromheader(struct mach_header *, char *, char *);
        !            36: 
        !            37: @implementation ObjcImage
        !            38: 
        !            39: 
        !            40: + newFromHeader:(struct mach_header *)mh
        !            41: {
        !            42:        self = [super new];
        !            43:        machhdr = mh;
        !            44:        pagehash = [HashTable newKeyDesc:"i"];
        !            45:        instanceCachePageHash = [HashTable newKeyDesc:"i"];
        !            46:        classCachePageHash = [HashTable newKeyDesc:"i"];
        !            47:        return self;    
        !            48: }
        !            49: 
        !            50: - regionManager:region
        !            51: {
        !            52:        regionManager = region;
        !            53:        return self;
        !            54: }
        !            55: 
        !            56: - getModules
        !            57: {
        !            58:        Module mod;
        !            59:        Symtab symtab;
        !            60: 
        !            61:        modPtr = [regionManager 
        !            62:                                getSectData: SEG_OBJC 
        !            63:                                section: SECT_OBJC_MODULES 
        !            64:                                size: &modSize 
        !            65:                                forHeader: machhdr]; 
        !            66: 
        !            67:        //printf("%x\n",modPtr+modSize);
        !            68: 
        !            69:        for (   mod = modPtr; 
        !            70:                mod < (STR)modPtr + modSize;  
        !            71:                mod = (Module)((STR)mod + mod->size)) {
        !            72:                        char *name = mod->name;
        !            73:                        int idx;
        !            74: 
        !            75:                        /* relocate module */
        !            76:                        mod->name = WARP(mod->name);
        !            77:                        //printf("module = %x, %s (%x, %x)\n",mod,mod->name, UNWARP(mod->name), name);
        !            78: 
        !            79:                        if (symtab = mod->symtab = WARP(mod->symtab)) {
        !            80: 
        !            81:                                /* collect some statistics */
        !            82:                                n_selrefs += symtab->sel_ref_cnt;
        !            83:                                n_classes += symtab->cls_def_cnt;
        !            84:                                n_categories += symtab->cat_def_cnt;
        !            85: 
        !            86:                                /* relocate classes */
        !            87:                                for (idx = 0; idx < symtab->cls_def_cnt; idx++) {
        !            88: 
        !            89:                                        Class myClass, myMetaClass;
        !            90:                                        struct objc_method_list *methods;
        !            91:                                        void *page;
        !            92: 
        !            93:                                        page = (unsigned int)symtab->defs[idx] - 
        !            94:                                                        ((unsigned int)symtab->defs[idx] % 0x2000);
        !            95:                                        [pagehash insertKey:page value:symtab->defs[idx]];
        !            96: 
        !            97:                                        if (myClass = symtab->defs[idx] = WARP(symtab->defs[idx])) {
        !            98:                                                myClass->name = WARP(myClass->name);
        !            99:                                                myMetaClass = myClass->isa = WARP(myClass->isa);
        !           100:                                                if (CLS_GETINFO(myMetaClass, CLS_INITIALIZED))
        !           101:                                                        n_classesInUse++;
        !           102: 
        !           103:                                                /* relocate instance methods */                                         myClass->methods = methods = WARP(myClass->methods);
        !           104:                                                if (methods)
        !           105:                                                                n_instanceMethods += methods->method_count;
        !           106: 
        !           107:                                                while (methods && methods->method_next) {
        !           108:                                                        /* we have some categories */                                                   methods->method_next = methods =                                                                        WARP(methods->method_next);                                                     if (methods)
        !           109:                                                                n_instanceMethods += methods->method_count;
        !           110:                                                }
        !           111: 
        !           112:                                                /* relocate instance method cache */
        !           113:                                                if (myClass->cache) {
        !           114:                                                                page = (unsigned int)myClass->cache - 
        !           115:                                                                        ((unsigned int)myClass->cache % 0x2000);
        !           116:                                                                [instanceCachePageHash
        !           117:                                                                         insertKey:page value:myClass->cache];
        !           118: 
        !           119:                                                                myClass->cache = WARP(myClass->cache);
        !           120:                                                                                                                                                n_instanceCacheSlots += (myClass->cache->mask+1);
        !           121:                                                                n_instanceCacheOccupied += myClass->cache->occupied;
        !           122:                                                                n_instanceCache++;                                              }
        !           123: 
        !           124:                                                /* relocate class methods */                                            myMetaClass->methods = methods = WARP(myMetaClass->methods);
        !           125:                                                if (methods)
        !           126:                                                                n_classMethods += methods->method_count;
        !           127: 
        !           128:                                                while (methods && methods->method_next) {
        !           129:                                                        /* we have some categories */                                                   methods->method_next = methods =                                                                        WARP(methods->method_next);                                                     if (methods)
        !           130:                                                                n_classMethods += methods->method_count;
        !           131:                                                }
        !           132:                                                
        !           133:                                                /* relocate class method cache */
        !           134:                                                if (myMetaClass->cache) {
        !           135:                                                                                                                                                page = (unsigned int)myMetaClass->cache - 
        !           136:                                                                        ((unsigned int)myMetaClass->cache % 0x2000);
        !           137:                                                                [classCachePageHash
        !           138:                                                                         insertKey:page value:myMetaClass->cache];
        !           139: 
        !           140:                                                                myMetaClass->cache = WARP(myMetaClass->cache);
        !           141:                                                                                                                                                n_classCacheSlots += (myMetaClass->cache->mask+1);
        !           142:                                                                n_classCacheOccupied += myMetaClass->cache->occupied;
        !           143:                                                                n_classCache++;                                         }
        !           144: 
        !           145:                                                                                                                                //printf("class = %s\n",myClass->name);
        !           146:                                        }
        !           147:                                }
        !           148: 
        !           149:                                /* relocate categories */
        !           150:                                for (idx = 0; idx < symtab->cat_def_cnt; idx++) {
        !           151: 
        !           152:                                        Category myCategory;
        !           153: 
        !           154:                                        if (myCategory = symtab->defs[idx + symtab->cls_def_cnt] = 
        !           155:                                                                WARP(symtab->defs[idx + symtab->cls_def_cnt])) {
        !           156:                                                myCategory->category_name = WARP(myCategory->category_name);
        !           157:                                                //printf("category = %s\n",myCategory->category_name);
        !           158:                                        }
        !           159:                                }
        !           160:                        }
        !           161:                }
        !           162:        printf("\n************************************************"
        !           163:                "*************************\n");
        !           164:        if (machhdr->filetype == MH_EXECUTE)
        !           165:                printf("\nApplication image statistics\n\n");
        !           166:        else if (machhdr->filetype == MH_FVMLIB) {
        !           167:                printf("\nShared library image statistics for %s\n\n", WARP((char *)machhdr->flags));
        !           168:        }
        !           169:                
        !           170:        printf("%d classes (%d categories) - class descriptors spread across %d pages.\n", 
        !           171:                                n_classes, n_categories, [pagehash count]);
        !           172:        printf("%d classes currently in use\n", n_classesInUse);
        !           173:        printf("%d instance methods, %d class methods\n",n_instanceMethods, n_classMethods);
        !           174:        printf("%d selector references\n",n_selrefs);
        !           175: 
        !           176:        printf("\nMethod Cache Info (caches are dynamically allocated):\n\n");
        !           177:        if (n_instanceCache) {
        !           178:                printf("%d instance caches - caches spread across %d pages.\n",
        !           179:                                n_instanceCache, [instanceCachePageHash count]);
        !           180:                printf("%d currently in use / %d method slots (%3.2f%% full).\n",
        !           181:                        n_instanceCacheOccupied, n_instanceCacheSlots,
        !           182:                        (float)n_instanceCacheOccupied/n_instanceCacheSlots * 100);
        !           183:                printf("%d bytes to cache instance methods ",
        !           184:                        ((n_instanceCache * sizeof(struct objc_cache)) + 
        !           185:                                                (n_instanceCacheSlots * sizeof(Method))));
        !           186:                printf("(%d bytes per class)\n",
        !           187:                                ((n_instanceCache * sizeof(struct objc_cache)) + 
        !           188:                                                (n_instanceCacheSlots * sizeof(Method)))/n_instanceCache);
        !           189:        }
        !           190:        if (n_classCache) {
        !           191:                printf("%d class caches - caches spread across %d pages.\n",
        !           192:                                n_classCache, [classCachePageHash count]);
        !           193:                printf("%d currently in use / %d method slots (%3.2f%% full).\n",
        !           194:                        n_classCacheOccupied, n_classCacheSlots,
        !           195:                        (float)n_classCacheOccupied/n_classCacheSlots * 100);
        !           196:                printf("%d bytes to cache class methods ",
        !           197:                        ((n_classCache * sizeof(struct objc_cache)) + 
        !           198:                                                (n_classCacheSlots * sizeof(Method))));
        !           199:                printf("(%d bytes per meta class)\n",
        !           200:                                ((n_classCache * sizeof(struct objc_cache)) + 
        !           201:                                                (n_classCacheSlots * sizeof(Method)))/n_classCache);
        !           202:        }
        !           203:        return self;
        !           204: }
        !           205: 
        !           206: 
        !           207: @end
        !           208: 
        !           209: 
        !           210: 
        !           211: 
        !           212: 
        !           213: 
        !           214: 
        !           215: 
        !           216: 
        !           217: 
        !           218: 
        !           219: 

unix.superglobalmegacorp.com

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