Changeset 605
- Timestamp:
- Mar 1, 2004, 9:08:35 AM (21 years ago)
- Location:
- trunk/ccl/lisp-kernel
- Files:
-
- 7 edited
-
area.h (modified) (1 diff)
-
gc.c (modified) (7 diffs)
-
image.c (modified) (1 diff)
-
imports.s (modified) (1 diff)
-
lisp_globals.h (modified) (1 diff)
-
pmcl-kernel.c (modified) (9 diffs)
-
thread_manager.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/lisp-kernel/area.h
r557 r605 82 82 83 83 area *new_area(BytePtr, BytePtr, area_code); 84 void add_area(area *); 85 area *remove_area(area *); 84 void add_area(area *, TCR *); 85 void add_area_holding_area_lock(area *); 86 void condemn_area(area *, TCR *); 87 void condemn_area_holding_area_lock(area *); 86 88 area *area_containing(BytePtr); 87 89 area *stack_area_containing(BytePtr); -
trunk/ccl/lisp-kernel/gc.c
r557 r605 31 31 #include "gc.h" 32 32 #include "area.h" 33 #include "Threads.h" 33 34 #include <stddef.h> 34 35 #include <stdlib.h> … … 78 79 */ 79 80 80 void 81 add_area(area *new_area) 81 /* 82 If we already own the area_lock (or during iniitalization), it's safe 83 to add an area. 84 */ 85 86 87 void 88 add_area_holding_area_lock(area *new_area) 82 89 { 83 90 area *that = all_areas; … … 93 100 add_area_before(new_area, that); 94 101 } 102 103 /* 104 In general, we need to own the area lock before adding an area. 105 */ 106 void 107 add_area(area *new_area, TCR *tcr) 108 { 109 LOCK(lisp_global(AREA_LOCK),tcr); 110 add_area_holding_area_lock(new_area); 111 LOCK(lisp_global(AREA_LOCK),tcr); 112 } 95 113 96 114 /* … … 684 702 685 703 void 686 condemn_area (area *a)704 condemn_area_holding_area_lock(area *a) 687 705 { 688 706 void free_stack(void *); … … 705 723 } 706 724 725 void 726 condemn_area(area *a, TCR *tcr) 727 { 728 LOCK(lisp_global(AREA_LOCK),tcr); 729 condemn_area_holding_area_lock(a); 730 LOCK(lisp_global(AREA_LOCK),tcr); 731 } 707 732 708 733 /* … … 713 738 */ 714 739 void 715 condemn_area_chain(area *a )740 condemn_area_chain(area *a, TCR *tcr) 716 741 { 717 742 area *older; 743 744 LOCK(lisp_global(AREA_LOCK),tcr); 745 718 746 for (; a->younger; a = a->younger) ; 719 747 for (;a;) { 720 748 older = a->older; 721 condemn_area (a);749 condemn_area_holding_area_lock(a); 722 750 a = older; 723 751 } 752 UNLOCK(lisp_global(AREA_LOCK),tcr); 724 753 } 725 754 … … 1878 1907 switch (flag) { 1879 1908 case xmacptr_flag_recursive_lock: 1880 destroy_recursive_lock( ptr);1909 destroy_recursive_lock((RECURSIVE_LOCK)ptr); 1881 1910 break; 1882 1911 -
trunk/ccl/lisp-kernel/image.c
r6 r605 711 711 make_dynamic_heap_executable(a->low, a->active); 712 712 case AREA_READONLY: 713 add_area (a);713 add_area_holding_area_lock(a); 714 714 break; 715 715 } -
trunk/ccl/lisp-kernel/imports.s
r6 r605 36 36 defimport(allocate) 37 37 defimport(deallocate) 38 defimport(allocate_tstack )39 defimport(allocate_vstack )40 defimport(register_cstack )38 defimport(allocate_tstack_holding_area_lock) 39 defimport(allocate_vstack_holding_area_lock) 40 defimport(register_cstack_holding_area_lock) 41 41 defimport(condemn_area_chain) 42 42 defimport(metering_control) -
trunk/ccl/lisp-kernel/lisp_globals.h
r557 r605 31 31 #define RET1VALN (-9) /* magic multiple-values return address */ 32 32 #define TCR_KEY (-10) /* tsd key for per-thread tcr */ 33 #define bad_GC_LOCK (-11) /* rwlock for GC*/33 #define AREA_LOCK (-11) /* all_areas lock */ 34 34 #define EXCEPTION_LOCK (-12) /* serialize exception handling */ 35 35 #define GO_TAG_COUNTER (-13) -
trunk/ccl/lisp-kernel/pmcl-kernel.c
r557 r605 177 177 } 178 178 179 /* This'll allocate a tstack or a vstack, but the thread180 mangler won't let us allocate or reliably protect181 a control stack.179 /* 180 This should only called by something that owns the area_lock, or 181 by the initial thread before other threads exist. 182 182 */ 183 183 area * … … 212 212 a->softprot = soft_area; 213 213 a->hardprot = hard_area; 214 add_area (a);214 add_area_holding_area_lock(a); 215 215 } 216 216 return a; 217 217 } 218 218 219 /* 220 Also assumes ownership of the area_lock 221 */ 219 222 area* 220 register_cstack (BytePtr bottom, unsigned size)223 register_cstack_holding_area_lock(BytePtr bottom, unsigned size) 221 224 { 222 225 BytePtr lowlimit = (BytePtr) (((((unsigned)bottom)-size)+4095)&~4095); … … 225 228 a->hardlimit = lowlimit+CSTACK_HARDPROT; 226 229 a->softlimit = a->hardlimit+CSTACK_SOFTPROT; 227 add_area (a);230 add_area_holding_area_lock(a); 228 231 return a; 229 232 } 230 233 234 231 235 area* 232 allocate_vstack (unsigned usable)236 allocate_vstack_holding_area_lock(unsigned usable) 233 237 { 234 238 return allocate_lisp_stack_area(AREA_VSTACK, … … 242 246 243 247 area * 244 allocate_tstack (unsigned usable)248 allocate_tstack_holding_area_lock(unsigned usable) 245 249 { 246 250 return allocate_lisp_stack_area(AREA_TSTACK, … … 272 276 } 273 277 } 274 275 276 277 278 278 279 … … 644 645 a = new_area(start, end, AREA_DYNAMIC); 645 646 a->active = start+initsize; 646 add_area (a);647 add_area_holding_area_lock(a); 647 648 a->markbits = reserved_area->markbits; 648 649 reserved_area->markbits = NULL; … … 1158 1159 program_name = argv[0]; 1159 1160 if ((argc == 2) && (*argv[1] != '-')) { 1160 #ifdef DARWIN1161 extern int NXArgc;1162 NXArgc = 1;1163 #endif1164 1161 image_name = argv[1]; 1165 1162 argv[1] = NULL; … … 1181 1178 create_reserved_area(reserved_area_size); 1182 1179 set_nil(load_image(image_name)); 1180 lisp_global(AREA_LOCK) = ptr_to_lispobj(area_lock); 1181 1183 1182 lisp_global(SUBPRIMS_BASE) = (LispObj)(1<<20); 1184 1183 lisp_global(RET1VALN) = (LispObj)&ret1valn; … … 1226 1225 g2_area = new_area(lowptr, lowptr, AREA_STATIC); 1227 1226 tenured_area = new_area(lowptr, lowptr, AREA_STATIC); 1228 add_area (tenured_area);1229 add_area (g2_area);1230 add_area (g1_area);1227 add_area_holding_area_lock(tenured_area); 1228 add_area_holding_area_lock(g2_area); 1229 add_area_holding_area_lock(g1_area); 1231 1230 1232 1231 g1_area->code = AREA_DYNAMIC; -
trunk/ccl/lisp-kernel/thread_manager.c
r571 r605 406 406 } 407 407 408 408 409 /* 410 Caller must hold the area_lock. 411 */ 409 412 TCR * 410 413 new_tcr(unsigned vstack_size, unsigned tstack_size) 411 414 { 412 extern area* allocate_vstack(unsigned), *allocate_tstack(unsigned); 415 extern area 416 *allocate_vstack_holding_area_lock(unsigned), 417 *allocate_tstack_holding_tcr(unsigned); 413 418 area *a; 414 419 TCR *tcr = calloc(1, sizeof(TCR)); … … 420 425 tcr->reset_completion = new_semaphore(0); 421 426 tcr->activate = new_semaphore(0); 422 a = allocate_vstack (vstack_size);427 a = allocate_vstack_holding_area_lock(vstack_size); 423 428 tcr->vs_area = a; 424 429 tcr->save_vsp = (LispObj *) a->active; 425 a = allocate_tstack (tstack_size);430 a = allocate_tstack_holding_area_lock(tstack_size); 426 431 tcr->ts_area = a; 427 432 tcr->save_tsp = (LispObj *) a->active; … … 458 463 darwin_exception_cleanup(tcr); 459 464 #endif 460 465 LOCK(lisp_global(AREA_LOCK),tcr); 461 466 vs = tcr->vs_area; 462 467 tcr->vs_area = NULL; … … 466 471 tcr->cs_area = NULL; 467 472 if (vs) { 468 condemn_area (vs);473 condemn_area_holding_area_lock(vs); 469 474 } 470 475 if (ts) { 471 condemn_area (ts);476 condemn_area_holding_area_lock(ts); 472 477 } 473 478 if (cs) { 474 condemn_area (cs);479 condemn_area_holding_area_lock(cs); 475 480 } 476 481 destroy_semaphore(&tcr->suspend); … … 479 484 destroy_semaphore(&tcr->activate); 480 485 tcr->osid = 0; 486 UNLOCK(lisp_global(AREA_LOCK),tcr); 481 487 } else { 482 488 tsd_set(lisp_global(TCR_KEY), tcr); … … 500 506 thread_init_tcr(TCR *tcr, void *stack_base, unsigned stack_size) 501 507 { 502 area *a, *register_cstack (BytePtr, unsigned);508 area *a, *register_cstack_holding_area_lock(BytePtr, unsigned); 503 509 504 510 tcr->osid = current_thread_osid(); 505 511 tcr->native_thread_id = current_native_thread_id(); 506 a = register_cstack((BytePtr)stack_base, stack_size); 512 LOCK(lisp_global(AREA_LOCK),tcr); 513 a = register_cstack_holding_area_lock((BytePtr)stack_base, stack_size); 514 UNLOCK(lisp_global(AREA_LOCK),tcr); 507 515 tcr->cs_area = a; 508 516 if (!(tcr->flags & (1<<TCR_FLAG_BIT_FOREIGN))) { … … 548 556 create_stack(int size) 549 557 { 550 Ptr p = (Ptr) mmap(NULL, 558 Ptr p; 559 size=align_to_power_of_2(size, 12); 560 p = (Ptr) mmap(NULL, 551 561 (size_t)size, 552 562 PROT_READ | PROT_WRITE | PROT_EXEC, … … 619 629 { 620 630 thread_activation activation; 631 TCR *current = get_tcr(false); 632 633 LOCK(lisp_global(AREA_LOCK),current); 621 634 activation.tcr = new_tcr(value_stack_size, temp_stack_size); 635 UNLOCK(lisp_global(AREA_LOCK),current); 622 636 activation.created = new_semaphore(0); 623 637 create_system_thread(control_stack_size +(CSTACK_HARDPROT+CSTACK_SOFTPROT),
Note:
See TracChangeset
for help on using the changeset viewer.
