change synchronization with agent
This commit is contained in:
33
src/agent.rs
33
src/agent.rs
@@ -5,7 +5,7 @@ use libc::{
|
|||||||
MFD_ALLOW_SEALING, PROT_READ, PROT_WRITE,
|
MFD_ALLOW_SEALING, PROT_READ, PROT_WRITE,
|
||||||
};
|
};
|
||||||
use shared_memory_heap::get_shared_mem_fd;
|
use shared_memory_heap::get_shared_mem_fd;
|
||||||
use std::{ffi::CString, path::Path, ptr, usize};
|
use std::{arch::x86_64::_mm_mfence, ffi::CString, path::Path, ptr, usize};
|
||||||
|
|
||||||
pub struct Agent {
|
pub struct Agent {
|
||||||
sync_mem: *mut usize,
|
sync_mem: *mut usize,
|
||||||
@@ -66,7 +66,7 @@ impl Agent {
|
|||||||
|
|
||||||
execve(path.as_ptr() as *const c_char, args.as_ptr(), ptr::null());
|
execve(path.as_ptr() as *const c_char, args.as_ptr(), ptr::null());
|
||||||
|
|
||||||
perror("execve:\x00".as_ptr() as *const c_char);
|
perror(r#"execve:\0"#.as_ptr() as *const c_char);
|
||||||
|
|
||||||
panic!("execve failed");
|
panic!("execve failed");
|
||||||
}
|
}
|
||||||
@@ -83,29 +83,12 @@ impl Agent {
|
|||||||
*self.sync_mem.add(i + 2) = *ptr;
|
*self.sync_mem.add(i + 2) = *ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// wake agent
|
*self.sync_mem = 1;
|
||||||
let mut woken_up = 0;
|
|
||||||
while woken_up == 0 {
|
|
||||||
woken_up = syscall(
|
|
||||||
SYS_futex,
|
|
||||||
self.sync_mem,
|
|
||||||
FUTEX_WAKE,
|
|
||||||
1,
|
|
||||||
ptr::null::<u8>(),
|
|
||||||
ptr::null::<u8>(),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// wait for agent to be finished
|
_mm_mfence();
|
||||||
syscall(
|
#[allow(clippy::while_immutable_condition)]
|
||||||
SYS_futex,
|
while *self.sync_mem == 1 {
|
||||||
self.sync_mem,
|
_mm_mfence();
|
||||||
FUTEX_WAIT,
|
}
|
||||||
0,
|
|
||||||
ptr::null::<u8>(),
|
|
||||||
ptr::null::<u8>(),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user