From b4fbf406af1c2f3d06e65c3096c98a095b76c316 Mon Sep 17 00:00:00 2001 From: qwerty2501 <939468+qwerty2501@users.noreply.github.com> Date: Tue, 10 May 2022 22:45:01 +0900 Subject: [PATCH] =?UTF-8?q?ERROR=5FMESSAGE=E3=82=92once=20cell=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_core/Cargo.toml | 1 + voicevox_core/src/c_export.rs | 33 ++++++++++++++++----------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/voicevox_core/Cargo.toml b/voicevox_core/Cargo.toml index 119b0ad62..ea7e28315 100644 --- a/voicevox_core/Cargo.toml +++ b/voicevox_core/Cargo.toml @@ -12,6 +12,7 @@ crate-type = ["cdylib"] [dependencies] derive-getters = "0.2.0" derive-new = "0.5.9" +once_cell = "1.10.0" thiserror = "1.0.31" [build-dependencies] diff --git a/voicevox_core/src/c_export.rs b/voicevox_core/src/c_export.rs index 6cc129da4..2b02372b1 100644 --- a/voicevox_core/src/c_export.rs +++ b/voicevox_core/src/c_export.rs @@ -1,6 +1,8 @@ use super::*; +use once_cell::sync::Lazy; use std::ffi::CStr; use std::os::raw::{c_char, c_int}; +use std::sync::Mutex; /* * Cの関数として公開するための型や関数を定義するこれらの実装はinternal.rsに定義してある同名関数にある @@ -34,16 +36,21 @@ fn convert_result(result: Result) -> (Option, VoicevoxResultCode) { } // FIXME:static変数はunsafeなので各関数の戻り値をboolからVoicevoxResultCodeに変えてこのstatic変数を削除する -static mut ERROR_MESSAGE: String = String::new(); +static ERROR_MESSAGE: Lazy> = Lazy::new(|| Mutex::new(String::new())); + +fn set_message(message: &str) { + ERROR_MESSAGE + .lock() + .unwrap() + .replace_range(.., &format!("{}\0", message)); +} #[no_mangle] pub extern "C" fn initialize(use_gpu: bool, cpu_num_threads: c_int, load_all_models: bool) -> bool { let result = internal::initialize(use_gpu, cpu_num_threads as usize, load_all_models); //TODO: VoicevoxResultCodeを返すようにする if let Some(err) = result.err() { - unsafe { - ERROR_MESSAGE = format!("{}\0", err); - } + set_message(&format!("{}", err)); false } else { true @@ -55,9 +62,7 @@ pub extern "C" fn load_model(speaker_id: i64) -> bool { let result = internal::load_model(speaker_id); //TODO: VoicevoxResultCodeを返すようにする if let Some(err) = result.err() { - unsafe { - ERROR_MESSAGE = format!("{}\0", err); - } + set_message(&format!("{}", err)); false } else { true @@ -81,7 +86,7 @@ pub extern "C" fn metas() -> *const c_char { #[no_mangle] pub extern "C" fn last_error_message() -> *const c_char { - unsafe { ERROR_MESSAGE.as_ptr() as *const c_char } + unsafe { ERROR_MESSAGE.lock().unwrap().as_ptr() as *const c_char } } #[no_mangle] @@ -99,9 +104,7 @@ pub extern "C" fn yukarin_s_forward( let result = internal::yukarin_s_forward(length, phoneme_list, &unsafe { *speaker_id }, output); //TODO: VoicevoxResultCodeを返すようにする if let Some(err) = result.err() { - unsafe { - ERROR_MESSAGE = format!("{}\0", err); - } + set_message(&format!("{}", err)); false } else { true @@ -133,9 +136,7 @@ pub extern "C" fn yukarin_sa_forward( ); //TODO: VoicevoxResultCodeを返すようにする if let Some(err) = result.err() { - unsafe { - ERROR_MESSAGE = format!("{}\0", err); - } + set_message(&format!("{}", err)); false } else { true @@ -154,9 +155,7 @@ pub extern "C" fn decode_forward( let result = internal::decode_forward(length, phoneme_size, f0, phoneme, speaker_id, output); //TODO: VoicevoxResultCodeを返すようにする if let Some(err) = result.err() { - unsafe { - ERROR_MESSAGE = format!("{}\0", err); - } + set_message(&format!("{}", err)); false } else { true