mirror of
https://github.com/openharmony/windowmanager.git
synced 2026-07-19 17:08:11 -04:00
增加map的原子操作
Signed-off-by: dubj <dubingjian@huawei.com> Change-Id: I92ad25aa4672cd12eb2799b6aeb00ba6b78923e4
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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_;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user