server.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use std::os::raw::c_uchar;
  2. use std::sync::mpsc::*;
  3. use std::thread::*;
  4. use spiral_rs::client::PublicParameters;
  5. use spiral_rs::params::Params;
  6. use crate::params;
  7. enum Command {
  8. PubParams(Vec<u8>),
  9. PreProcMsg(Vec<u8>),
  10. }
  11. enum Response {
  12. PreProcResp(Vec<u8>),
  13. }
  14. pub struct Server {
  15. r: usize,
  16. thread_handle: JoinHandle<()>,
  17. incoming_cmd: SyncSender<Command>,
  18. outgoing_resp: Receiver<Response>,
  19. }
  20. impl Server {
  21. pub fn new(r: usize, pub_params: Vec<u8>) -> Self {
  22. let (incoming_cmd, incoming_cmd_recv) = sync_channel(0);
  23. let (outgoing_resp_send, outgoing_resp) = sync_channel(0);
  24. let thread_handle = spawn(move || {
  25. let spiral_params = params::get_spiral_params(r);
  26. let pub_params = PublicParameters::deserialize(&spiral_params, &pub_params);
  27. loop {
  28. println!("Waiting");
  29. match incoming_cmd_recv.recv() {
  30. Err(_) => break,
  31. _ => panic!("Received something unexpected"),
  32. }
  33. }
  34. println!("Ending");
  35. });
  36. Server {
  37. r,
  38. thread_handle,
  39. incoming_cmd,
  40. outgoing_resp,
  41. }
  42. }
  43. }
  44. #[no_mangle]
  45. pub extern "C" fn spir_server_new(
  46. r: u8,
  47. pub_params: *const c_uchar,
  48. pub_params_len: usize,
  49. ) -> *mut Server {
  50. let pub_params_slice = unsafe {
  51. assert!(!pub_params.is_null());
  52. std::slice::from_raw_parts(pub_params, pub_params_len)
  53. };
  54. let mut pub_params_vec: Vec<u8> = Vec::new();
  55. pub_params_vec.extend_from_slice(pub_params_slice);
  56. let server = Server::new(r as usize, pub_params_vec);
  57. Box::into_raw(Box::new(server))
  58. }
  59. #[no_mangle]
  60. pub extern "C" fn spir_server_free(server: *mut Server) {
  61. if server.is_null() {
  62. return;
  63. }
  64. unsafe {
  65. Box::from_raw(server);
  66. }
  67. }