@@ -22,7 +22,6 @@ use rt::{context, OldTaskContext};
22
22
use rt:: local_services:: borrow_local_services;
23
23
use option:: { Option , Some , None } ;
24
24
use io;
25
- use task:: rt:: rust_get_task;
26
25
27
26
#[ allow( non_camel_case_types) ]
28
27
pub type rust_task = c_void ;
@@ -56,6 +55,9 @@ pub mod rustrt {
56
55
#[ rust_stack]
57
56
fn rust_set_task_borrow_list ( task : * rust_task , map : * c_void ) ;
58
57
58
+ #[ rust_stack]
59
+ fn rust_try_get_task ( ) -> * rust_task ;
60
+
59
61
fn rust_dbg_breakpoint ( ) ;
60
62
}
61
63
}
@@ -84,26 +86,32 @@ struct BorrowRecord {
84
86
85
87
fn try_take_task_borrow_list ( ) -> Option < ~[ BorrowRecord ] > {
86
88
unsafe {
87
- let cur_task = rust_get_task ( ) ;
88
- let ptr = rustrt:: rust_take_task_borrow_list ( cur_task) ;
89
- if ptr. is_null ( ) {
90
- None
89
+ let cur_task: * rust_task = rustrt:: rust_try_get_task ( ) ;
90
+ if cur_task. is_not_null ( ) {
91
+ let ptr = rustrt:: rust_take_task_borrow_list ( cur_task) ;
92
+ if ptr. is_null ( ) {
93
+ None
94
+ } else {
95
+ let v: ~[ BorrowRecord ] = transmute ( ptr) ;
96
+ Some ( v)
97
+ }
91
98
} else {
92
- let v: ~[ BorrowRecord ] = transmute ( ptr) ;
93
- Some ( v)
99
+ None
94
100
}
95
101
}
96
102
}
97
103
98
104
fn swap_task_borrow_list ( f : & fn ( ~[ BorrowRecord ] ) -> ~[ BorrowRecord ] ) {
99
105
unsafe {
100
- let cur_task = rust_get_task ( ) ;
101
- let mut borrow_list: ~[ BorrowRecord ] = {
102
- let ptr = rustrt:: rust_take_task_borrow_list ( cur_task) ;
103
- if ptr. is_null ( ) { ~[ ] } else { transmute ( ptr) }
104
- } ;
105
- borrow_list = f ( borrow_list) ;
106
- rustrt:: rust_set_task_borrow_list ( cur_task, transmute ( borrow_list) ) ;
106
+ let cur_task: * rust_task = rustrt:: rust_try_get_task ( ) ;
107
+ if cur_task. is_not_null ( ) {
108
+ let mut borrow_list: ~[ BorrowRecord ] = {
109
+ let ptr = rustrt:: rust_take_task_borrow_list ( cur_task) ;
110
+ if ptr. is_null ( ) { ~[ ] } else { transmute ( ptr) }
111
+ } ;
112
+ borrow_list = f ( borrow_list) ;
113
+ rustrt:: rust_set_task_borrow_list ( cur_task, transmute ( borrow_list) ) ;
114
+ }
107
115
}
108
116
}
109
117
@@ -128,9 +136,7 @@ unsafe fn fail_borrowed(box: *mut BoxRepr, file: *c_char, line: size_t) {
128
136
for borrow_list. each_reverse |entry| {
129
137
if entry. box == box {
130
138
str:: push_str ( & mut msg, sep) ;
131
- let filename = unsafe {
132
- str:: raw:: from_c_str ( entry. file )
133
- } ;
139
+ let filename = str:: raw:: from_c_str ( entry. file ) ;
134
140
str:: push_str ( & mut msg, filename) ;
135
141
str:: push_str ( & mut msg, fmt ! ( ":%u" , entry. line as uint) ) ;
136
142
sep = " and at " ;
@@ -351,25 +357,21 @@ pub unsafe fn record_borrow(a: *u8, old_ref_count: uint,
351
357
pub unsafe fn unrecord_borrow ( a : * u8 , old_ref_count : uint ,
352
358
file : * c_char , line : size_t ) {
353
359
if ( old_ref_count & ALL_BITS ) == 0 {
354
- // was not borrowed before
360
+ // was not borrowed before, so we should find the record at
361
+ // the end of the list
355
362
let a: * mut BoxRepr = transmute ( a) ;
356
363
debug_borrow ( "unrecord_borrow:" , a, old_ref_count, 0 , file, line) ;
357
364
do swap_task_borrow_list |borrow_list| {
358
365
let mut borrow_list = borrow_list;
359
- let br = BorrowRecord { box : a, file : file, line : line} ;
360
- match borrow_list. rposition_elem ( & br) {
361
- Some ( idx) => {
362
- borrow_list. remove ( idx) ;
363
- borrow_list
364
- }
365
- None => {
366
- let err = fmt ! ( "no borrow found, br=%?, borrow_list=%?" ,
367
- br, borrow_list) ;
368
- do str:: as_buf ( err) |msg_p, _| {
369
- fail_( msg_p as * c_char, file, line)
370
- }
366
+ assert ! ( !borrow_list. is_empty( ) ) ;
367
+ let br = borrow_list. pop ( ) ;
368
+ if br. box != a || br. file != file || br. line != line {
369
+ let err = fmt ! ( "wrong borrow found, br=%?" , br) ;
370
+ do str:: as_buf ( err) |msg_p, _| {
371
+ fail_ ( msg_p as * c_char , file, line)
371
372
}
372
373
}
374
+ borrow_list
373
375
}
374
376
}
375
377
}
0 commit comments