增加map的原子操作

Signed-off-by: dubj <dubingjian@huawei.com>
Change-Id: I92ad25aa4672cd12eb2799b6aeb00ba6b78923e4
This commit is contained in:
dubj
2022-07-11 11:38:43 +08:00
parent e1193e5ee8
commit e292bab8cc
5 changed files with 115 additions and 8 deletions
+2 -1
View File
@@ -23,6 +23,7 @@
#include <surface.h>
#include <ui/rs_display_node.h>
#include "atomic_map.h"
#include "dm_common.h"
#include "display_dumper.h"
#include "screen.h"
@@ -117,7 +118,7 @@ private:
sptr<IDisplayChangeListener> displayChangeListener_;
sptr<DisplayDumper> displayDumper_;
static float customVirtualPixelRatio_;
std::map<ScreenId, uint32_t> accessTokenIdMaps_;
AtomicMap<ScreenId, uint32_t> accessTokenIdMaps_;
bool isAutoRotationOpen_;
};
} // namespace OHOS::Rosen
+3 -3
View File
@@ -178,16 +178,16 @@ ScreenId DisplayManagerService::CreateVirtualScreen(VirtualScreenOption option,
HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "dms:CreateVirtualScreen(%s)", option.name_.c_str());
ScreenId screenId = abstractScreenController_->CreateVirtualScreen(option, displayManagerAgent);
CHECK_SCREEN_AND_RETURN(SCREEN_ID_INVALID);
accessTokenIdMaps_[screenId] = IPCSkeleton::GetCallingTokenID();
accessTokenIdMaps_.insert(std::pair(screenId, IPCSkeleton::GetCallingTokenID()));
return screenId;
}
DMError DisplayManagerService::DestroyVirtualScreen(ScreenId screenId)
{
if (accessTokenIdMaps_[screenId] != IPCSkeleton::GetCallingTokenID()) {
if (!accessTokenIdMaps_.isExistAndRemove(screenId, IPCSkeleton::GetCallingTokenID())) {
return DMError::DM_ERROR_INVALID_CALLING;
}
accessTokenIdMaps_.erase(screenId);
WLOGFI("DestroyVirtualScreen::ScreenId: %{public}" PRIu64 "", screenId);
CHECK_SCREEN_AND_RETURN(DMError::DM_ERROR_INVALID_PARAM);
+106
View File
@@ -0,0 +1,106 @@
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ATOMIC_MAP_H
#define ATOMIC_MAP_H
#include <atomic>
#include <map>
#include "nocopyable.h"
namespace OHOS {
namespace Rosen {
template<class Key, class Value>
class AtomicMap {
public:
void insert(const std::pair<Key, Value>& kv)
{
locked();
data_.insert(kv);
unlocked();
}
void erase(const Key& key)
{
locked();
data_.erase(key);
unlocked();
}
auto find(Key k)
{
locked();
auto key = data_.find(k);
unlocked();
return key;
}
int count(Key k)
{
locked();
int size = data_.count(k);
unlocked();
return size;
}
bool isExistAndRemove(Key k, uint32_t value)
{
locked();
if (data_.count(k) <= 0) {
unlocked();
return false;
}
if (data_[k] == value) {
data_.erase(k);
unlocked();
return true;
}
unlocked();
return false;
}
bool isExist(Key k, uint32_t value)
{
locked();
if (data_.count(k) <= 0) {
unlocked();
return false;
}
if (data_[k] == value) {
unlocked();
return true;
}
unlocked();
return false;
}
private:
void locked()
{
bool expect = false;
while (!isWritingOrReading_.compare_exchange_weak(expect, true, std::memory_order_relaxed)) {
expect = false;
}
}
void unlocked()
{
isWritingOrReading_.store(false);
}
std::map<Key, Value> data_;
std::atomic<bool> isWritingOrReading_ { false };
};
} // Rosen
} // OHOS
#endif // ATOMIC_MAP_H
+2 -1
View File
@@ -24,6 +24,7 @@
#include <system_ability.h>
#include <window_manager_service_handler_stub.h>
#include <transaction/rs_interfaces.h>
#include "atomic_map.h"
#include "display_change_listener.h"
#include "drag_controller.h"
#include "freeze_controller.h"
@@ -124,7 +125,7 @@ private:
void ConfigureWindowManagerService();
static inline SingletonDelegator<WindowManagerService> delegator;
std::map<uint32_t, uint32_t> accessTokenIdMaps_;
AtomicMap<uint32_t, uint32_t> accessTokenIdMaps_;
sptr<WindowRoot> windowRoot_;
sptr<WindowController> windowController_;
sptr<InputWindowMonitor> inputWindowMonitor_;
+2 -3
View File
@@ -379,7 +379,7 @@ WMError WindowManagerService::CreateWindow(sptr<IWindow>& window, sptr<WindowPro
HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:CreateWindow(%u)", windowId);
return windowController_->CreateWindow(window, property, surfaceNode, windowId, token, pid, uid);
}).get();
accessTokenIdMaps_[windowId] = IPCSkeleton::GetCallingTokenID();
accessTokenIdMaps_.insert(std::pair(windowId, IPCSkeleton::GetCallingTokenID()));
return ret;
}
@@ -420,11 +420,10 @@ WMError WindowManagerService::RemoveWindow(uint32_t windowId)
WMError WindowManagerService::DestroyWindow(uint32_t windowId, bool onlySelf)
{
if (accessTokenIdMaps_[windowId] != IPCSkeleton::GetCallingTokenID()) {
if (!accessTokenIdMaps_.isExistAndRemove(windowId, IPCSkeleton::GetCallingTokenID())) {
WLOGFI("Operation rejected");
return WMError::WM_ERROR_INVALID_OPERATION;
}
accessTokenIdMaps_.erase(windowId);
return wmsTaskLooper_->ScheduleTask([this, windowId, onlySelf]() {
WLOGFI("[WMS] Destroy: %{public}u", windowId);
HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "wms:DestroyWindow(%u)", windowId);