Convert libstd to use the Drop trait
This commit is contained in:
parent
8336cad95d
commit
28c7a25151
8 changed files with 107 additions and 52 deletions
|
@ -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; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -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| {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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> {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue