diff options
author | Krzysztof Grobelny <krzysztof.grobelny@intel.com> | 2020-07-03 13:35:09 +0300 |
---|---|---|
committer | Karol Wachowski <karol.wachowski@intel.com> | 2020-07-17 09:48:46 +0300 |
commit | d113e4284674d112aff0744fe734581bd3fc4abf (patch) | |
tree | 727b644c30a050f39d5fdd21452f40d70cf1df1a /src/resources.cpp | |
parent | 1d453d987d5ece338aad08cee315fbacf179e692 (diff) | |
download | virtual-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.cpp | 48 |
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 |