summaryrefslogtreecommitdiff
path: root/src/resources.cpp
diff options
context:
space:
mode:
authorKrzysztof Grobelny <krzysztof.grobelny@intel.com>2020-07-03 13:35:09 +0300
committerKarol Wachowski <karol.wachowski@intel.com>2020-07-17 09:48:46 +0300
commitd113e4284674d112aff0744fe734581bd3fc4abf (patch)
tree727b644c30a050f39d5fdd21452f40d70cf1df1a /src/resources.cpp
parent1d453d987d5ece338aad08cee315fbacf179e692 (diff)
downloadvirtual-media-d113e4284674d112aff0744fe734581bd3fc4abf.tar.xz
Fixing multiple problems with state machine in virtual media
- Previously machine did not handle AnyEvent correctly, implementation in BaseState was always run - Changing from ActiveState to ReadyState was bugged, previously only one of event SubprocessStopped or UdevNotification caused state change when it is required to wait for both - Introduced longer timer when waiting for ReadyState during Eject and ActiveState during Inject, because ndbkit can timeout during Eject and it is required to complete before next inject can success. - Added event notification when process is terminated - Added resourcess classes to handle deletion and notifications Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com> Signed-off-by: Karol Wachowski <karol.wachowski@intel.com> Change-Id: Ie914e650c2f15bd73cdc87582ea77a94997a3472 Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
Diffstat (limited to 'src/resources.cpp')
-rw-r--r--src/resources.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/resources.cpp b/src/resources.cpp
new file mode 100644
index 0000000..a501bba
--- /dev/null
+++ b/src/resources.cpp
@@ -0,0 +1,48 @@
+#include "resources.hpp"
+
+#include "interfaces/mount_point_state_machine.hpp"
+
+namespace resource
+{
+
+Process::~Process()
+{
+ if (spawned)
+ {
+ process->stop([& machine = *machine] {
+ boost::asio::post(machine.getIoc(), [&machine]() {
+ machine.emitSubprocessStoppedEvent();
+ });
+ });
+ }
+}
+
+Gadget::Gadget(interfaces::MountPointStateMachine& machine,
+ StateChange devState) :
+ machine(&machine)
+{
+ status = UsbGadget::configure(
+ std::string(machine.getName()), machine.getConfig().nbdDevice, devState,
+ machine.getTarget() ? machine.getTarget()->rw : false);
+}
+
+Gadget::~Gadget()
+{
+ int32_t ret = UsbGadget::configure(std::string(machine->getName()),
+ machine->getConfig().nbdDevice,
+ StateChange::removed);
+ if (ret != 0)
+ {
+ // This shouldn't ever happen, perhaps best is to restart
+ // app
+ LogMsg(Logger::Critical, machine->getName(),
+ " Some serious failure happened!");
+
+ boost::asio::post(machine->getIoc(), [& machine = *machine]() {
+ machine.emitUdevStateChangeEvent(machine.getConfig().nbdDevice,
+ StateChange::unknown);
+ });
+ }
+}
+
+} // namespace resource