Skip to content

Commit 408a85d

Browse files
committed
Virtualization in C++ across FFI
1 parent 102a6ce commit 408a85d

File tree

2 files changed

+33
-1
lines changed
  • include/multipass/logging
  • rxx/rust_logger/src

2 files changed

+33
-1
lines changed

include/multipass/logging/log.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
*/
1717

1818
#pragma once
19+
#include <iostream>
1920

21+
#include <memory>
2022
#include <multipass/logging/level.h>
2123
#include <multipass/logging/logger.h>
2224
#include <rust/cxx.h>
@@ -45,7 +47,29 @@ Logger* get_logger(); // for tests, don't rely on it lasting
4547
namespace rust
4648
{
4749
void log_message(Level level, ::rust::String category, ::rust::String message);
50+
class Base
51+
{
52+
public:
53+
virtual ~Base() = default;
54+
virtual void virt_func()
55+
{
56+
std::cout << "\nBase\n";
57+
}
58+
};
59+
class Derived : public Base
60+
{
61+
public:
62+
~Derived() override = default;
63+
void virt_func() override
64+
{
65+
std::cout << "\nDerived\n";
66+
}
67+
};
68+
inline std::unique_ptr<Base> get_base()
69+
{
70+
return std::make_unique<Derived>();
4871
}
72+
} // namespace rust
4973
/**
5074
* Log with formatting support
5175
*

rxx/rust_logger/src/lib.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ pub mod ffi {
1818
//fn level_from(in_: i32) -> Level;
1919
include!("multipass/logging/log.h");
2020
#[namespace = "multipass::logging::rust"]
21+
type Base;
22+
#[namespace = "multipass::logging::rust"]
23+
fn virt_func(self: Pin<&mut Base>);
24+
#[namespace = "multipass::logging::rust"]
25+
fn get_base() -> UniquePtr<Base>;
26+
#[namespace = "multipass::logging::rust"]
2127
fn log_message(level: Level, category: String, message: String) -> Result<()>;
2228
//Result<1Type> in a CXX bridge unsafe extern C++ will convert to a try-catch in the C++
2329
//side which will convert the C++ exception to a rust error.
@@ -37,6 +43,8 @@ fn log_message(level: ffi::Level, category: String, message: String) {
3743
};
3844
}
3945
pub fn log_error(category: String, message: String) {
40-
log_message(ffi::Level::error, category, message)
46+
log_message(ffi::Level::error, category, message);
47+
let mut base = ffi::get_base();
48+
base.pin_mut().virt_func();
4149
}
4250
fn rust_test_bridge() {}

0 commit comments

Comments
 (0)