2014-11-21 1 views
4

C FFI 라이브러리에 대한 Rust 래퍼를 작성하려고하지만 기본 라이브러리에는 스레드로부터 안전하지 않은 일부 기능이 있습니다. 이러한 함수에 액세스하려면 C 라이브러리의 상태를 보호하는 일종의 전역 잠금이 필요합니다.Rust에서 FFI 호출에 대한 액세스 동기화 (전역 RWLock을 통해)

std::sync::RWLock 또는 이와 유사한 메커니즘을 사용하여 C 라이브러리에 대한 액세스를 제어 할 수있는 방법이 있습니까? sync::mutex::StaticMutex를 사용

error: function calls in constants are limited to struct and enum constructors [E0015] 
example.rs:18 static global_state_lock: RWLock<()> = RWLock::new(()); 
+0

안전하지 않은 코드를 사용하지 않으면 가능하지 않다고 생각합니다. 자물쇠를 전달해야합니다, 그것은'Sync + Send'이므로 아무 문제가 없습니다. – snf

답변

6

이 문제가 해결 될 수있다 : 녹 비 사소한 글로벌 초기화를 허용하지 않기 때문에

다양한 확실한 솔루션은 실패

extern crate sync; 
use sync::mutex::{StaticMutex, MUTEX_INIT}; 

static LIBRARY_LOCK: StaticMutex = MUTEX_INIT; 

fn access_global_resource() { 
    let _ = LIBRARY_LOCK.lock(); 
    unsafe { call_thread_unsafe_c_api(); } 
} 

많은 감사를 #rust에 arrrrrrr1하는 사람 나를 올바른 방향으로 가리켰다.

+0

이 API는 유동적 인 것 같습니다. 자세한 내용은 다음을 참조하십시오. https://github.com/rust-lang/rust/issues/19379 – emk

+0

API가 'lazy_static'상자를 사용하여 지원 중단 된 것으로 보입니다. 이걸 어떻게 수행 할 수 있는지에 대한 예가 있습니까? – crazysim

관련 문제