1
0

feat: add ext status for cdylib

This commit is contained in:
2026-05-17 16:02:39 +08:00
parent fe9f839091
commit f1a7cb89e5
2 changed files with 68 additions and 3 deletions

View File

@@ -191,6 +191,9 @@ static SCHEMA_POOL: LazyLock<RwLock<ObjectPool<Schema>>> =
static PROGRAM_POOL: LazyLock<RwLock<ObjectPool<Program>>> =
LazyLock::new(|| RwLock::new(ObjectPool::new()));
static EXT_STATUE_POOL: LazyLock<RwLock<ObjectPool<wfassoc::highlevel::ProgramExtStatus>>> =
LazyLock::new(|| RwLock::new(ObjectPool::new()));
// endregion
// region: Exposed Types
@@ -241,6 +244,7 @@ pub extern "C" fn WFStartup() -> bool {
cffi_wrapper!(|| {
let _pool = pull_writer!(SCHEMA_POOL)?;
let _pool = pull_writer!(PROGRAM_POOL)?;
let _pool = pull_writer!(EXT_STATUE_POOL)?;
Ok(())
})
}
@@ -253,6 +257,8 @@ pub extern "C" fn WFShutdown() -> bool {
pool.clear();
let mut pool = pull_writer!(PROGRAM_POOL)?;
pool.clear();
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
pool.clear();
Ok(())
})
}
@@ -527,8 +533,8 @@ pub extern "C" fn WFProgramIsRegistered(
out_is_registered: out_param_ty!(bool),
) -> bool {
cffi_wrapper!(|in_program: Token, in_scope: u32| -> (out_is_registered: bool) {
let mut pool = pull_writer!(PROGRAM_POOL)?;
let program = pool.get_mut(in_program)?;
let pool = pull_reader!(PROGRAM_POOL)?;
let program = pool.get(in_program)?;
let scope = resolve_enum!(Scope, in_scope)?;
Ok(program.is_registered(scope.into())?)
})
@@ -564,6 +570,53 @@ pub extern "C" fn WFProgramUnlinkExt(
})
}
// endregion
#[unsafe(no_mangle)]
pub extern "C" fn WFProgramQueryExt(
in_program: in_param_ty!(Token),
in_view: in_param_ty!(u32),
in_index: in_param_ty!(usize),
out_ext_status: out_param_ty!(Token),
) -> bool {
cffi_wrapper!(|in_program: Token, in_view: u32, in_index: usize| -> (out_ext_status: Token) {
let pool = pull_reader!(PROGRAM_POOL)?;
let program = pool.get(in_program)?;
let view = resolve_enum!(View, in_view)?;
let ext_status = program.query_ext(view.into(), in_index)?;
todo!();
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
Ok(pool.allocate(ext_status)?)
})
}
// endregion
#[unsafe(no_mangle)]
pub extern "C" fn WFExtStatusDestroy(in_ext_status: in_param_ty!(Token)) -> bool {
cffi_wrapper!(|in_ext_status: Token| {
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
Ok(pool.free(in_ext_status)?)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFExtStatuGetName(in_ext_status: in_param_ty!(Token), out_name: out_param_ty!(CStyleString)) -> bool {
cffi_wrapper!(|in_ext_status: Token| -> (out_name: CStyleString) {
let pool = pull_reader!(EXT_STATUE_POOL)?;
let ext_status = pool.get(in_ext_status)?;
cstr_ffi::set_ffi_string(ext_status.get_name())?;
Ok(cstr_ffi::get_ffi_string())
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFExtStatuGetIcon(in_ext_status: in_param_ty!(Token), out_icon: out_param_ty!(HICON)) -> bool {
cffi_wrapper!(|in_ext_status: Token| -> (out_icon: HICON) {
let pool = pull_reader!(EXT_STATUE_POOL)?;
let ext_status = pool.get(in_ext_status)?;
Ok(ext_status.get_icon())
})
}
// endregion

View File

@@ -575,6 +575,18 @@ impl Drop for IconRc {
}
}
// SAFETY:
// Win32 HICON can be safely moved between different threads naturally.
unsafe impl Send for IconRc {}
// SAFETY:
// When multiple threads calling this struct, there is no conflict between them,
// because this struct only provide HICON itself.
//
// However, the caller should ensure that all calls using this HICON
// follow Win32 thread model.
unsafe impl Sync for IconRc {}
// endregion
// region: String Resource