summaryrefslogtreecommitdiffstats
path: root/src/c/string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/c/string.rs')
-rw-r--r--src/c/string.rs16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/c/string.rs b/src/c/string.rs
index 8babef6..d0e620c 100644
--- a/src/c/string.rs
+++ b/src/c/string.rs
@@ -11,15 +11,14 @@ fn must_succeed<T>(p: *mut T) -> *mut T {
p
}
-unsafe fn malloc<T>() -> *mut T {
+fn malloc<T>() -> *mut T {
let size = mem::size_of::<T>();
- /*if size == 0 {
+ if size == 0 {
return SENTINEL as *mut T;
- }*/
- must_succeed(0 as *mut T)
- /*must_succeed(
- libc::memalign(mem::align_of::<T>() as libc::size_t, size as libc::size_t)
- ) as *mut T*/
+ }
+ must_succeed(
+ unsafe {libc::memalign(mem::align_of::<T>() as libc::size_t, size as libc::size_t) }
+ ) as *mut T
}
pub struct CBox<T: ?Sized>(*mut T);
@@ -46,8 +45,8 @@ impl<T: ?Sized> CBox<T> {
impl<T> CBox<T> {
pub fn new(value: T) -> CBox<T> {
+ let p = malloc();
unsafe {
- let p = malloc();
ptr::write(p, value);
CBox::from_raw(p)
}
@@ -56,6 +55,7 @@ impl<T> CBox<T> {
impl<T: ?Sized> Drop for CBox<T> {
fn drop(&mut self) {
+ unsafe { ptr::drop_in_place(self.0); }
let p = self.0 as *mut libc::c_void;
if p != SENTINEL {
unsafe { libc::free(p); }