From fee78d296c66e0b10600c7fefbbe07f33406fe97 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Thu, 21 Jun 2012 21:30:16 -0700 Subject: [PATCH] Port resources to classes in libcore --- src/libcore/io.rs | 34 +++++++++++++++++++++++----------- src/libcore/option.rs | 6 ++++-- src/libcore/sys.rs | 22 +++++++++++++--------- src/libcore/task.rs | 7 +++++-- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/libcore/io.rs b/src/libcore/io.rs index 635b3f9ebf4..df1cf16781d 100644 --- a/src/libcore/io.rs +++ b/src/libcore/io.rs @@ -224,7 +224,11 @@ impl of reader for {base: T, cleanup: C} { fn tell() -> uint { self.base.tell() } } -resource FILE_res(f: *libc::FILE) { libc::fclose(f); } +class FILE_res { + let f: *libc::FILE; + new(f: *libc::FILE) { self.f = f; } + drop { libc::fclose(self.f); } +} fn FILE_reader(f: *libc::FILE, cleanup: bool) -> reader { if cleanup { @@ -383,7 +387,11 @@ impl of writer for fd_t { fn flush() -> int { 0 } } -resource fd_res(fd: fd_t) { libc::close(fd); } +class fd_res { + let fd: fd_t; + new(fd: fd_t) { self.fd = fd; } + drop { libc::close(self.fd); } +} fn fd_writer(fd: fd_t, cleanup: bool) -> writer { if cleanup { @@ -695,13 +703,17 @@ mod fsync { } - // Resource of artifacts that need to fsync on destruction - resource res(arg: arg) { - alt arg.opt_level { - option::none { } - option::some(level) { - // fail hard if not succesful - assert(arg.fsync_fn(arg.val, level) != -1); + // Artifacts that need to fsync on destruction + class res { + let arg: arg; + new(-arg: arg) { self.arg <- arg; } + drop { + alt self.arg.opt_level { + option::none { } + option::some(level) { + // fail hard if not succesful + assert(self.arg.fsync_fn(self.arg.val, level) != -1); + } } } } @@ -718,7 +730,7 @@ mod fsync { fn FILE_res_sync(&&file: FILE_res, opt_level: option, blk: fn(&&res<*libc::FILE>)) { blk(res({ - val: *file, opt_level: opt_level, + val: file.f, opt_level: opt_level, fsync_fn: fn@(&&file: *libc::FILE, l: level) -> int { ret os::fsync_fd(libc::fileno(file), l) as int; } @@ -729,7 +741,7 @@ mod fsync { fn fd_res_sync(&&fd: fd_res, opt_level: option, blk: fn(&&res)) { blk(res({ - val: *fd, opt_level: opt_level, + val: fd.fd, opt_level: opt_level, fsync_fn: fn@(&&fd: fd_t, l: level) -> int { ret os::fsync_fd(fd, l) as int; } diff --git a/src/libcore/option.rs b/src/libcore/option.rs index 98090ba8514..72305906010 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -140,8 +140,10 @@ fn test_unwrap_str() { #[test] fn test_unwrap_resource() { - resource r(i: @mut int) { - *i += 1; + class r { + let i: @mut int; + new(i: @mut int) { self.i = i; } + drop { *(self.i) += 1; } } let i = @mut 0; { diff --git a/src/libcore/sys.rs b/src/libcore/sys.rs index 77207d8aebf..53e8e4017ba 100644 --- a/src/libcore/sys.rs +++ b/src/libcore/sys.rs @@ -85,16 +85,20 @@ pure fn log_str(t: T) -> str { } } -resource lock_and_signal(lock: rust_cond_lock) { - rustrt::rust_destroy_cond_lock(lock); +class lock_and_signal { + let lock: rust_cond_lock; + new(lock: rust_cond_lock) { self.lock = lock; } + drop { rustrt::rust_destroy_cond_lock(self.lock); } } enum condition { condition_(rust_cond_lock) } -resource unlock(lock: rust_cond_lock) { - rustrt::rust_unlock_cond_lock(lock); +class unlock { + let lock: rust_cond_lock; + new(lock: rust_cond_lock) { self.lock = lock; } + drop { rustrt::rust_unlock_cond_lock(self.lock); } } fn create_lock() -> lock_and_signal { @@ -103,15 +107,15 @@ fn create_lock() -> lock_and_signal { impl methods for lock_and_signal { fn lock(f: fn() -> T) -> T { - rustrt::rust_lock_cond_lock(*self); - let _r = unlock(*self); + rustrt::rust_lock_cond_lock(self.lock); + let _r = unlock(self.lock); f() } fn lock_cond(f: fn(condition) -> T) -> T { - rustrt::rust_lock_cond_lock(*self); - let _r = unlock(*self); - f(condition_(*self)) + rustrt::rust_lock_cond_lock(self.lock); + let _r = unlock(self.lock); + f(condition_(self.lock)) } } diff --git a/src/libcore/task.rs b/src/libcore/task.rs index ab9b4f7d3d7..2a746d76127 100644 --- a/src/libcore/task.rs +++ b/src/libcore/task.rs @@ -482,9 +482,12 @@ Temporarily make the task unkillable "] unsafe fn unkillable(f: fn()) { - resource allow_failure(_i: ()) { - rustrt::rust_task_allow_kill(); + class allow_failure { + let i: (); // since a class must have at least one field + new(_i: ()) { self.i = (); } + drop { rustrt::rust_task_allow_kill(); } } + let _allow_failure = allow_failure(()); rustrt::rust_task_inhibit_kill(); f();