diff --git a/src/libstd/arc.rs b/src/libstd/arc.rs index 503c15b46c2..0033a4eaccd 100644 --- a/src/libstd/arc.rs +++ b/src/libstd/arc.rs @@ -217,10 +217,7 @@ fn check_poison(is_mutex: bool, failed: bool) { #[doc(hidden)] struct PoisonOnFail { failed: &mut bool, -} - -impl PoisonOnFail : Drop { - fn finalize() { + drop { /* assert !*self.failed; -- might be false in case of cond.wait() */ if task::failing() { *self.failed = true; } } diff --git a/src/libstd/arena.rs b/src/libstd/arena.rs index cf8bbc628f0..9f40794b28a 100644 --- a/src/libstd/arena.rs +++ b/src/libstd/arena.rs @@ -55,10 +55,7 @@ pub struct Arena { priv mut head: Chunk, priv mut pod_head: Chunk, priv mut chunks: @List, -} - -impl Arena : Drop { - fn finalize() { + drop { unsafe { destroy_chunk(&self.head); for list::each(self.chunks) |chunk| { diff --git a/src/libstd/c_vec.rs b/src/libstd/c_vec.rs index 2e94f07d2d8..06d56ed1ae5 100644 --- a/src/libstd/c_vec.rs +++ b/src/libstd/c_vec.rs @@ -39,15 +39,12 @@ pub enum CVec { struct DtorRes { dtor: Option, -} - -impl DtorRes : Drop { - fn finalize() { + drop { match self.dtor { option::None => (), option::Some(f) => f() } - } + } } fn DtorRes(dtor: Option) -> DtorRes { diff --git a/src/libstd/future.rs b/src/libstd/future.rs index 17b487f16de..503e915cf87 100644 --- a/src/libstd/future.rs +++ b/src/libstd/future.rs @@ -23,12 +23,10 @@ use cast::copy_lifetime; #[doc = "The future type"] pub struct Future { /*priv*/ mut state: FutureState, -} -// FIXME(#2829) -- futures should not be copyable, because they close -// over fn~'s that have pipes and so forth within! -impl Future : Drop { - fn finalize() {} + // FIXME(#2829) -- futures should not be copyable, because they close + // over fn~'s that have pipes and so forth within! + drop {} } priv enum FutureState { diff --git a/src/libstd/net_tcp.rs b/src/libstd/net_tcp.rs index 182ec2a233c..d58ab844f11 100644 --- a/src/libstd/net_tcp.rs +++ b/src/libstd/net_tcp.rs @@ -27,14 +27,11 @@ extern mod rustrt { */ struct TcpSocket { socket_data: @TcpSocketData, -} - -impl TcpSocket : Drop { - fn finalize() { + drop { unsafe { tear_down_socket_data(self.socket_data) } - } + } } pub fn TcpSocket(socket_data: @TcpSocketData) -> TcpSocket { diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs index 4f06cc40c22..40c81951b5e 100644 --- a/src/libstd/sort.rs +++ b/src/libstd/sort.rs @@ -1133,10 +1133,7 @@ mod big_tests { val: uint, key: fn(@uint), - } - - impl LVal : Drop { - fn finalize() { + drop { let x = unsafe { task::local_data::local_data_get(self.key) }; match x { Some(@y) => { diff --git a/src/libstd/sync.rs b/src/libstd/sync.rs index 55f458c6f46..43d1c9664a5 100644 --- a/src/libstd/sync.rs +++ b/src/libstd/sync.rs @@ -150,12 +150,7 @@ impl &Sem<~[mut Waitqueue]> { #[doc(hidden)] struct SemRelease { sem: &Sem<()>, -} - -impl SemRelease : Drop { - fn finalize() { - self.sem.release(); - } + drop { self.sem.release(); } } fn SemRelease(sem: &r/Sem<()>) -> SemRelease/&r { @@ -167,12 +162,7 @@ fn SemRelease(sem: &r/Sem<()>) -> SemRelease/&r { #[doc(hidden)] struct SemAndSignalRelease { sem: &Sem<~[mut Waitqueue]>, -} - -impl SemAndSignalRelease : Drop { - fn finalize() { - self.sem.release(); - } + drop { self.sem.release(); } } fn SemAndSignalRelease(sem: &r/Sem<~[mut Waitqueue]>) @@ -183,9 +173,7 @@ fn SemAndSignalRelease(sem: &r/Sem<~[mut Waitqueue]>) } /// A mechanism for atomic-unlock-and-deschedule blocking and signalling. -pub struct Condvar { priv sem: &Sem<~[mut Waitqueue]> } - -impl Condvar : Drop { fn finalize() {} } +pub struct Condvar { priv sem: &Sem<~[mut Waitqueue]>, drop { } } impl &Condvar { /** @@ -254,15 +242,10 @@ impl &Condvar { // bounded in when it gets released, this shouldn't hang forever. struct SemAndSignalReacquire { sem: &Sem<~[mut Waitqueue]>, - } - - impl SemAndSignalReacquire : Drop { - fn finalize() { - unsafe { - // Needs to succeed, instead of itself dying. - do task::unkillable { - self.sem.acquire(); - } + drop unsafe { + // Needs to succeed, instead of itself dying. + do task::unkillable { + self.sem.acquire(); } } } @@ -598,26 +581,21 @@ impl &RWlock { #[doc(hidden)] struct RWlockReleaseRead { lock: &RWlock, -} - -impl RWlockReleaseRead : Drop { - fn finalize() { - unsafe { - do task::unkillable { - let mut last_reader = false; - do self.lock.state.with |state| { - assert state.read_mode; - assert state.read_count > 0; - state.read_count -= 1; - if state.read_count == 0 { - last_reader = true; - state.read_mode = false; - } - } - if last_reader { - (&self.lock.access_lock).release(); + drop unsafe { + do task::unkillable { + let mut last_reader = false; + do self.lock.state.with |state| { + assert state.read_mode; + assert state.read_count > 0; + state.read_count -= 1; + if state.read_count == 0 { + last_reader = true; + state.read_mode = false; } } + if last_reader { + (&self.lock.access_lock).release(); + } } } } @@ -632,33 +610,27 @@ fn RWlockReleaseRead(lock: &r/RWlock) -> RWlockReleaseRead/&r { #[doc(hidden)] struct RWlockReleaseDowngrade { lock: &RWlock, -} - -impl RWlockReleaseDowngrade : Drop { - fn finalize() { - unsafe { - do task::unkillable { - let mut writer_or_last_reader = false; - do self.lock.state.with |state| { - if state.read_mode { - assert state.read_count > 0; - state.read_count -= 1; - if state.read_count == 0 { - // Case 1: Writer downgraded & was the last reader - writer_or_last_reader = true; - state.read_mode = false; - } else { - // Case 2: Writer downgraded & was not the last - // reader - } - } else { - // Case 3: Writer did not downgrade + drop unsafe { + do task::unkillable { + let mut writer_or_last_reader = false; + do self.lock.state.with |state| { + if state.read_mode { + assert state.read_count > 0; + state.read_count -= 1; + if state.read_count == 0 { + // Case 1: Writer downgraded & was the last reader writer_or_last_reader = true; + state.read_mode = false; + } else { + // Case 2: Writer downgraded & was not the last reader } + } else { + // Case 3: Writer did not downgrade + writer_or_last_reader = true; } - if writer_or_last_reader { - (&self.lock.access_lock).release(); - } + } + if writer_or_last_reader { + (&self.lock.access_lock).release(); } } } @@ -671,11 +643,9 @@ fn RWlockReleaseDowngrade(lock: &r/RWlock) -> RWlockReleaseDowngrade/&r { } /// The "write permission" token used for rwlock.write_downgrade(). -pub struct RWlockWriteMode { /* priv */ lock: &RWlock } -impl RWlockWriteMode : Drop { fn finalize() {} } +pub struct RWlockWriteMode { /* priv */ lock: &RWlock, drop { } } /// The "read permission" token used for rwlock.write_downgrade(). -pub struct RWlockReadMode { priv lock: &RWlock } -impl RWlockReadMode : Drop { fn finalize() {} } +pub struct RWlockReadMode { priv lock: &RWlock, drop { } } impl &RWlockWriteMode { /// Access the pre-downgrade rwlock in write mode. @@ -984,12 +954,7 @@ mod tests { } struct SendOnFailure { c: pipes::Chan<()>, - } - - impl SendOnFailure : Drop { - fn finalize() { - self.c.send(()); - } + drop { self.c.send(()); } } fn SendOnFailure(c: pipes::Chan<()>) -> SendOnFailure { diff --git a/src/libstd/thread_pool.rs b/src/libstd/thread_pool.rs index f5d1a6edbf1..4bded2093d0 100644 --- a/src/libstd/thread_pool.rs +++ b/src/libstd/thread_pool.rs @@ -13,10 +13,7 @@ pub struct ThreadPool { channels: ~[Chan>], mut next_index: uint, -} - -impl ThreadPool { - fn finalize() { + drop { for self.channels.each |channel| { channel.send(Quit); }