|
|
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: * objc-private.h
26: * Copyright 1988, NeXT, Inc.
27: */
28:
29: #ifndef _OBJC_PRIVATE_H_
30: #define _OBJC_PRIVATE_H_
31:
32: #import "objc-config.h"
33:
34: #ifdef KERNEL
35: #import <mach/mach_types.h>
36: #import <mach/machine/simple_lock.h>
37:
38: #define mutex_alloc() simple_lock_alloc()
39: #define mutex_init(x) simple_lock_init(x)
40: #define mutex_lock(x) simple_lock(x)
41: #define mutex_try_lock(x) simple_lock_try(x)
42: #define mutex_unlock(x) simple_unlock(x)
43: #define mutex_clear(x)
44: #define mutex slock
45: #define mutex_t simple_lock_t
46: #else /* KERNEL */
47: #import <mach/cthreads.h>
48: #endif /* KERNEL */
49:
50: #import <stdlib.h>
51: #import <stdarg.h>
52: #import <stdio.h>
53: #import <string.h>
54: #import <ctype.h>
55:
56: #import "objc.h"
57: #import "objc-runtime.h"
58: #import "hashtable.h"
59:
60: #import <sys/time.h>
61:
62: struct header_info
63: {
64: const struct mach_header *mhdr;
65: Module mod_ptr;
66: unsigned int mod_count;
67: void *frozenTable;
68: unsigned long image_slide;
69: unsigned int objcSize;
70: };
71: extern struct header_info *_objc_headerVector (const struct mach_header * const *machhdrs);
72: extern unsigned int _objc_headerCount (void);
73: extern void _objc_addHeader (const struct mach_header *header, long vmaddr_slide);
74: extern void _objc_removeHeader (const struct mach_header *header);
75: extern SEL __S(_sel_registerName)(const char *str);
76:
77: /* utilities */
78: static inline unsigned int _objc_strhash (const unsigned char *s)
79: {
80: unsigned int hash = 0;
81:
82: /* Unroll the loop. */
83: while (1)
84: {
85: if (*s == '\0')
86: break;
87: hash ^= *s++;
88: if (*s == '\0')
89: break;
90: hash ^= *s++ << 8;
91: if (*s == '\0')
92: break;
93: hash ^= *s++ << 16;
94: if (*s == '\0')
95: break;
96: hash ^= *s++ << 24;
97: }
98:
99: return hash;
100: }
101:
102: extern const char *__S(_nameForHeader) (const struct mach_header *);
103:
104: /* debug */
105: extern int gettime(void);
106: extern void print_time(const char *, int, struct timeval *);
107:
108: /* initialize */
109: extern void __S(_sel_init) (const struct mach_header *,
110: const char *, unsigned int, void *);
111: extern void __S(_sel_unloadSelectors)(const char *, const char *);
112: extern void _class_install_relationships(Class, long);
113: extern void _objc_add_category(Category, int);
114: extern void _objc_remove_category(Category, int);
115: extern void _class_removeProtocols(Class, struct objc_protocol_list *);
116: extern NXZone *_objc_create_zone(void);
117: extern void _objc_removeClass(Class);
118:
119: /* method lookup */
120: extern BOOL class_respondsToMethod(Class, SEL);
121: extern IMP class_lookupMethod(Class, SEL);
122: extern IMP class_lookupMethodInMethodList(struct objc_method_list *mlist,
123: SEL sel);
124:
125: /* message dispatcher */
126: extern Cache _cache_create(Class);
127: extern IMP _class_lookupMethodAndLoadCache(Class, SEL);
128: extern id _objc_msgForward (id self, SEL sel, ...);
129:
130: /* errors */
131: volatile void __S(_objc_fatal)(const char *message);
132: extern volatile void _objc_error(id, const char *, va_list);
133: extern volatile void __objc_error(id, const char *, ...);
134: extern void _objc_inform(const char *fmt, ...);
135: extern void _NXLogError(const char *format, ...);
136:
137: /* magic */
138: extern Class _objc_getFreedObjectClass (void);
139: extern Class _objc_getNonExistentClass (void);
140: extern const struct objc_cache emptyCache;
141: extern void _objc_flush_caches (Class cls);
142:
143: /* locking */
144: extern int _objc_multithread_mask;
145: extern struct mutex classLock;
146: extern struct mutex messageLock;
147:
148: #ifdef KERNEL
149: #ifdef hppa /* The sense of kernel locks on the hp are backwards! */
150: #define OBJC_DECLARE_LOCK(MUTEX) struct slock MUTEX = { -1,-1,-1,-1 }
151: #elif defined(ppc)
152: #define OBJC_DECLARE_LOCK(MUTEX) struct slock MUTEX = { 0, 0, 0, 0 }
153: #else
154: #define OBJC_DECLARE_LOCK(MUTEX) struct slock MUTEX = { 0 }
155: #endif hppa
156: #define OBJC_LOCK(MUTEX)
157: #define OBJC_UNLOCK(MUTEX)
158: #define OBJC_TRYLOCK(MUTEX) 1
159:
160: #else /* KERNEL */
161:
162: #define OBJC_DECLARE_LOCK(MUTEX) struct mutex MUTEX = { 0, #MUTEX }
163:
164: #ifdef FREEZE
165: #define OBJC_LOCK(MUTEX)
166: #define OBJC_UNLOCK(MUTEX)
167: #else /* FREEZE */
168: #ifdef OBJC_COLLECTING_CACHE
169: #define OBJC_LOCK(MUTEX) mutex_lock (MUTEX)
170: #define OBJC_UNLOCK(MUTEX) mutex_unlock (MUTEX)
171: #define OBJC_TRYLOCK(MUTEX) mutex_try_lock (MUTEX)
172: #else
173: #define OBJC_LOCK(MUTEX) \
174: do \
175: { \
176: if (!_objc_multithread_mask) \
177: mutex_lock (MUTEX); \
178: } \
179: while (0)
180:
181: #define OBJC_UNLOCK(MUTEX) \
182: do \
183: { \
184: if (!_objc_multithread_mask) \
185: mutex_unlock (MUTEX); \
186: } \
187: while (0)
188:
189: #endif /* OBJC_COLLECTING_CACHE */
190: #endif /* FREEZE */
191: #endif /* KERNEL */
192:
193: #endif /* _OBJC_PRIVATE_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.