Mercurial > hg > truffle
annotate src/share/vm/prims/hpi_imported.h @ 1716:be3f9c242c9d
6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode.
Reviewed-by: chrisphi, johnc, poonam
author | ysr |
---|---|
date | Mon, 16 Aug 2010 15:58:42 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
2 * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 /* | |
26 * HotSpot integration note: | |
27 * | |
28 * This is a consolidation of these two files: | |
29 * src/share/hpi/export/hpi.h 1.15 99/06/18 JDK1.3 beta build I | |
30 * src/share/hpi/export/dll.h 1.3 98/09/15 JDK1.3 beta build I | |
31 * from the classic VM. | |
32 * | |
33 * bool_t is a type in the classic VM, and we define it here, | |
34 * but in the future this should be a jboolean. | |
35 * | |
36 * The files are included verbatim expect for local includes removed from hpi.h. | |
37 */ | |
38 | |
39 #ifndef _JAVASOFT_HPI_H_ | |
40 #define _JAVASOFT_HPI_H_ | |
41 | |
42 #ifdef __cplusplus | |
43 extern "C" { | |
44 #endif | |
45 | |
46 /* A classic VMism that should become a jboolean. Fix in 1.2.1? */ | |
47 typedef enum { HPI_FALSE = 0, HPI_TRUE = 1 } bool_t; | |
48 | |
49 /* | |
50 * DLL.H: A common interface for helper DLLs loaded by the VM. | |
51 * Each library exports the main entry point "DLL_Initialize". Through | |
52 * that function the programmer can obtain a function pointer which has | |
53 * type "GetInterfaceFunc." Through the function pointer the programmer | |
54 * can obtain other interfaces supported in the DLL. | |
55 */ | |
56 typedef jint (JNICALL * GetInterfaceFunc) | |
57 (void **intfP, const char *name, jint ver); | |
58 | |
59 jint JNICALL DLL_Initialize(GetInterfaceFunc *, void *args); | |
60 | |
61 | |
62 /* | |
63 * Host Porting Interface. This defines the "porting layer" for | |
64 * POSIX.1 compliant operating systems. | |
65 */ | |
66 | |
67 /* | |
68 * memory allocations | |
69 */ | |
70 typedef struct { | |
71 /* | |
72 * Malloc must return a unique pointer if size == 0. | |
73 */ | |
74 void * (*Malloc)(size_t size); | |
75 void * (*Realloc)(void *ptr, size_t new_size); | |
76 /* | |
77 * Free must allow ptr == NULL to be a no-op. | |
78 */ | |
79 void (*Free)(void *ptr); | |
80 /* | |
81 * Calloc must return a unique pointer for if | |
82 * n_item == 0 || item_size == 0. | |
83 */ | |
84 void * (*Calloc)(size_t n_item, size_t item_size); | |
85 char * (*Strdup)(const char *str); | |
86 | |
87 void * (*MapMem)(size_t req_size, size_t *maped_size); | |
88 void * (*UnmapMem)(void *req_addr, size_t req_size, size_t *unmap_size); | |
89 /* | |
90 * CommitMem should round the ptr down to the nearest page and | |
91 * round the size up to the nearest page so that the committed | |
92 * region is at least as large as the requested region. | |
93 */ | |
94 void * (*CommitMem)(void *ptr, size_t size, size_t *actual); | |
95 /* | |
96 * sysDecommitMem should round the ptr up to the nearest page and | |
97 * round the size down to the nearest page so that the decommitted | |
98 * region is no greater than the requested region. | |
99 */ | |
100 void * (*DecommitMem)(void *ptr, size_t size, size_t *actual); | |
101 | |
102 #define HPI_PAGE_ALIGNMENT (64 * 1024) | |
103 | |
104 void * (*AllocBlock)(size_t size, void **headP); | |
105 void (*FreeBlock)(void *head); | |
106 } HPI_MemoryInterface; | |
107 | |
108 /* | |
109 * dynamic linking libraries | |
110 */ | |
111 typedef struct { | |
112 void (*BuildLibName)(char *buf, int buf_len, char *path, const char *name); | |
113 int (*BuildFunName)(char *name, int name_len, int arg_size, int en_idx); | |
114 | |
115 void * (*LoadLibrary)(const char *name, char *err_buf, int err_buflen); | |
116 void (*UnloadLibrary)(void *lib); | |
117 void * (*FindLibraryEntry)(void *lib, const char *name); | |
118 } HPI_LibraryInterface; | |
119 | |
120 typedef void (*signal_handler_t)(int sig, void *siginfo, void *context); | |
121 | |
122 #define HPI_SIG_DFL (signal_handler_t)0 | |
123 #define HPI_SIG_ERR (signal_handler_t)-1 | |
124 #define HPI_SIG_IGN (signal_handler_t)1 | |
125 | |
126 typedef struct { | |
127 char *name; /* name such as green/native threads. */ | |
128 int isMP; | |
129 } HPI_SysInfo; | |
130 | |
131 typedef struct { | |
132 HPI_SysInfo * (*GetSysInfo)(void); | |
133 long (*GetMilliTicks)(void); | |
134 jlong (*TimeMillis)(void); | |
135 | |
136 signal_handler_t (*Signal)(int sig, signal_handler_t handler); | |
137 void (*Raise)(int sig); | |
138 void (*SignalNotify)(int sig); | |
139 int (*SignalWait)(void); | |
140 | |
141 int (*Shutdown)(void); | |
142 | |
143 int (*SetLoggingLevel)(int level); | |
144 bool_t (*SetMonitoringOn)(bool_t on); | |
145 int (*GetLastErrorString)(char *buf, int len); | |
146 } HPI_SystemInterface; | |
147 | |
148 /* | |
149 * threads and monitors | |
150 */ | |
151 typedef struct sys_thread sys_thread_t; | |
152 typedef struct sys_mon sys_mon_t; | |
153 | |
154 #define HPI_OK 0 | |
155 #define HPI_ERR -1 | |
156 #define HPI_INTRPT -2 /* Operation was interrupted */ | |
157 #define HPI_TIMEOUT -3 /* A timer ran out */ | |
158 #define HPI_NOMEM -5 /* Ran out of memory */ | |
159 #define HPI_NORESOURCE -6 /* Ran out of some system resource */ | |
160 | |
161 /* There are three basic states: RUNNABLE, MONITOR_WAIT, and CONDVAR_WAIT. | |
162 * When the thread is suspended in any of these states, the | |
163 * HPI_THREAD_SUSPENDED bit will be set | |
164 */ | |
165 enum { | |
166 HPI_THREAD_RUNNABLE = 1, | |
167 HPI_THREAD_MONITOR_WAIT, | |
168 HPI_THREAD_CONDVAR_WAIT | |
169 }; | |
170 | |
171 #define HPI_MINIMUM_PRIORITY 1 | |
172 #define HPI_MAXIMUM_PRIORITY 10 | |
173 #define HPI_NORMAL_PRIORITY 5 | |
174 | |
175 #define HPI_THREAD_SUSPENDED 0x8000 | |
176 #define HPI_THREAD_INTERRUPTED 0x4000 | |
177 | |
178 typedef struct { | |
179 sys_thread_t *owner; | |
180 int entry_count; | |
181 sys_thread_t **monitor_waiters; | |
182 sys_thread_t **condvar_waiters; | |
183 int sz_monitor_waiters; | |
184 int sz_condvar_waiters; | |
185 int n_monitor_waiters; | |
186 int n_condvar_waiters; | |
187 } sys_mon_info; | |
188 | |
189 typedef struct { | |
190 int (*ThreadBootstrap)(sys_thread_t **tidP, | |
191 sys_mon_t **qlockP, | |
192 int nReservedBytes); | |
193 int (*ThreadCreate)(sys_thread_t **tidP, | |
194 long stk_size, | |
195 void (*func)(void *), | |
196 void *arg); | |
197 sys_thread_t * (*ThreadSelf)(void); | |
198 void (*ThreadYield)(void); | |
199 int (*ThreadSuspend)(sys_thread_t *tid); | |
200 int (*ThreadResume)(sys_thread_t *tid); | |
201 int (*ThreadSetPriority)(sys_thread_t *tid, int prio); | |
202 int (*ThreadGetPriority)(sys_thread_t *tid, int *prio); | |
203 void * (*ThreadStackPointer)(sys_thread_t *tid); | |
204 void * (*ThreadStackTop)(sys_thread_t *tid); | |
205 long * (*ThreadRegs)(sys_thread_t *tid, int *regs); | |
206 int (*ThreadSingle)(void); | |
207 void (*ThreadMulti)(void); | |
208 int (*ThreadEnumerateOver)(int (*func)(sys_thread_t *, void *), | |
209 void *arg); | |
210 int (*ThreadCheckStack)(void); | |
211 void (*ThreadPostException)(sys_thread_t *tid, void *arg); | |
212 void (*ThreadInterrupt)(sys_thread_t *tid); | |
213 int (*ThreadIsInterrupted)(sys_thread_t *tid, int clear); | |
214 int (*ThreadAlloc)(sys_thread_t **tidP); | |
215 int (*ThreadFree)(void); | |
216 jlong (*ThreadCPUTime)(void); | |
217 int (*ThreadGetStatus)(sys_thread_t *tid, sys_mon_t **monitor); | |
218 void * (*ThreadInterruptEvent)(void); | |
219 void * (*ThreadNativeID)(sys_thread_t *tid); | |
220 | |
221 /* These three functions are used by the CPU time profiler. | |
222 * sysThreadIsRunning determines whether the thread is running (not just | |
223 * runnable). It is only safe to call this function after calling | |
224 * sysThreadProfSuspend. | |
225 */ | |
226 bool_t (*ThreadIsRunning)(sys_thread_t *tid); | |
227 void (*ThreadProfSuspend)(sys_thread_t *tid); | |
228 void (*ThreadProfResume)(sys_thread_t *tid); | |
229 | |
230 int (*AdjustTimeSlice)(int ms); | |
231 | |
232 size_t (*MonitorSizeof)(void); | |
233 int (*MonitorInit)(sys_mon_t *mid); | |
234 int (*MonitorDestroy)(sys_mon_t *mid); | |
235 int (*MonitorEnter)(sys_thread_t *self, sys_mon_t *mid); | |
236 bool_t (*MonitorEntered)(sys_thread_t *self, sys_mon_t *mid); | |
237 int (*MonitorExit)(sys_thread_t *self, sys_mon_t *mid); | |
238 int (*MonitorNotify)(sys_thread_t *self, sys_mon_t *mid); | |
239 int (*MonitorNotifyAll)(sys_thread_t *self, sys_mon_t *mid); | |
240 int (*MonitorWait)(sys_thread_t *self, sys_mon_t *mid, jlong ms); | |
241 bool_t (*MonitorInUse)(sys_mon_t *mid); | |
242 sys_thread_t * (*MonitorOwner)(sys_mon_t *mid); | |
243 int (*MonitorGetInfo)(sys_mon_t *mid, sys_mon_info *info); | |
244 | |
245 } HPI_ThreadInterface; | |
246 | |
247 /* | |
248 * files | |
249 */ | |
250 | |
251 #define HPI_FILETYPE_REGULAR (0) | |
252 #define HPI_FILETYPE_DIRECTORY (1) | |
253 #define HPI_FILETYPE_OTHER (2) | |
254 | |
255 typedef struct { | |
256 char * (*NativePath)(char *path); | |
257 int (*FileType)(const char *path); | |
258 int (*Open)(const char *name, int openMode, int filePerm); | |
259 int (*Close)(int fd); | |
260 jlong (*Seek)(int fd, jlong offset, int whence); | |
261 int (*SetLength)(int fd, jlong length); | |
262 int (*Sync)(int fd); | |
263 int (*Available)(int fd, jlong *bytes); | |
264 size_t (*Read)(int fd, void *buf, unsigned int nBytes); | |
265 size_t (*Write)(int fd, const void *buf, unsigned int nBytes); | |
266 int (*FileSizeFD)(int fd, jlong *size); | |
267 } HPI_FileInterface; | |
268 | |
269 /* | |
270 * sockets | |
271 */ | |
272 struct sockaddr; | |
273 struct hostent; | |
274 | |
275 typedef struct { | |
276 int (*Close)(int fd); | |
277 long (*Available)(int fd, jint *pbytes); | |
278 int (*Connect)(int fd, struct sockaddr *him, int len); | |
279 int (*Accept)(int fd, struct sockaddr *him, int *len); | |
280 int (*SendTo)(int fd, char *buf, int len, int flags, | |
281 struct sockaddr *to, int tolen); | |
282 int (*RecvFrom)(int fd, char *buf, int nbytes, int flags, | |
283 struct sockaddr *from, int *fromlen); | |
284 int (*Listen)(int fd, long count); | |
285 int (*Recv)(int fd, char *buf, int nBytes, int flags); | |
286 int (*Send)(int fd, char *buf, int nBytes, int flags); | |
287 int (*Timeout)(int fd, long timeout); | |
288 struct hostent * (*GetHostByName)(char *hostname); | |
289 int (*Socket)(int domain, int type, int protocol); | |
290 int (*SocketShutdown)(int fd, int howto); | |
291 int (*Bind)(int fd, struct sockaddr *him, int len); | |
292 int (*GetSocketName)(int fd, struct sockaddr *him, int *len); | |
293 int (*GetHostName)(char *hostname, int namelen); | |
294 struct hostent * (*GetHostByAddr)(const char *hostname, int len, int type); | |
295 int (*SocketGetOption)(int fd, int level, int optname, char *optval, int *optlen); | |
296 int (*SocketSetOption)(int fd, int level, int optname, const char *optval, int optlen); | |
297 struct protoent * (*GetProtoByName)(char* name); | |
298 } HPI_SocketInterface; | |
299 | |
300 /* | |
301 * callbacks. | |
302 */ | |
303 typedef struct vm_calls { | |
304 int (*jio_fprintf)(FILE *fp, const char *fmt, ...); | |
305 void (*panic)(const char *fmt, ...); | |
306 void (*monitorRegister)(sys_mon_t *mid, char *info_str); | |
307 | |
308 void (*monitorContendedEnter)(sys_thread_t *self, sys_mon_t *mid); | |
309 void (*monitorContendedEntered)(sys_thread_t *self, sys_mon_t *mid); | |
310 void (*monitorContendedExit)(sys_thread_t *self, sys_mon_t *mid); | |
311 } vm_calls_t; | |
312 | |
313 #ifdef __cplusplus | |
314 } | |
315 #endif | |
316 | |
317 #endif /* !_JAVASOFT_HPI_H_ */ |