diff --git a/dm/src/display.cpp b/dm/src/display.cpp index 0138da66..bb653a56 100644 --- a/dm/src/display.cpp +++ b/dm/src/display.cpp @@ -48,6 +48,11 @@ DisplayId Display::GetId() const return pImpl_->GetDisplayInfo()->GetDisplayId(); } +std::string Display::GetName() const +{ + return pImpl_->GetDisplayInfo()->GetName(); +} + int32_t Display::GetWidth() const { UpdateDisplayInfo(); diff --git a/dm/src/screen.cpp b/dm/src/screen.cpp index 8fb8c559..5153fad2 100644 --- a/dm/src/screen.cpp +++ b/dm/src/screen.cpp @@ -48,7 +48,7 @@ bool Screen::IsGroup() const return pImpl_->GetScreenInfo()->GetIsScreenGroup(); } -const std::string Screen::GetName() const +std::string Screen::GetName() const { return pImpl_->GetScreenInfo()->GetName(); } diff --git a/dmserver/include/abstract_display.h b/dmserver/include/abstract_display.h index 0461b3c0..41854282 100644 --- a/dmserver/include/abstract_display.h +++ b/dmserver/include/abstract_display.h @@ -33,7 +33,8 @@ public: constexpr static int32_t DEFAULT_HIGHT = 1280; constexpr static float DEFAULT_VIRTUAL_PIXEL_RATIO = 1.0; constexpr static uint32_t DEFAULT_FRESH_RATE = 60; - AbstractDisplay(DisplayId id, ScreenId screenId, ScreenId screenGroupId, sptr info); + AbstractDisplay(DisplayId id, ScreenId screenId, std::string name, + ScreenId screenGroupId, sptr info); WM_DISALLOW_COPY_AND_MOVE(AbstractDisplay); ~AbstractDisplay() = default; static inline bool IsVertical(Rotation rotation) @@ -71,6 +72,7 @@ private: DisplayId id_ { DISPLAY_ID_INVALID }; ScreenId screenId_ { SCREEN_ID_INVALID }; ScreenId screenGroupId_ { SCREEN_ID_INVALID }; + std::string name_ { "" }; int32_t offsetX_ { 0 }; int32_t offsetY_ { 0 }; int32_t width_ { 0 }; diff --git a/dmserver/include/abstract_screen.h b/dmserver/include/abstract_screen.h index f2b28a28..b552872a 100644 --- a/dmserver/include/abstract_screen.h +++ b/dmserver/include/abstract_screen.h @@ -81,7 +81,8 @@ protected: class AbstractScreenGroup : public AbstractScreen { public: - AbstractScreenGroup(sptr, ScreenId dmsId, ScreenId rsId, ScreenCombination combination); + AbstractScreenGroup(sptr, ScreenId dmsId, ScreenId rsId, std::string name, + ScreenCombination combination); AbstractScreenGroup() = delete; WM_DISALLOW_COPY_AND_MOVE(AbstractScreenGroup); ~AbstractScreenGroup(); diff --git a/dmserver/src/abstract_display.cpp b/dmserver/src/abstract_display.cpp index 35ee8266..479c60ae 100644 --- a/dmserver/src/abstract_display.cpp +++ b/dmserver/src/abstract_display.cpp @@ -26,11 +26,12 @@ namespace { constexpr int32_t PHONE_SCREEN_WIDTH = 2160; } -AbstractDisplay::AbstractDisplay(DisplayId id, ScreenId screenId, +AbstractDisplay::AbstractDisplay(DisplayId id, ScreenId screenId, std::string name, ScreenId screenGroupId, sptr info) : id_(id), screenId_(screenId), screenGroupId_(screenGroupId), + name_(name), width_(info->width_), height_(info->height_), refreshRate_(info->refreshRate_) @@ -207,6 +208,7 @@ sptr AbstractDisplay::ConvertToDisplayInfo() const if (displayInfo == nullptr) { return displayInfo; } + displayInfo->name_ = name_; displayInfo->SetOffsetX(offsetX_); displayInfo->SetOffsetY(offsetY_); displayInfo->SetWidth(width_); diff --git a/dmserver/src/abstract_display_controller.cpp b/dmserver/src/abstract_display_controller.cpp index eab38f35..fc9e6e2b 100644 --- a/dmserver/src/abstract_display_controller.cpp +++ b/dmserver/src/abstract_display_controller.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include "display_manager_agent_controller.h" @@ -453,8 +454,12 @@ void AbstractDisplayController::BindAloneScreenLocked(sptr realA return; } if (dummyDisplay_ == nullptr) { - sptr display = new(std::nothrow) AbstractDisplay(displayCount_.fetch_add(1), - realAbsScreen->dmsId_, realAbsScreen->groupDmsId_, info); + DisplayId displayId = displayCount_.fetch_add(1); + std::ostringstream buffer; + buffer<<"display_"< display = new(std::nothrow) AbstractDisplay(displayId, realAbsScreen->dmsId_, + name, realAbsScreen->groupDmsId_, info); if (display == nullptr) { WLOGFE("create display failed"); return; @@ -519,9 +524,12 @@ void AbstractDisplayController::AddScreenToExpandLocked(sptr abs WLOGE("bind display error, cannot get info."); return; } - - sptr display = new AbstractDisplay(displayCount_.fetch_add(1), - absScreen->dmsId_, absScreen->groupDmsId_, info); + DisplayId displayId = displayCount_.fetch_add(1); + std::ostringstream buffer; + buffer<<"display_"< display = new AbstractDisplay(displayId, + absScreen->dmsId_, name, absScreen->groupDmsId_, info); Point point = abstractScreenController_->GetAbstractScreenGroup(absScreen->groupDmsId_)-> GetChildPosition(absScreen->dmsId_); display->SetOffset(point.posX_, point.posY_); diff --git a/dmserver/src/abstract_screen.cpp b/dmserver/src/abstract_screen.cpp index e085ecdf..88eeb4f0 100644 --- a/dmserver/src/abstract_screen.cpp +++ b/dmserver/src/abstract_screen.cpp @@ -269,7 +269,8 @@ Rotation AbstractScreen::CalcRotation(Orientation orientation) const } AbstractScreenGroup::AbstractScreenGroup(sptr screenController, ScreenId dmsId, ScreenId rsId, - ScreenCombination combination) : AbstractScreen(screenController, "", dmsId, rsId), combination_(combination) + std::string name, ScreenCombination combination) : AbstractScreen(screenController, name, dmsId, rsId), + combination_(combination) { type_ = ScreenType::UNDEFINE; isScreenGroup_ = true; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index 1bccfefe..524444f6 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -15,6 +15,8 @@ #include "abstract_screen_controller.h" +#include + #include #include #include @@ -276,8 +278,11 @@ void AbstractScreenController::ProcessScreenConnected(ScreenId rsScreenId) sptr AbstractScreenController::InitAndGetScreen(ScreenId rsScreenId) { ScreenId dmsScreenId = screenIdManager_.CreateAndGetNewScreenId(rsScreenId); + std::ostringstream buffer; + buffer< absScreen = - new(std::nothrow) AbstractScreen(this, DEFAULT_SCREEN_NAME, dmsScreenId, rsScreenId); + new(std::nothrow) AbstractScreen(this, name, dmsScreenId, rsScreenId); if (absScreen == nullptr) { WLOGFE("new AbstractScreen failed."); screenIdManager_.DeleteScreenId(dmsScreenId); @@ -421,8 +426,11 @@ bool AbstractScreenController::CheckScreenInScreenGroup(sptr scr sptr AbstractScreenController::AddAsFirstScreenLocked(sptr newScreen) { ScreenId dmsGroupScreenId = screenIdManager_.CreateAndGetNewScreenId(SCREEN_ID_INVALID); + std::ostringstream buffer; + buffer<<"ScreenGroup_"< screenGroup = new(std::nothrow) AbstractScreenGroup(this, dmsGroupScreenId, - SCREEN_ID_INVALID, ScreenCombination::SCREEN_MIRROR); + SCREEN_ID_INVALID, name, ScreenCombination::SCREEN_MIRROR); if (screenGroup == nullptr) { WLOGE("new AbstractScreenGroup failed"); screenIdManager_.DeleteScreenId(dmsGroupScreenId); diff --git a/interfaces/innerkits/dm/display.h b/interfaces/innerkits/dm/display.h index afec8640..dc2653c3 100644 --- a/interfaces/innerkits/dm/display.h +++ b/interfaces/innerkits/dm/display.h @@ -36,6 +36,7 @@ public: Display& operator=(const Display&) = delete; Display& operator=(Display&&) = delete; DisplayId GetId() const; + std::string GetName() const; int32_t GetWidth() const; int32_t GetHeight() const; uint32_t GetRefreshRate() const; diff --git a/interfaces/innerkits/dm/screen.h b/interfaces/innerkits/dm/screen.h index a1631ccc..f998c7b2 100644 --- a/interfaces/innerkits/dm/screen.h +++ b/interfaces/innerkits/dm/screen.h @@ -66,7 +66,7 @@ public: Screen& operator=(const Screen&) = delete; Screen& operator=(Screen&&) = delete; bool IsGroup() const; - const std::string GetName() const; + std::string GetName() const; ScreenId GetId() const; uint32_t GetWidth() const; uint32_t GetHeight() const; diff --git a/interfaces/kits/napi/display_runtime/js_display.cpp b/interfaces/kits/napi/display_runtime/js_display.cpp index 405303b6..2a85af80 100644 --- a/interfaces/kits/napi/display_runtime/js_display.cpp +++ b/interfaces/kits/napi/display_runtime/js_display.cpp @@ -101,13 +101,13 @@ NativeValue* CreateJsDisplayObject(NativeEngine& engine, sptr& display) object->SetProperty("width", CreateJsValue(engine, info->GetWidth())); object->SetProperty("height", CreateJsValue(engine, info->GetHeight())); object->SetProperty("refreshRate", CreateJsValue(engine, info->GetRefreshRate())); - object->SetProperty("name", engine.CreateUndefined()); + object->SetProperty("name", CreateJsValue(engine, info->GetName())); object->SetProperty("alive", engine.CreateUndefined()); object->SetProperty("state", engine.CreateUndefined()); object->SetProperty("rotation", CreateJsValue(engine, info->GetRotation())); object->SetProperty("densityDPI", CreateJsValue(engine, info->GetVirtualPixelRatio() * DOT_PER_INCH)); - object->SetProperty("densityPixels", engine.CreateUndefined()); - object->SetProperty("scaledDensity", engine.CreateUndefined()); + object->SetProperty("densityPixels", CreateJsValue(engine, info->GetVirtualPixelRatio())); + object->SetProperty("scaledDensity", CreateJsValue(engine, info->GetVirtualPixelRatio())); object->SetProperty("xDPI", engine.CreateUndefined()); object->SetProperty("yDPI", engine.CreateUndefined()); if (jsDisplayObj == nullptr || jsDisplayObj->Get() == nullptr) { diff --git a/utils/include/class_var_definition.h b/utils/include/class_var_definition.h index e3439390..c12d0f8b 100644 --- a/utils/include/class_var_definition.h +++ b/utils/include/class_var_definition.h @@ -23,7 +23,7 @@ private: #define DEFINE_VAR_WITH_LOCK(type, memberName) \ private: \ - std::recursive_mutex memberName##Mutex_; \ + std::atomic memberName##atomicBool_ { false }; \ type memberName##_; #define DEFINE_VAR_DEFAULT(type, memberName, defaultValue) \ @@ -41,8 +41,15 @@ public: public: \ type Get##funcName() \ { \ - std::lock_guard lock(memberName##Mutex_); \ - return memberName##_; \ + bool expect = false; \ + type res; \ + while (!memberName##atomicBool_.compare_exchange_weak(expect, true, \ + std::memory_order_relaxed)) { \ + expect = false; \ + } \ + res = memberName##_; \ + memberName##atomicBool_.store(false); \ + return res; \ } #define DEFINE_FUNC_SET(type, funcName, memberName) \ @@ -56,8 +63,14 @@ public: public: \ void Set##funcName(type value) \ { \ - std::lock_guard lock(memberName##Mutex_); \ + bool expect = false; \ + while (!memberName##atomicBool_.compare_exchange_weak(expect, true, \ + std::memory_order_relaxed)) { \ + expect = false; \ + } \ + \ memberName##_ = value; \ + memberName##atomicBool_.store(false); \ } #define DEFINE_VAR_FUNC_GET(type, funcName, memberName) \ diff --git a/utils/include/display_info.h b/utils/include/display_info.h index 1aaa8d10..1c7ab1da 100644 --- a/utils/include/display_info.h +++ b/utils/include/display_info.h @@ -32,6 +32,7 @@ public: virtual bool Marshalling(Parcel& parcel) const override; static DisplayInfo *Unmarshalling(Parcel& parcel); + DEFINE_VAR_DEFAULT_FUNC_GET(std::string, Name, name, ""); DEFINE_VAR_DEFAULT_FUNC_GET_SET(DisplayId, DisplayId, id, DISPLAY_ID_INVALID); DEFINE_VAR_DEFAULT_FUNC_GET_SET(DisplayType, DisplayType, type, DisplayType::DEFAULT); DEFINE_VAR_DEFAULT_FUNC_GET_SET(int32_t, Width, width, 0); diff --git a/utils/src/display_info.cpp b/utils/src/display_info.cpp index 445f957b..491ed456 100644 --- a/utils/src/display_info.cpp +++ b/utils/src/display_info.cpp @@ -18,7 +18,7 @@ namespace OHOS::Rosen { bool DisplayInfo::Marshalling(Parcel &parcel) const { - return parcel.WriteUint64(id_) && parcel.WriteUint32(static_cast(type_)) && + return parcel.WriteString(name_) && parcel.WriteUint64(id_) && parcel.WriteUint32(static_cast(type_)) && parcel.WriteInt32(width_) && parcel.WriteInt32(height_) && parcel.WriteUint32(refreshRate_) && parcel.WriteUint64(screenId_) && parcel.WriteFloat(virtualPixelRatio_) && parcel.WriteFloat(xDpi_) && parcel.WriteFloat(yDpi_) && @@ -36,7 +36,8 @@ DisplayInfo *DisplayInfo::Unmarshalling(Parcel &parcel) uint32_t type = (uint32_t)DisplayType::DEFAULT; uint32_t rotation; uint32_t orientation; - bool res = parcel.ReadUint64(displayInfo->id_) && parcel.ReadUint32(type) && + bool res = parcel.ReadString(displayInfo->name_) && + parcel.ReadUint64(displayInfo->id_) && parcel.ReadUint32(type) && parcel.ReadInt32(displayInfo->width_) && parcel.ReadInt32(displayInfo->height_) && parcel.ReadUint32(displayInfo->refreshRate_) && parcel.ReadUint64(displayInfo->screenId_) && parcel.ReadFloat(displayInfo->virtualPixelRatio_) &&