Free memory from rust -> dart
This commit is contained in:
parent
b404497315
commit
60b8f0475e
|
@ -13,10 +13,14 @@ typedef void *DartPostCObjectFnType;
|
||||||
|
|
||||||
void dummy_export(void);
|
void dummy_export(void);
|
||||||
|
|
||||||
|
void deallocate_str(char *s);
|
||||||
|
|
||||||
void dart_post_cobject(DartPostCObjectFnType ptr);
|
void dart_post_cobject(DartPostCObjectFnType ptr);
|
||||||
|
|
||||||
bool get_error(void);
|
bool get_error(void);
|
||||||
|
|
||||||
|
char *get_error_msg(void);
|
||||||
|
|
||||||
void init_wallet(char *db_path);
|
void init_wallet(char *db_path);
|
||||||
|
|
||||||
void set_active(uint8_t active);
|
void set_active(uint8_t active);
|
||||||
|
@ -94,7 +98,7 @@ char *generate_random_enc_key(void);
|
||||||
|
|
||||||
char *get_full_backup(char *key);
|
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);
|
char *split_data(uint32_t id, char *data);
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
use crate::coinconfig::{init_coin, CoinConfig};
|
use crate::coinconfig::{init_coin, CoinConfig};
|
||||||
use crate::FountainCodes;
|
|
||||||
use crate::{ChainError, Tx};
|
use crate::{ChainError, Tx};
|
||||||
use allo_isolate::{ffi, IntoDart};
|
use allo_isolate::{ffi, IntoDart};
|
||||||
use android_logger::Config;
|
use android_logger::Config;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::Level;
|
use log::Level;
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
use std::io::Read;
|
|
||||||
use std::os::raw::c_char;
|
use std::os::raw::c_char;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
@ -15,6 +14,10 @@ use zcash_primitives::transaction::builder::Progress;
|
||||||
static mut POST_COBJ: Option<ffi::DartPostCObjectFnType> = None;
|
static mut POST_COBJ: Option<ffi::DartPostCObjectFnType> = None;
|
||||||
static IS_ERROR: AtomicBool = AtomicBool::new(false);
|
static IS_ERROR: AtomicBool = AtomicBool::new(false);
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref LAST_ERROR: Mutex<RefCell<String>> = Mutex::new(RefCell::new(String::new()));
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn dummy_export() {}
|
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()
|
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() {
|
fn try_init_logger() {
|
||||||
android_logger::init_once(
|
android_logger::init_once(
|
||||||
Config::default()
|
Config::default()
|
||||||
|
@ -53,9 +61,15 @@ fn log_result<T: Default>(result: anyhow::Result<T>) -> T {
|
||||||
match result {
|
match result {
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("{}", 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()
|
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 {
|
match result {
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("{}", err);
|
log::error!("{}", err);
|
||||||
|
let last_error = LAST_ERROR.lock().unwrap();
|
||||||
|
last_error.replace(err.to_string());
|
||||||
IS_ERROR.store(true, Ordering::Release);
|
IS_ERROR.store(true, Ordering::Release);
|
||||||
format!("{}", err)
|
format!("{}", err)
|
||||||
}
|
}
|
||||||
|
@ -78,6 +94,13 @@ pub unsafe extern "C" fn get_error() -> bool {
|
||||||
IS_ERROR.load(Ordering::Acquire)
|
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]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn init_wallet(db_path: *mut c_char) {
|
pub unsafe extern "C" fn init_wallet(db_path: *mut c_char) {
|
||||||
try_init_logger();
|
try_init_logger();
|
||||||
|
@ -480,7 +503,7 @@ pub unsafe extern "C" fn get_full_backup(key: *mut c_char) -> *mut c_char {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[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!(key);
|
||||||
from_c_str!(backup);
|
from_c_str!(backup);
|
||||||
let res = || {
|
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] {
|
for coin in [0, 1] {
|
||||||
crate::api::fullbackup::restore_full_backup(coin, &accounts)?;
|
crate::api::fullbackup::restore_full_backup(coin, &accounts)?;
|
||||||
}
|
}
|
||||||
Ok(String::new())
|
Ok(())
|
||||||
};
|
};
|
||||||
to_c_str(log_string(res()))
|
log_result(res())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|
|
@ -3,7 +3,6 @@ use blake2b_simd::Params;
|
||||||
use byteorder::{ReadBytesExt, WriteBytesExt, LE};
|
use byteorder::{ReadBytesExt, WriteBytesExt, LE};
|
||||||
use raptorq::{Decoder, Encoder, EncodingPacket, ObjectTransmissionInformation};
|
use raptorq::{Decoder, Encoder, EncodingPacket, ObjectTransmissionInformation};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use std::borrow::BorrowMut;
|
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::io::{Cursor, Write};
|
use std::io::{Cursor, Write};
|
||||||
|
|
||||||
|
|
10
src/pay.rs
10
src/pay.rs
|
@ -427,18 +427,8 @@ pub async fn broadcast_tx(tx: &[u8]) -> anyhow::Result<String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_tx_summary(tx: &Tx) -> anyhow::Result<TxSummary> {
|
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![];
|
let mut recipients = vec![];
|
||||||
for tx_out in tx.outputs.iter() {
|
for tx_out in tx.outputs.iter() {
|
||||||
amount -= tx_out.amount;
|
|
||||||
recipients.push(RecipientSummary {
|
recipients.push(RecipientSummary {
|
||||||
address: tx_out.addr.clone(),
|
address: tx_out.addr.clone(),
|
||||||
amount: tx_out.amount,
|
amount: tx_out.amount,
|
||||||
|
|
Loading…
Reference in New Issue