mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-29 13:23:54 -06:00
bql: add a "mock" BQL for Rust unit tests
Right now, the stub BQL in stubs/iothread-lock.c always reports itself as unlocked. However, Rust would like to run its tests in an environment where the BQL *is* locked. Provide an extremely dirty function that flips the return value of bql_is_locked() to true. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
716d89f9cc
commit
d4873c5d4f
5 changed files with 45 additions and 5 deletions
|
@ -247,6 +247,14 @@ void event_notifier_set_handler(EventNotifier *e,
|
||||||
GSource *iohandler_get_g_source(void);
|
GSource *iohandler_get_g_source(void);
|
||||||
AioContext *iohandler_get_aio_context(void);
|
AioContext *iohandler_get_aio_context(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rust_bql_mock_lock:
|
||||||
|
*
|
||||||
|
* Called from Rust doctests to make bql_lock() return true.
|
||||||
|
* Do not touch.
|
||||||
|
*/
|
||||||
|
void rust_bql_mock_lock(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bql_locked: Return lock status of the Big QEMU Lock (BQL)
|
* bql_locked: Return lock status of the Big QEMU Lock (BQL)
|
||||||
*
|
*
|
||||||
|
|
|
@ -60,7 +60,7 @@ test('rust-qemu-api-integration',
|
||||||
dependencies: [qemu_api, qemu_api_macros],
|
dependencies: [qemu_api, qemu_api_macros],
|
||||||
link_whole: [rust_qemu_api_objs, libqemuutil]),
|
link_whole: [rust_qemu_api_objs, libqemuutil]),
|
||||||
args: [
|
args: [
|
||||||
'--test',
|
'--test', '--test-threads', '1',
|
||||||
'--format', 'pretty',
|
'--format', 'pretty',
|
||||||
],
|
],
|
||||||
protocol: 'rust',
|
protocol: 'rust',
|
||||||
|
|
|
@ -124,9 +124,18 @@ use std::{
|
||||||
|
|
||||||
use crate::bindings;
|
use crate::bindings;
|
||||||
|
|
||||||
// TODO: When building doctests do not include the actual BQL, because cargo
|
/// An internal function that is used by doctests.
|
||||||
// does not know how to link them to libqemuutil. This can be fixed by
|
pub fn bql_start_test() {
|
||||||
// running rustdoc from "meson test" instead of relying on cargo.
|
if cfg!(MESON) {
|
||||||
|
// SAFETY: integration tests are run with --test-threads=1, while
|
||||||
|
// unit tests and doctests are not multithreaded and do not have
|
||||||
|
// any BQL-protected data. Just set bql_locked to true.
|
||||||
|
unsafe {
|
||||||
|
bindings::rust_bql_mock_lock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn bql_locked() -> bool {
|
pub fn bql_locked() -> bool {
|
||||||
// SAFETY: the function does nothing but return a thread-local bool
|
// SAFETY: the function does nothing but return a thread-local bool
|
||||||
!cfg!(MESON) || unsafe { bindings::bql_locked() }
|
!cfg!(MESON) || unsafe { bindings::bql_locked() }
|
||||||
|
@ -220,6 +229,7 @@ impl<T> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlCell::new(5);
|
/// let c = BqlCell::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
|
@ -236,6 +246,7 @@ impl<T> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlCell::new(5);
|
/// let c = BqlCell::new(5);
|
||||||
///
|
///
|
||||||
|
@ -253,6 +264,7 @@ impl<T> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let cell = BqlCell::new(5);
|
/// let cell = BqlCell::new(5);
|
||||||
/// assert_eq!(cell.get(), 5);
|
/// assert_eq!(cell.get(), 5);
|
||||||
|
@ -274,6 +286,7 @@ impl<T> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlCell::new(5);
|
/// let c = BqlCell::new(5);
|
||||||
/// let five = c.into_inner();
|
/// let five = c.into_inner();
|
||||||
|
@ -293,6 +306,7 @@ impl<T: Copy> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlCell::new(5);
|
/// let c = BqlCell::new(5);
|
||||||
///
|
///
|
||||||
|
@ -315,6 +329,7 @@ impl<T> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlCell::new(5);
|
/// let c = BqlCell::new(5);
|
||||||
///
|
///
|
||||||
|
@ -333,6 +348,7 @@ impl<T: Default> BqlCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlCell;
|
/// use qemu_api::cell::BqlCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlCell::new(5);
|
/// let c = BqlCell::new(5);
|
||||||
/// let five = c.take();
|
/// let five = c.take();
|
||||||
|
@ -461,6 +477,7 @@ impl<T> BqlRefCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlRefCell;
|
/// use qemu_api::cell::BqlRefCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlRefCell::new(5);
|
/// let c = BqlRefCell::new(5);
|
||||||
///
|
///
|
||||||
|
@ -472,6 +489,7 @@ impl<T> BqlRefCell<T> {
|
||||||
///
|
///
|
||||||
/// ```should_panic
|
/// ```should_panic
|
||||||
/// use qemu_api::cell::BqlRefCell;
|
/// use qemu_api::cell::BqlRefCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlRefCell::new(5);
|
/// let c = BqlRefCell::new(5);
|
||||||
///
|
///
|
||||||
|
@ -513,6 +531,7 @@ impl<T> BqlRefCell<T> {
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use qemu_api::cell::BqlRefCell;
|
/// use qemu_api::cell::BqlRefCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlRefCell::new("hello".to_owned());
|
/// let c = BqlRefCell::new("hello".to_owned());
|
||||||
///
|
///
|
||||||
|
@ -525,6 +544,7 @@ impl<T> BqlRefCell<T> {
|
||||||
///
|
///
|
||||||
/// ```should_panic
|
/// ```should_panic
|
||||||
/// use qemu_api::cell::BqlRefCell;
|
/// use qemu_api::cell::BqlRefCell;
|
||||||
|
/// # qemu_api::cell::bql_start_test();
|
||||||
///
|
///
|
||||||
/// let c = BqlRefCell::new(5);
|
/// let c = BqlRefCell::new(5);
|
||||||
/// let m = c.borrow();
|
/// let m = c.borrow();
|
||||||
|
|
|
@ -1,11 +1,17 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
|
|
||||||
|
static bool bql_is_locked = false;
|
||||||
static uint32_t bql_unlock_blocked;
|
static uint32_t bql_unlock_blocked;
|
||||||
|
|
||||||
bool bql_locked(void)
|
bool bql_locked(void)
|
||||||
{
|
{
|
||||||
return false;
|
return bql_is_locked;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rust_bql_mock_lock(void)
|
||||||
|
{
|
||||||
|
bql_is_locked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bql_lock_impl(const char *file, int line)
|
void bql_lock_impl(const char *file, int line)
|
||||||
|
|
|
@ -538,6 +538,12 @@ bool qemu_in_main_thread(void)
|
||||||
return bql_locked();
|
return bql_locked();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rust_bql_mock_lock(void)
|
||||||
|
{
|
||||||
|
error_report("This function should be used only from tests");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The BQL is taken from so many places that it is worth profiling the
|
* The BQL is taken from so many places that it is worth profiling the
|
||||||
* callers directly, instead of funneling them all through a single function.
|
* callers directly, instead of funneling them all through a single function.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue