00001 #ifndef _thread_h_included_
00002 #define _thread_h_included_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 ARCH_COPYRIGHT_APACHE(thread, h, "$URL: https://svn.apache.org/path/name/thread.h $ $Id: thread.h 0 09/28/2005 dlydick $");
00046
00047
00048 #include <setjmp.h>
00049
00050 #include "jvmreg.h"
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #define THREAD(thridx) pjvm->thread[thridx]
00076
00077 #define CURRENT_THREAD pjvm->current_thread
00078
00079
00080
00081
00082 #define PREV_STATE(thridx) THREAD(thridx).prev_state
00083
00084
00085
00086
00087 #define THIS_STATE(thridx) THREAD(thridx).this_state
00088
00089
00090
00091
00092 #define NEXT_STATE(thridx) THREAD(thridx).next_state
00093
00094
00095
00096
00097 #define REQ_NEXT_STATE(state, thridx) \
00098 threadstate_request_##state(thridx)
00099
00100
00101
00102
00103
00104
00105
00106 #define CURRENT_THREAD_REQUEST_NEXT_STATE(state) \
00107 REQ_NEXT_STATE(state, CURRENT_THREAD)
00108
00109
00110
00111
00112
00113
00114
00115
00116 #define THREAD_REQUEST_NEXT_STATE(state, thridx) \
00117 REQ_NEXT_STATE(state, thridx)
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 #define CURRENT_THREAD_ACTIVATE_THIS_STATE(state) \
00128 threadstate_activate_##state(CURRENT_THREAD)
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 #define THREAD_ACTIVATE_THIS_STATE(state, thridx) \
00140 threadstate_activate_##state(thridx)
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 #define CURRENT_THREAD_PROCESS_THIS_STATE(state) \
00152 threadstate_process_##state(CURRENT_THREAD)
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 #define THREAD_PROCESS_THIS_STATE(state, thridx) \
00163 threadstate_process_##state(thridx)
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 typedef enum
00186 {
00187 THREAD_STATE_NEW = 0,
00188 THREAD_STATE_START = 1,
00189
00190 THREAD_STATE_RUNNABLE = 2,
00191 THREAD_STATE_RUNNING = 3,
00192 THREAD_STATE_COMPLETE = 4,
00193
00194 THREAD_STATE_BLOCKINGEVENT = 5,
00195
00196
00197
00198
00199
00200 THREAD_STATE_BLOCKED = 6,
00201
00202
00203
00204 THREAD_STATE_UNBLOCKED = 7,
00205
00206
00207 THREAD_STATE_SYNCHRONIZED = 8,
00208
00209
00210 THREAD_STATE_RELEASE = 9,
00211
00212
00213 THREAD_STATE_WAIT = 10,
00214
00215
00216
00217
00218 THREAD_STATE_NOTIFY = 11,
00219
00220
00221
00222
00223 THREAD_STATE_LOCK = 12,
00224
00225 THREAD_STATE_ACQUIRE = 13,
00226
00227
00228
00229 THREAD_STATE_DEAD = 14,
00230
00231 THREAD_STATE_BADLOGIC = 15
00232
00233
00234 } thread_state_enum;
00235
00236
00237 #define THREAD_STATE_MIN_STATE THREAD_STATE_NEW
00238
00239 #define THREAD_STATE_MAX_STATE THREAD_STATE_BADLOGIC
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251 typedef enum
00252 {
00253 THREAD_PRIORITY_BAD = 0,
00254 THREAD_PRIORITY_MIN = 1,
00255 THREAD_PRIORITY_NORM = 5,
00256 THREAD_PRIORITY_MAX = 10
00257
00258 } thread_priority_enum;
00259
00260
00261
00262
00263
00264
00265
00266 typedef struct
00267 {
00268
00269
00270
00271 jvm_thread_index id;
00272
00273 rchar *name;
00274
00275
00276 #define THREAD_NAME_MAX_LEN 64
00277
00278 jvm_object_hash thread_objhash;
00279
00280
00281 thread_priority_enum priority;
00282
00283 rushort status;
00284
00285
00286 #define THREAD_STATUS_EMPTY 0x0000
00287
00288
00289
00290
00291
00292
00293
00294 #define THREAD_STATUS_INUSE 0x0001
00295 #define THREAD_STATUS_NULL 0x0002
00296
00297
00298
00299
00300
00301
00302 #define THREAD_STATUS_ISDAEMON 0x0004
00303
00304
00305 #define THREAD_STATUS_SLEEP 0x0008
00306
00307 #define THREAD_STATUS_JOIN4EVER 0x0010
00308
00309
00310 #define THREAD_STATUS_JOINTIMED 0x0020
00311
00312
00313 #define THREAD_STATUS_WAIT4EVER 0x0040
00314
00315
00316 #define THREAD_STATUS_WAITTIMED 0x0080
00317
00318
00319 #define THREAD_STATUS_SUSPEND 0x0100
00320
00321
00322 #define THREAD_STATUS_INTERRUPTIBLEIO 0x0200
00323
00324
00325
00326 #define THREAD_STATUS_NOTIFIED 0x0400
00327
00328
00329 #define THREAD_STATUS_INTERRUPTED 0x0800
00330
00331
00332 #define THREAD_STATUS_THREW_EXCEPTION 0x1000
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 #define THREAD_STATUS_THREW_ERROR 0x2000
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 #define THREAD_STATUS_THREW_THROWABLE 0x4000
00353
00354
00355
00356
00357
00358
00359
00360
00361 #define THREAD_STATUS_THREW_UNCAUGHT 0x8000
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 rchar *pThrowableEvent;
00377
00378
00379
00380
00381
00382 jmp_buf *pnonlocal_ThrowableEvent;
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 thread_state_enum prev_state;
00401
00402
00403
00404 thread_state_enum this_state;
00405
00406
00407 thread_state_enum next_state;
00408
00409
00410
00411 jvm_thread_index jointarget;
00412
00413
00414 volatile jlong sleeptime;
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 jvm_object_hash locktarget;
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439 jvm_pc pc;
00440
00441 ruint pass_instruction_count;
00442
00443
00444
00445
00446 rulong thread_instruction_count;
00447
00448
00449
00450
00451
00452
00453
00454 jint *stack;
00455
00456 jvm_sp sp;
00457
00458 jvm_sp fp;
00459
00460
00461 jvm_sp fp_end_program;
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472 } rthread;
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 extern const rchar *thread_state_name;
00483
00484 #define THREAD_STATE_NEW_DESC "new"
00485 #define THREAD_STATE_START_DESC "started"
00486 #define THREAD_STATE_RUNNABLE_DESC "runnable"
00487 #define THREAD_STATE_RUNNING_DESC "running"
00488 #define THREAD_STATE_COMPLETE_DESC "complete"
00489 #define THREAD_STATE_BLOCKINGEVENT_DESC "blockingevent"
00490 #define THREAD_STATE_BLOCKED_DESC "blocked"
00491 #define THREAD_STATE_UNBLOCKED_DESC "unblocked"
00492 #define THREAD_STATE_SYNCHRONIZED_DESC "synchronized"
00493 #define THREAD_STATE_RELEASE_DESC "release"
00494 #define THREAD_STATE_WAIT_DESC "wait"
00495 #define THREAD_STATE_NOTIFY_DESC "notify"
00496 #define THREAD_STATE_LOCK_DESC "lock"
00497 #define THREAD_STATE_ACQUIRE_DESC "acquire"
00498 #define THREAD_STATE_DEAD_DESC "dead"
00499 #define THREAD_STATE_BADLOGIC_DESC "bad_logic"
00500 #define THREAD_STATE_ILLEGAL_DESC "illegal"
00501
00502
00503
00504
00505
00506
00507 extern const rchar *thread_state_get_name(rushort state);
00508
00509 extern jvm_thread_index thread_class_load(rchar *clsname,
00510 rchar *mthname,
00511 rchar *mthdesc,
00512 rint priority,
00513 rboolean isdaemon,
00514 rboolean usesystemthread,
00515 rboolean find_registerNatives);
00516
00517 extern rvoid thread_init(rvoid);
00518
00519 extern rboolean thread_die(jvm_thread_index thridx);
00520
00521 extern rvoid thread_shutdown(rvoid);
00522
00523 extern int thread_exception_setup(jvm_thread_index thridx);
00524
00525 extern rvoid thread_throw_exception(jvm_thread_index thridx,
00526 rushort thread_status_bits,
00527 rchar *exception_name);
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559 extern rboolean threadstate_request_new(jvm_thread_index thridx);
00560 extern rboolean threadstate_request_start(jvm_thread_index thridx);
00561 extern rboolean threadstate_request_runnable(jvm_thread_index thridx);
00562 extern rboolean threadstate_request_running(jvm_thread_index thridx);
00563 extern rboolean threadstate_request_complete(jvm_thread_index thridx);
00564 extern rboolean threadstate_request_blockingevent(jvm_thread_index
00565 thridx);
00566 extern rboolean threadstate_request_blocked(jvm_thread_index thridx);
00567 extern rboolean threadstate_request_unblocked(jvm_thread_index thridx);
00568 extern rboolean threadstate_request_synchronized(jvm_thread_index
00569 thridx);
00570 extern rboolean threadstate_request_release(jvm_thread_index thridx);
00571 extern rboolean threadstate_request_wait(jvm_thread_index thridx);
00572 extern rboolean threadstate_request_notify(jvm_thread_index thridx);
00573 extern rboolean threadstate_request_lock(jvm_thread_index thridx);
00574 extern rboolean threadstate_request_acquire(jvm_thread_index thridx);
00575 extern rboolean threadstate_request_dead(jvm_thread_index thridx);
00576 extern rboolean threadstate_request_badlogic(jvm_thread_index thridx);
00577
00578 extern rboolean threadstate_activate_new(jvm_thread_index thridx);
00579 extern rboolean threadstate_activate_start(jvm_thread_index thridx);
00580 extern rboolean threadstate_activate_runnable(jvm_thread_index thridx);
00581 extern rboolean threadstate_activate_running(jvm_thread_index thridx);
00582 extern rboolean threadstate_activate_complete(jvm_thread_index thridx);
00583 extern rboolean threadstate_activate_blockingevent(jvm_thread_index
00584 thridx);
00585 extern rboolean threadstate_activate_blocked(jvm_thread_index thridx);
00586 extern rboolean threadstate_activate_unblocked(jvm_thread_index thridx);
00587 extern rboolean threadstate_activate_synchronized(jvm_thread_index
00588 thridx);
00589 extern rboolean threadstate_activate_release(jvm_thread_index thridx);
00590 extern rboolean threadstate_activate_wait(jvm_thread_index thridx);
00591 extern rboolean threadstate_activate_notify(jvm_thread_index thridx);
00592 extern rboolean threadstate_activate_lock(jvm_thread_index thridx);
00593 extern rboolean threadstate_activate_acquire(jvm_thread_index thridx);
00594 extern rboolean threadstate_activate_dead(jvm_thread_index thridx);
00595 extern rboolean threadstate_activate_badlogic(jvm_thread_index thridx);
00596
00597 extern rboolean threadstate_process_new(jvm_thread_index thridx);
00598 extern rboolean threadstate_process_start(jvm_thread_index thridx);
00599 extern rboolean threadstate_process_runnable(jvm_thread_index thridx);
00600 extern rboolean threadstate_process_running(jvm_thread_index thridx);
00601 extern rboolean threadstate_process_complete(jvm_thread_index thridx);
00602 extern rboolean threadstate_process_blockingevent(jvm_thread_index
00603 thridx);
00604 extern rboolean threadstate_process_blocked(jvm_thread_index thridx);
00605 extern rboolean threadstate_process_unblocked(jvm_thread_index thridx);
00606 extern rboolean threadstate_process_synchronized(jvm_thread_index
00607 thridx);
00608 extern rboolean threadstate_process_release(jvm_thread_index thridx);
00609 extern rboolean threadstate_process_wait(jvm_thread_index thridx);
00610 extern rboolean threadstate_process_notify(jvm_thread_index thridx);
00611 extern rboolean threadstate_process_lock(jvm_thread_index thridx);
00612 extern rboolean threadstate_process_acquire(jvm_thread_index thridx);
00613 extern rboolean threadstate_process_dead(jvm_thread_index thridx);
00614 extern rboolean threadstate_process_badlogic(jvm_thread_index thridx);
00615
00616
00617
00618
00619
00620 extern rvoid threadutil_update_sleeptime_interval(rvoid);
00621
00622 extern rvoid threadutil_update_blockingevents(jvm_thread_index
00623 thridxcurr);
00624
00625 extern rvoid threadutil_update_wait(jvm_thread_index thridxcurr);
00626
00627 extern rvoid threadutil_update_lock(jvm_thread_index thridxcurr);
00628
00629 extern rboolean threadutil_holds_lock(jvm_thread_index thridx,
00630 jvm_object_hash objhashlock);
00631
00632 #endif
00633
00634
00635
00636