Free memory from rust -> dart

This commit is contained in:
Hanh 2022-06-22 21:03:49 +08:00
parent b404497315
commit 60b8f0475e
4 changed files with 34 additions and 18 deletions

View File

@ -13,10 +13,14 @@ typedef void *DartPostCObjectFnType;
void dummy_export(void);
void deallocate_str(char *s);
void dart_post_cobject(DartPostCObjectFnType ptr);
bool get_error(void);
char *get_error_msg(void);
void init_wallet(char *db_path);
void set_active(uint8_t active);
@ -94,7 +98,7 @@ char *generate_random_enc_key(void);
char *get_full_backup(char *key);
char *restore_full_backup(char *key, char *backup);
void restore_full_backup(char *key, char *backup);
char *split_data(uint32_t id, char *data);

View File

@ -1,12 +1,11 @@
use crate::coinconfig::{init_coin, CoinConfig};
use crate::FountainCodes;
use crate::{ChainError, Tx};
use allo_isolate::{ffi, IntoDart};
use android_logger::Config;
use lazy_static::lazy_static;
use log::Level;
use std::cell::RefCell;
use std::ffi::{CStr, CString};
use std::io::Read;
use std::os::raw::c_char;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Mutex;
@ -15,6 +14,10 @@ use zcash_primitives::transaction::builder::Progress;
static mut POST_COBJ: Option<ffi::DartPostCObjectFnType> = None;
static IS_ERROR: AtomicBool = AtomicBool::new(false);
lazy_static! {
static ref LAST_ERROR: Mutex<RefCell<String>> = Mutex::new(RefCell::new(String::new()));
}
#[no_mangle]
pub unsafe extern "C" fn dummy_export() {}
@ -33,6 +36,11 @@ fn to_c_str(s: String) -> *mut c_char {
CString::new(s).unwrap().into_raw()
}
#[no_mangle]
pub unsafe extern "C" fn deallocate_str(s: *mut c_char) {
let _ = CString::from_raw(s);
}
fn try_init_logger() {
android_logger::init_once(
Config::default()
@ -53,9 +61,15 @@ fn log_result<T: Default>(result: anyhow::Result<T>) -> T {
match result {
Err(err) => {
log::error!("{}", err);
let last_error = LAST_ERROR.lock().unwrap();
last_error.replace(err.to_string());
IS_ERROR.store(true, Ordering::Release);
T::default()
}
Ok(v) => v,
Ok(v) => {
IS_ERROR.store(false, Ordering::Release);
v
}
}
}
@ -63,6 +77,8 @@ fn log_string(result: anyhow::Result<String>) -> String {
match result {
Err(err) => {
log::error!("{}", err);
let last_error = LAST_ERROR.lock().unwrap();
last_error.replace(err.to_string());
IS_ERROR.store(true, Ordering::Release);
format!("{}", err)
}
@ -78,6 +94,13 @@ pub unsafe extern "C" fn get_error() -> bool {
IS_ERROR.load(Ordering::Acquire)
}
#[no_mangle]
pub unsafe extern "C" fn get_error_msg() -> *mut c_char {
let error = LAST_ERROR.lock().unwrap();
let e = error.take();
to_c_str(e)
}
#[no_mangle]
pub unsafe extern "C" fn init_wallet(db_path: *mut c_char) {
try_init_logger();
@ -480,7 +503,7 @@ pub unsafe extern "C" fn get_full_backup(key: *mut c_char) -> *mut c_char {
}
#[no_mangle]
pub unsafe extern "C" fn restore_full_backup(key: *mut c_char, backup: *mut c_char) -> *mut c_char {
pub unsafe extern "C" fn restore_full_backup(key: *mut c_char, backup: *mut c_char) {
from_c_str!(key);
from_c_str!(backup);
let res = || {
@ -488,9 +511,9 @@ pub unsafe extern "C" fn restore_full_backup(key: *mut c_char, backup: *mut c_ch
for coin in [0, 1] {
crate::api::fullbackup::restore_full_backup(coin, &accounts)?;
}
Ok(String::new())
Ok(())
};
to_c_str(log_string(res()))
log_result(res())
}
#[no_mangle]

View File

@ -3,7 +3,6 @@ use blake2b_simd::Params;
use byteorder::{ReadBytesExt, WriteBytesExt, LE};
use raptorq::{Decoder, Encoder, EncodingPacket, ObjectTransmissionInformation};
use serde::Serialize;
use std::borrow::BorrowMut;
use std::convert::TryInto;
use std::io::{Cursor, Write};

View File

@ -427,18 +427,8 @@ pub async fn broadcast_tx(tx: &[u8]) -> anyhow::Result<String> {
}
pub fn get_tx_summary(tx: &Tx) -> anyhow::Result<TxSummary> {
let mut amount = 0;
for tx_in in tx.t_inputs.iter() {
// transparent inputs
amount += tx_in.amount;
}
for tx_in in tx.inputs.iter() {
// shielded inputs
amount += tx_in.amount;
}
let mut recipients = vec![];
for tx_out in tx.outputs.iter() {
amount -= tx_out.amount;
recipients.push(RecipientSummary {
address: tx_out.addr.clone(),
amount: tx_out.amount,