88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11+ use cell:: Cell ;
1112use c_str:: ToCStr ;
1213use cast:: transmute;
1314use libc:: { c_char, size_t, STDERR_FILENO } ;
1415use io;
1516use io:: { Writer , WriterUtil } ;
1617use option:: { Option , None , Some } ;
1718use uint;
19+ use rt:: env;
20+ use rt:: local:: Local ;
21+ use rt:: task:: Task ;
1822use str;
1923use str:: { OwnedStr , StrSlice } ;
2024use sys;
@@ -26,22 +30,31 @@ pub static MUT_BIT: uint = 1 << (uint::bits - 2);
2630static ALL_BITS : uint = FROZEN_BIT | MUT_BIT ;
2731
2832#[ deriving( Eq ) ]
29- struct BorrowRecord {
33+ pub struct BorrowRecord {
3034 box : * mut raw:: Box < ( ) > ,
3135 file : * c_char ,
3236 line : size_t
3337}
3438
3539fn try_take_task_borrow_list ( ) -> Option < ~[ BorrowRecord ] > {
36- // XXX
37- None
40+ do Local :: borrow :: < Task , Option < ~[ BorrowRecord ] > > |task| {
41+ task. borrow_list . take ( )
42+ }
3843}
3944
40- fn swap_task_borrow_list ( _f : & fn ( ~[ BorrowRecord ] ) -> ~[ BorrowRecord ] ) {
41- // XXX
45+ fn swap_task_borrow_list ( f : & fn ( ~[ BorrowRecord ] ) -> ~[ BorrowRecord ] ) {
46+ let borrows = match try_take_task_borrow_list ( ) {
47+ Some ( l) => l,
48+ None => ~[ ]
49+ } ;
50+ let borrows = f ( borrows) ;
51+ let borrows = Cell :: new ( borrows) ;
52+ do Local :: borrow :: < Task , ( ) > |task| {
53+ task. borrow_list = Some ( borrows. take ( ) ) ;
54+ }
4255}
4356
44- pub unsafe fn clear_task_borrow_list ( ) {
57+ pub fn clear_task_borrow_list ( ) {
4558 // pub because it is used by the box annihilator.
4659 let _ = try_take_task_borrow_list ( ) ;
4760}
@@ -89,8 +102,7 @@ unsafe fn debug_borrow<T>(tag: &'static str,
89102 //! A useful debugging function that prints a pointer + tag + newline
90103 //! without allocating memory.
91104
92- // XXX
93- if false {
105+ if ENABLE_DEBUG && env:: debug_borrow ( ) {
94106 debug_borrow_slow ( tag, p, old_bits, new_bits, filename, line) ;
95107 }
96108
0 commit comments