1
Fork 0

Convert libstd to use the Drop trait

This commit is contained in:
Ben Striegel 2012-11-13 21:38:18 -05:00 committed by Brian Anderson
parent 8336cad95d
commit 28c7a25151
8 changed files with 107 additions and 52 deletions

View file

@ -217,7 +217,10 @@ fn check_poison(is_mutex: bool, failed: bool) {
#[doc(hidden)] #[doc(hidden)]
struct PoisonOnFail { struct PoisonOnFail {
failed: &mut bool, failed: &mut bool,
drop { }
impl PoisonOnFail : Drop {
fn finalize() {
/* assert !*self.failed; -- might be false in case of cond.wait() */ /* assert !*self.failed; -- might be false in case of cond.wait() */
if task::failing() { *self.failed = true; } if task::failing() { *self.failed = true; }
} }

View file

@ -55,7 +55,10 @@ pub struct Arena {
priv mut head: Chunk, priv mut head: Chunk,
priv mut pod_head: Chunk, priv mut pod_head: Chunk,
priv mut chunks: @List<Chunk>, priv mut chunks: @List<Chunk>,
drop { }
impl Arena : Drop {
fn finalize() {
unsafe { unsafe {
destroy_chunk(&self.head); destroy_chunk(&self.head);
for list::each(self.chunks) |chunk| { for list::each(self.chunks) |chunk| {

View file

@ -39,7 +39,10 @@ pub enum CVec<T> {
struct DtorRes { struct DtorRes {
dtor: Option<fn@()>, dtor: Option<fn@()>,
drop { }
impl DtorRes : Drop {
fn finalize() {
match self.dtor { match self.dtor {
option::None => (), option::None => (),
option::Some(f) => f() option::Some(f) => f()

View file

@ -23,10 +23,12 @@ use cast::copy_lifetime;
#[doc = "The future type"] #[doc = "The future type"]
pub struct Future<A> { pub struct Future<A> {
/*priv*/ mut state: FutureState<A>, /*priv*/ mut state: FutureState<A>,
}
// FIXME(#2829) -- futures should not be copyable, because they close // FIXME(#2829) -- futures should not be copyable, because they close
// over fn~'s that have pipes and so forth within! // over fn~'s that have pipes and so forth within!
drop {} impl<A> Future<A> : Drop {
fn finalize() {}
} }
priv enum FutureState<A> { priv enum FutureState<A> {

View file

@ -27,7 +27,10 @@ extern mod rustrt {
*/ */
struct TcpSocket { struct TcpSocket {
socket_data: @TcpSocketData, socket_data: @TcpSocketData,
drop { }
impl TcpSocket : Drop {
fn finalize() {
unsafe { unsafe {
tear_down_socket_data(self.socket_data) tear_down_socket_data(self.socket_data)
} }

View file

@ -1133,7 +1133,10 @@ mod big_tests {
val: uint, val: uint,
key: fn(@uint), key: fn(@uint),
drop { }
impl LVal : Drop {
fn finalize() {
let x = unsafe { task::local_data::local_data_get(self.key) }; let x = unsafe { task::local_data::local_data_get(self.key) };
match x { match x {
Some(@y) => { Some(@y) => {

View file

@ -150,7 +150,12 @@ impl &Sem<~[mut Waitqueue]> {
#[doc(hidden)] #[doc(hidden)]
struct SemRelease { struct SemRelease {
sem: &Sem<()>, sem: &Sem<()>,
drop { self.sem.release(); } }
impl SemRelease : Drop {
fn finalize() {
self.sem.release();
}
} }
fn SemRelease(sem: &r/Sem<()>) -> SemRelease/&r { fn SemRelease(sem: &r/Sem<()>) -> SemRelease/&r {
@ -162,7 +167,12 @@ fn SemRelease(sem: &r/Sem<()>) -> SemRelease/&r {
#[doc(hidden)] #[doc(hidden)]
struct SemAndSignalRelease { struct SemAndSignalRelease {
sem: &Sem<~[mut Waitqueue]>, sem: &Sem<~[mut Waitqueue]>,
drop { self.sem.release(); } }
impl SemAndSignalRelease : Drop {
fn finalize() {
self.sem.release();
}
} }
fn SemAndSignalRelease(sem: &r/Sem<~[mut Waitqueue]>) fn SemAndSignalRelease(sem: &r/Sem<~[mut Waitqueue]>)
@ -173,7 +183,9 @@ fn SemAndSignalRelease(sem: &r/Sem<~[mut Waitqueue]>)
} }
/// A mechanism for atomic-unlock-and-deschedule blocking and signalling. /// A mechanism for atomic-unlock-and-deschedule blocking and signalling.
pub struct Condvar { priv sem: &Sem<~[mut Waitqueue]>, drop { } } pub struct Condvar { priv sem: &Sem<~[mut Waitqueue]> }
impl Condvar : Drop { fn finalize() {} }
impl &Condvar { impl &Condvar {
/** /**
@ -242,13 +254,18 @@ impl &Condvar {
// bounded in when it gets released, this shouldn't hang forever. // bounded in when it gets released, this shouldn't hang forever.
struct SemAndSignalReacquire { struct SemAndSignalReacquire {
sem: &Sem<~[mut Waitqueue]>, sem: &Sem<~[mut Waitqueue]>,
drop unsafe { }
impl SemAndSignalReacquire : Drop {
fn finalize() {
unsafe {
// Needs to succeed, instead of itself dying. // Needs to succeed, instead of itself dying.
do task::unkillable { do task::unkillable {
self.sem.acquire(); self.sem.acquire();
} }
} }
} }
}
fn SemAndSignalReacquire(sem: &r/Sem<~[mut Waitqueue]>) fn SemAndSignalReacquire(sem: &r/Sem<~[mut Waitqueue]>)
-> SemAndSignalReacquire/&r { -> SemAndSignalReacquire/&r {
@ -581,7 +598,11 @@ impl &RWlock {
#[doc(hidden)] #[doc(hidden)]
struct RWlockReleaseRead { struct RWlockReleaseRead {
lock: &RWlock, lock: &RWlock,
drop unsafe { }
impl RWlockReleaseRead : Drop {
fn finalize() {
unsafe {
do task::unkillable { do task::unkillable {
let mut last_reader = false; let mut last_reader = false;
do self.lock.state.with |state| { do self.lock.state.with |state| {
@ -598,6 +619,7 @@ struct RWlockReleaseRead {
} }
} }
} }
}
} }
fn RWlockReleaseRead(lock: &r/RWlock) -> RWlockReleaseRead/&r { fn RWlockReleaseRead(lock: &r/RWlock) -> RWlockReleaseRead/&r {
@ -610,7 +632,11 @@ fn RWlockReleaseRead(lock: &r/RWlock) -> RWlockReleaseRead/&r {
#[doc(hidden)] #[doc(hidden)]
struct RWlockReleaseDowngrade { struct RWlockReleaseDowngrade {
lock: &RWlock, lock: &RWlock,
drop unsafe { }
impl RWlockReleaseDowngrade : Drop {
fn finalize() {
unsafe {
do task::unkillable { do task::unkillable {
let mut writer_or_last_reader = false; let mut writer_or_last_reader = false;
do self.lock.state.with |state| { do self.lock.state.with |state| {
@ -622,7 +648,8 @@ struct RWlockReleaseDowngrade {
writer_or_last_reader = true; writer_or_last_reader = true;
state.read_mode = false; state.read_mode = false;
} else { } else {
// Case 2: Writer downgraded & was not the last reader // Case 2: Writer downgraded & was not the last
// reader
} }
} else { } else {
// Case 3: Writer did not downgrade // Case 3: Writer did not downgrade
@ -634,6 +661,7 @@ struct RWlockReleaseDowngrade {
} }
} }
} }
}
} }
fn RWlockReleaseDowngrade(lock: &r/RWlock) -> RWlockReleaseDowngrade/&r { fn RWlockReleaseDowngrade(lock: &r/RWlock) -> RWlockReleaseDowngrade/&r {
@ -643,9 +671,11 @@ fn RWlockReleaseDowngrade(lock: &r/RWlock) -> RWlockReleaseDowngrade/&r {
} }
/// The "write permission" token used for rwlock.write_downgrade(). /// The "write permission" token used for rwlock.write_downgrade().
pub struct RWlockWriteMode { /* priv */ lock: &RWlock, drop { } } pub struct RWlockWriteMode { /* priv */ lock: &RWlock }
impl RWlockWriteMode : Drop { fn finalize() {} }
/// The "read permission" token used for rwlock.write_downgrade(). /// The "read permission" token used for rwlock.write_downgrade().
pub struct RWlockReadMode { priv lock: &RWlock, drop { } } pub struct RWlockReadMode { priv lock: &RWlock }
impl RWlockReadMode : Drop { fn finalize() {} }
impl &RWlockWriteMode { impl &RWlockWriteMode {
/// Access the pre-downgrade rwlock in write mode. /// Access the pre-downgrade rwlock in write mode.
@ -954,7 +984,12 @@ mod tests {
} }
struct SendOnFailure { struct SendOnFailure {
c: pipes::Chan<()>, c: pipes::Chan<()>,
drop { self.c.send(()); } }
impl SendOnFailure : Drop {
fn finalize() {
self.c.send(());
}
} }
fn SendOnFailure(c: pipes::Chan<()>) -> SendOnFailure { fn SendOnFailure(c: pipes::Chan<()>) -> SendOnFailure {

View file

@ -13,7 +13,10 @@ pub struct ThreadPool<T> {
channels: ~[Chan<Msg<T>>], channels: ~[Chan<Msg<T>>],
mut next_index: uint, mut next_index: uint,
drop { }
impl<T> ThreadPool<T> {
fn finalize() {
for self.channels.each |channel| { for self.channels.each |channel| {
channel.send(Quit); channel.send(Quit);
} }