zone->setDbusStateChangedCallback(bind(&ZonesManager::handleDbusStateChanged,
this, id, _1));
+ Lock lock(mMutex);
+
mZones.insert(ZoneMap::value_type(id, std::move(zone)));
// after zone is created successfully, put a file informing that zones are enabled
void ZonesManager::destroyZone(const std::string& zoneId)
{
- // TODO mutex for mZones access
+ Lock lock(mMutex);
+
auto it = mZones.find(zoneId);
if (it == mZones.end()) {
LOGE("Failed to destroy zone " << zoneId << ": no such zone");
void ZonesManager::focus(const std::string& zoneId)
{
+ Lock lock(mMutex);
+
/* try to access the object first to throw immediately if it doesn't exist */
ZoneMap::mapped_type& foregroundZone = mZones.at(zoneId);
{
LOGI("Starting all zones");
+ Lock lock(mMutex);
+
bool isForegroundFound = false;
for (auto& zone : mZones) {
{
LOGI("Stopping all zones");
+ Lock lock(mMutex);
+
for (auto& zone : mZones) {
zone.second->stop();
}
bool ZonesManager::isPaused(const std::string& zoneId)
{
+ Lock lock(mMutex);
+
auto iter = mZones.find(zoneId);
if (iter == mZones.end()) {
LOGE("No such zone id: " << zoneId);
bool ZonesManager::isRunning(const std::string& zoneId)
{
+ Lock lock(mMutex);
+
auto iter = mZones.find(zoneId);
if (iter == mZones.end()) {
LOGE("No such zone id: " << zoneId);
std::string ZonesManager::getRunningForegroundZoneId() const
{
+ Lock lock(mMutex);
+
for (auto& zone : mZones) {
if (zone.first == mConfig.foregroundId &&
zone.second->isRunning()) {
std::string ZonesManager::getNextToForegroundZoneId()
{
+ Lock lock(mMutex);
+
// handles case where there is no next zone
if (mZones.size() < 2) {
return std::string();
void ZonesManager::setZonesDetachOnExit()
{
+ Lock lock(mMutex);
+
mDetachOnExit = true;
for (auto& zone : mZones) {
{
LOGI("notifyActiveZoneHandler(" << caller << ", " << application << ", " << message
<< ") called");
+
+ Lock lock(mMutex);
+
try {
const std::string activeZone = getRunningForegroundZoneId();
if (!activeZone.empty() && caller != activeZone) {
void ZonesManager::displayOffHandler(const std::string& /*caller*/)
{
// get config of currently set zone and switch if switchToDefaultAfterTimeout is true
+ Lock lock(mMutex);
+
const std::string activeZoneName = getRunningForegroundZoneId();
const auto& activeZone = mZones.find(activeZoneName);
<< "dst: " << dstZoneId << "\n"
<< "path: " << path);
+ Lock lock(mMutex);
+
ZoneMap::const_iterator srcIter = mZones.find(srcZoneId);
if (srcIter == mZones.end()) {
LOGE("Source zone '" << srcZoneId << "' not found");
return;
}
+ Lock lock(mMutex);
+
ZoneMap::const_iterator targetIter = mZones.find(target);
if (targetIter == mZones.end()) {
LOGE("Target zone '" << target << "' not found");
void ZonesManager::handleGetZoneDbuses(dbus::MethodResultBuilder::Pointer result) const
{
+ Lock lock(mMutex);
+
std::vector<GVariant*> entries;
for (auto& zone : mZones) {
GVariant* zoneId = g_variant_new_string(zone.first.c_str());
void ZonesManager::handleGetZoneIdsCall(dbus::MethodResultBuilder::Pointer result) const
{
+ Lock lock(mMutex);
+
std::vector<GVariant*> zoneIds;
for(auto& zone: mZones){
zoneIds.push_back(g_variant_new_string(zone.first.c_str()));
void ZonesManager::handleGetActiveZoneIdCall(dbus::MethodResultBuilder::Pointer result)
{
LOGI("GetActiveZoneId call");
+
+ Lock lock(mMutex);
+
if (!mConfig.foregroundId.empty() && mZones[mConfig.foregroundId]->isRunning()){
result->set(g_variant_new("(s)", mConfig.foregroundId.c_str()));
} else {
dbus::MethodResultBuilder::Pointer result)
{
LOGI("GetZoneInfo call");
+
+ Lock lock(mMutex);
+
if (mZones.count(id) == 0) {
LOGE("No zone with id=" << id);
result->setError(api::ERROR_INVALID_ID, "No such zone id");
dbus::MethodResultBuilder::Pointer result)
{
LOGI("DeclareFile call");
+
try {
+ Lock lock(mMutex);
+
mZones.at(zone)->declareFile(type, path, flags, mode);
result->setVoid();
} catch (const std::out_of_range&) {
dbus::MethodResultBuilder::Pointer result)
{
LOGI("DeclareMount call");
+
try {
+ Lock lock(mMutex);
+
mZones.at(zone)->declareMount(source, target, type, flags, data);
result->setVoid();
} catch (const std::out_of_range&) {
{
LOGI("DeclareLink call");
try {
+ Lock lock(mMutex);
+
mZones.at(zone)->declareLink(source, target);
result->setVoid();
} catch (const std::out_of_range&) {
dbus::MethodResultBuilder::Pointer result)
{
LOGI("SetActiveZone call; Id=" << id );
+
+ Lock lock(mMutex);
+
auto zone = mZones.find(id);
if (zone == mZones.end()){
LOGE("No zone with id=" << id );
LOGI("Creating zone " << id);
+ Lock lock(mMutex);
+
// TODO: This solution is temporary. It utilizes direct access to config files when creating new
// zones. Update this handler when config database will appear.
namespace fs = boost::filesystem;
void ZonesManager::handleDestroyZoneCall(const std::string& id,
dbus::MethodResultBuilder::Pointer result)
{
+ Lock lock(mMutex);
+
if (mZones.find(id) == mZones.end()) {
LOGE("Failed to destroy zone - no such zone id: " << id);
result->setError(api::ERROR_INVALID_ID, "No such zone id");
dbus::MethodResultBuilder::Pointer result)
{
LOGI("LockZone call; Id=" << id );
+
+ Lock lock(mMutex);
+
auto iter = mZones.find(id);
if (iter == mZones.end()) {
LOGE("Failed to lock zone - no such zone id: " << id);
dbus::MethodResultBuilder::Pointer result)
{
LOGI("UnlockZone call; Id=" << id );
+
+ Lock lock(mMutex);
+
auto iter = mZones.find(id);
if (iter == mZones.end()) {
LOGE("Failed to unlock zone - no such zone id: " << id);