1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 02:32:36 +01:00

fixed_typemap.hpp: make it a bit fool-proof

Require objects to be non-copyable (move is still allowed).
This commit is contained in:
Nekotekina 2021-03-02 19:22:39 +03:00
parent 004ebfdaee
commit 52fe86b56c
19 changed files with 121 additions and 57 deletions

View File

@ -89,6 +89,10 @@ public:
patch_engine(); patch_engine();
patch_engine(const patch_engine&) = delete;
patch_engine& operator=(const patch_engine&) = delete;
// Returns the directory in which patch_config.yml is located // Returns the directory in which patch_config.yml is located
static std::string get_patch_config_path(); static std::string get_patch_config_path();

View File

@ -22,6 +22,9 @@ public:
statichle_handler(int); statichle_handler(int);
~statichle_handler(); ~statichle_handler();
statichle_handler(const statichle_handler&) = delete;
statichle_handler& operator=(const statichle_handler&) = delete;
bool load_patterns(); bool load_patterns();
bool check_against_patterns(vm::cptr<u8>& data, u32 size, u32 addr); bool check_against_patterns(vm::cptr<u8>& data, u32 size, u32 addr);

View File

@ -38,7 +38,12 @@ struct avconf_manager
std::vector<CellAudioInDeviceInfo> devices; std::vector<CellAudioInDeviceInfo> devices;
void copy_device_info(u32 num, vm::ptr<CellAudioInDeviceInfo> info); void copy_device_info(u32 num, vm::ptr<CellAudioInDeviceInfo> info);
avconf_manager(); avconf_manager();
avconf_manager(const avconf_manager&) = delete;
avconf_manager& operator=(const avconf_manager&) = delete;
}; };
avconf_manager::avconf_manager() avconf_manager::avconf_manager()

View File

@ -938,6 +938,8 @@ struct fs_aio_thread : ppu_thread
struct fs_aio_manager struct fs_aio_manager
{ {
std::shared_ptr<fs_aio_thread> thread; std::shared_ptr<fs_aio_thread> thread;
shared_mutex mutex;
}; };
s32 cellFsAioInit(vm::cptr<char> mount_point) s32 cellFsAioInit(vm::cptr<char> mount_point)

View File

@ -63,8 +63,10 @@ void fmt_class_string<CellMusic2Error>::format(std::string& out, u64 arg)
struct music_state struct music_state
{ {
vm::ptr<void(u32 event, vm::ptr<void> param, vm::ptr<void> userData)> func; shared_mutex mutex;
vm::ptr<void> userData;
vm::ptr<void(u32 event, vm::ptr<void> param, vm::ptr<void> userData)> func{};
vm::ptr<void> userData{};
}; };
error_code cellMusicGetSelectionContext(vm::ptr<CellMusicSelectionContext> context) error_code cellMusicGetSelectionContext(vm::ptr<CellMusicSelectionContext> context)

View File

@ -85,14 +85,18 @@ using CellMusicDecode2Callback = void(u32, vm::ptr<void> param, vm::ptr<void> us
struct music_decode struct music_decode
{ {
vm::ptr<CellMusicDecodeCallback> func; vm::ptr<CellMusicDecodeCallback> func{};
vm::ptr<void> userData; vm::ptr<void> userData{};
shared_mutex mutex;
}; };
struct music_decode2 struct music_decode2
{ {
vm::ptr<CellMusicDecode2Callback> func; vm::ptr<CellMusicDecode2Callback> func{};
vm::ptr<void> userData; vm::ptr<void> userData{};
shared_mutex mutex;
}; };
error_code cellMusicDecodeInitialize(s32 mode, u32 container, s32 spuPriority, vm::ptr<CellMusicDecodeCallback> func, vm::ptr<void> userData) error_code cellMusicDecodeInitialize(s32 mode, u32 container, s32 spuPriority, vm::ptr<CellMusicDecodeCallback> func, vm::ptr<void> userData)

View File

@ -58,8 +58,10 @@ using CellRecCallback = void(s32 recStatus, s32 recError, vm::ptr<void> userdata
struct rec_info struct rec_info
{ {
vm::ptr<CellRecCallback> cb; vm::ptr<CellRecCallback> cb{};
vm::ptr<void> cbUserData; vm::ptr<void> cbUserData{};
shared_mutex mutex;
}; };
error_code cellRecOpen(vm::cptr<char> pDirName, vm::cptr<char> pFileName, vm::cptr<CellRecParam> pParam, u32 container, vm::ptr<CellRecCallback> cb, vm::ptr<void> cbUserData) error_code cellRecOpen(vm::cptr<char> pDirName, vm::cptr<char> pFileName, vm::cptr<CellRecParam> pParam, u32 container, vm::ptr<CellRecCallback> cb, vm::ptr<void> cbUserData)

View File

@ -65,7 +65,9 @@ struct rudp_info
// event handler function // event handler function
vm::ptr<CellRudpEventHandler> handler = vm::null; vm::ptr<CellRudpEventHandler> handler = vm::null;
vm::ptr<void> handler_arg; vm::ptr<void> handler_arg{};
shared_mutex mutex;
}; };
error_code cellRudpInit(vm::ptr<CellRudpAllocator> allocator) error_code cellRudpInit(vm::ptr<CellRudpAllocator> allocator)

View File

@ -26,14 +26,12 @@ void fmt_class_string<CellScreenShotError>::format(std::string& out, u64 arg)
}); });
} }
shared_mutex screenshot_mtx; std::string screenshot_info::get_overlay_path() const
std::string screenshot_manager::get_overlay_path() const
{ {
return vfs::get(overlay_dir_name + "/" + overlay_file_name); return vfs::get(overlay_dir_name + "/" + overlay_file_name);
} }
std::string screenshot_manager::get_photo_title() const std::string screenshot_info::get_photo_title() const
{ {
std::string photo = photo_title; std::string photo = photo_title;
if (photo.empty()) if (photo.empty())
@ -41,7 +39,7 @@ std::string screenshot_manager::get_photo_title() const
return photo; return photo;
} }
std::string screenshot_manager::get_game_title() const std::string screenshot_info::get_game_title() const
{ {
std::string game = game_title; std::string game = game_title;
if (game.empty()) if (game.empty())
@ -49,12 +47,12 @@ std::string screenshot_manager::get_game_title() const
return game; return game;
} }
std::string screenshot_manager::get_game_comment() const std::string screenshot_info::get_game_comment() const
{ {
return game_comment; return game_comment;
} }
std::string screenshot_manager::get_screenshot_path(const std::string& date_path) const std::string screenshot_info::get_screenshot_path(const std::string& date_path) const
{ {
u32 counter = 0; u32 counter = 0;
std::string path = vfs::get("/dev_hdd0/photo/" + date_path + "/" + get_photo_title()); std::string path = vfs::get("/dev_hdd0/photo/" + date_path + "/" + get_photo_title());
@ -86,7 +84,7 @@ error_code cellScreenShotSetParameter(vm::cptr<CellScreenShotSetParam> param)
return CELL_SCREENSHOT_ERROR_PARAM; return CELL_SCREENSHOT_ERROR_PARAM;
auto& manager = g_fxo->get<screenshot_manager>(); auto& manager = g_fxo->get<screenshot_manager>();
std::lock_guard lock(screenshot_mtx); std::lock_guard lock(manager.mutex);
if (param->photo_title && param->photo_title[0] != '\0') if (param->photo_title && param->photo_title[0] != '\0')
manager.photo_title = std::string(param->photo_title.get_ptr()); manager.photo_title = std::string(param->photo_title.get_ptr());
@ -124,7 +122,7 @@ error_code cellScreenShotSetOverlayImage(vm::cptr<char> srcDir, vm::cptr<char> s
} }
auto& manager = g_fxo->get<screenshot_manager>(); auto& manager = g_fxo->get<screenshot_manager>();
std::lock_guard lock(screenshot_mtx); std::lock_guard lock(manager.mutex);
manager.overlay_dir_name = std::string(srcDir.get_ptr()); manager.overlay_dir_name = std::string(srcDir.get_ptr());
manager.overlay_file_name = std::string(srcFile.get_ptr()); manager.overlay_file_name = std::string(srcFile.get_ptr());
@ -139,7 +137,7 @@ error_code cellScreenShotEnable()
cellScreenshot.warning("cellScreenShotEnable()"); cellScreenshot.warning("cellScreenShotEnable()");
auto& manager = g_fxo->get<screenshot_manager>(); auto& manager = g_fxo->get<screenshot_manager>();
std::lock_guard lock(screenshot_mtx); std::lock_guard lock(manager.mutex);
manager.is_enabled = true; manager.is_enabled = true;
@ -151,7 +149,7 @@ error_code cellScreenShotDisable()
cellScreenshot.warning("cellScreenShotDisable()"); cellScreenshot.warning("cellScreenShotDisable()");
auto& manager = g_fxo->get<screenshot_manager>(); auto& manager = g_fxo->get<screenshot_manager>();
std::lock_guard lock(screenshot_mtx); std::lock_guard lock(manager.mutex);
manager.is_enabled = false; manager.is_enabled = false;

View File

@ -27,9 +27,7 @@ struct CellScreenShotSetParam
vm::bptr<void> reserved; vm::bptr<void> reserved;
}; };
extern shared_mutex screenshot_mtx; struct screenshot_info
struct screenshot_manager
{ {
bool is_enabled{false}; bool is_enabled{false};
@ -48,3 +46,8 @@ struct screenshot_manager
std::string get_game_comment() const; std::string get_game_comment() const;
std::string get_screenshot_path(const std::string& date_path) const; std::string get_screenshot_path(const std::string& date_path) const;
}; };
struct screenshot_manager : public screenshot_info
{
shared_mutex mutex;
};

View File

@ -55,7 +55,6 @@ void fmt_class_string<CellSearchError>::format(std::string& out, u64 arg)
}); });
} }
namespace {
enum class search_state enum class search_state
{ {
not_initialized = 0, not_initialized = 0,
@ -94,8 +93,14 @@ struct search_content_t
} data; } data;
}; };
using ContentIdType = std::pair<u64, std::shared_ptr<search_content_t>>; using content_id_type = std::pair<u64, std::shared_ptr<search_content_t>>;
using ContentIdMap = std::unordered_map<u64, std::shared_ptr<search_content_t>>;
struct content_id_map
{
std::unordered_map<u64, std::shared_ptr<search_content_t>> map;
shared_mutex mutex;
};
struct search_object_t struct search_object_t
{ {
@ -103,11 +108,10 @@ struct search_object_t
static const u32 id_base = 1; static const u32 id_base = 1;
static const u32 id_step = 1; static const u32 id_step = 1;
static const u32 id_count = 1024; // TODO static const u32 id_count = 1024; // TODO
static const u32 invalid = 0xFFFFFFFF;
std::vector<ContentIdType> content_ids; std::vector<content_id_type> content_ids;
}; };
}
error_code cellSearchInitialize(CellSearchMode mode, u32 container, vm::ptr<CellSearchSystemCallback> func, vm::ptr<void> userData) error_code cellSearchInitialize(CellSearchMode mode, u32 container, vm::ptr<CellSearchSystemCallback> func, vm::ptr<void> userData)
{ {
cellSearch.warning("cellSearchInitialize(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x)", +mode, container, func, userData); cellSearch.warning("cellSearchInitialize(mode=0x%x, container=0x%x, func=*0x%x, userData=*0x%x)", +mode, container, func, userData);
@ -242,7 +246,7 @@ error_code cellSearchStartListSearch(CellSearchListSearchType type, CellSearchSo
const u32 id = *outSearchId = idm::make<search_object_t>(); const u32 id = *outSearchId = idm::make<search_object_t>();
sysutil_register_cb([=, &content_map = g_fxo->get<ContentIdMap>(), &search](ppu_thread& ppu) -> s32 sysutil_register_cb([=, &content_map = g_fxo->get<content_id_map>(), &search](ppu_thread& ppu) -> s32
{ {
auto curr_search = idm::get<search_object_t>(id); auto curr_search = idm::get<search_object_t>(id);
vm::var<CellSearchResultParam> resultParam; vm::var<CellSearchResultParam> resultParam;
@ -320,8 +324,8 @@ error_code cellSearchStartListSearch(CellSearchListSearchType type, CellSearchSo
} }
const u64 hash = std::hash<std::string>()(item_path); const u64 hash = std::hash<std::string>()(item_path);
auto found = content_map.find(hash); auto found = content_map.map.find(hash);
if (found == content_map.end()) // content isn't yet being tracked if (found == content_map.map.end()) // content isn't yet being tracked
{ {
//auto ext_offset = item.name.find_last_of('.'); // used later if no "Title" found //auto ext_offset = item.name.find_last_of('.'); // used later if no "Title" found
@ -391,7 +395,7 @@ error_code cellSearchStartListSearch(CellSearchListSearchType type, CellSearchSo
} }
} }
content_map.emplace(hash, curr_find); content_map.map.emplace(hash, curr_find);
curr_search->content_ids.emplace_back(hash, curr_find); // place this file's "ID" into the list of found types curr_search->content_ids.emplace_back(hash, curr_find); // place this file's "ID" into the list of found types
cellSearch.notice("cellSearchStartListSearch(): Content ID: %08X Path: \"%s\"", hash, item_path); cellSearch.notice("cellSearchStartListSearch(): Content ID: %08X Path: \"%s\"", hash, item_path);
@ -467,9 +471,9 @@ error_code cellSearchStartContentSearchInList(vm::cptr<CellSearchContentId> list
return CELL_SEARCH_ERROR_GENERIC; return CELL_SEARCH_ERROR_GENERIC;
} }
auto& content_map = g_fxo->get<ContentIdMap>(); auto& content_map = g_fxo->get<content_id_map>();
auto found = content_map.find(*reinterpret_cast<const u64*>(listId->data)); auto found = content_map.map.find(*reinterpret_cast<const u64*>(listId->data));
if (found == content_map.end()) if (found == content_map.map.end())
{ {
// content ID not found, perform a search first // content ID not found, perform a search first
return CELL_SEARCH_ERROR_CONTENT_NOT_FOUND; return CELL_SEARCH_ERROR_CONTENT_NOT_FOUND;
@ -553,8 +557,8 @@ error_code cellSearchStartContentSearchInList(vm::cptr<CellSearchContentId> list
const std::string item_path(vpath + "/" + item.name); const std::string item_path(vpath + "/" + item.name);
const u64 hash = std::hash<std::string>()(item_path); const u64 hash = std::hash<std::string>()(item_path);
auto found = content_map.find(hash); auto found = content_map.map.find(hash);
if (found == content_map.end()) // content isn't yet being tracked if (found == content_map.map.end()) // content isn't yet being tracked
{ {
auto ext_offset = item.name.find_last_of('.'); // used later if no "Title" found auto ext_offset = item.name.find_last_of('.'); // used later if no "Title" found
@ -783,7 +787,7 @@ error_code cellSearchStartContentSearchInList(vm::cptr<CellSearchContentId> list
strcpy_trunc(info.albumTitle, "ALBUM TITLE"); strcpy_trunc(info.albumTitle, "ALBUM TITLE");
} }
content_map.emplace(hash, curr_find); content_map.map.emplace(hash, curr_find);
curr_search->content_ids.emplace_back(hash, curr_find); // place this file's "ID" into the list of found types curr_search->content_ids.emplace_back(hash, curr_find); // place this file's "ID" into the list of found types
cellSearch.notice("cellSearchStartContentSearchInList(): Content ID: %08X Path: \"%s\"", hash, item_path); cellSearch.notice("cellSearchStartContentSearchInList(): Content ID: %08X Path: \"%s\"", hash, item_path);
@ -871,7 +875,7 @@ error_code cellSearchStartContentSearch(CellSearchContentSearchType type, CellSe
const u32 id = *outSearchId = idm::make<search_object_t>(); const u32 id = *outSearchId = idm::make<search_object_t>();
sysutil_register_cb([=, &content_map = g_fxo->get<ContentIdMap>(), &search](ppu_thread& ppu) -> s32 sysutil_register_cb([=, &content_map = g_fxo->get<content_id_map>(), &search](ppu_thread& ppu) -> s32
{ {
auto curr_search = idm::get<search_object_t>(id); auto curr_search = idm::get<search_object_t>(id);
vm::var<CellSearchResultParam> resultParam; vm::var<CellSearchResultParam> resultParam;
@ -906,8 +910,8 @@ error_code cellSearchStartContentSearch(CellSearchContentSearchType type, CellSe
const std::string item_path(relative_vpath + "/" + item.name); const std::string item_path(relative_vpath + "/" + item.name);
const u64 hash = std::hash<std::string>()(item_path); const u64 hash = std::hash<std::string>()(item_path);
auto found = content_map.find(hash); auto found = content_map.map.find(hash);
if (found == content_map.end()) // content isn't yet being tracked if (found == content_map.map.end()) // content isn't yet being tracked
{ {
auto ext_offset = item.name.find_last_of('.'); // used later if no "Title" found auto ext_offset = item.name.find_last_of('.'); // used later if no "Title" found
@ -985,7 +989,7 @@ error_code cellSearchStartContentSearch(CellSearchContentSearchType type, CellSe
strcpy_trunc(info.albumTitle, "ALBUM TITLE"); strcpy_trunc(info.albumTitle, "ALBUM TITLE");
} }
content_map.emplace(hash, curr_find); content_map.map.emplace(hash, curr_find);
curr_search->content_ids.emplace_back(hash, curr_find); // place this file's "ID" into the list of found types curr_search->content_ids.emplace_back(hash, curr_find); // place this file's "ID" into the list of found types
cellSearch.notice("cellSearchStartContentSearch(): Content ID: %08X Path: \"%s\"", hash, item_path); cellSearch.notice("cellSearchStartContentSearch(): Content ID: %08X Path: \"%s\"", hash, item_path);
@ -1228,9 +1232,9 @@ error_code cellSearchGetContentInfoByContentId(vm::cptr<CellSearchContentId> con
return CELL_SEARCH_ERROR_GENERIC; return CELL_SEARCH_ERROR_GENERIC;
} }
auto& content_map = g_fxo->get<ContentIdMap>(); auto& content_map = g_fxo->get<content_id_map>();
auto found = content_map.find(*reinterpret_cast<const u64*>(contentId->data)); auto found = content_map.map.find(*reinterpret_cast<const u64*>(contentId->data));
if (found != content_map.end()) if (found != content_map.map.end())
{ {
const auto& content_info = found->second; const auto& content_info = found->second;
switch (content_info->type) switch (content_info->type)
@ -1439,9 +1443,9 @@ error_code cellSearchGetContentInfoPath(vm::cptr<CellSearchContentId> contentId,
} }
const u64 id = *reinterpret_cast<const u64*>(contentId->data); const u64 id = *reinterpret_cast<const u64*>(contentId->data);
auto& content_map = g_fxo->get<ContentIdMap>(); auto& content_map = g_fxo->get<content_id_map>();
auto found = content_map.find(id); auto found = content_map.map.find(id);
if(found != content_map.end()) if(found != content_map.map.end())
{ {
std::memcpy(infoPath.get_ptr(), &found->second->infoPath, sizeof(found->second->infoPath)); std::memcpy(infoPath.get_ptr(), &found->second->infoPath, sizeof(found->second->infoPath));
} }

View File

@ -8,8 +8,10 @@ LOG_CHANNEL(cellSysutil);
struct browser_info struct browser_info
{ {
vm::ptr<CellWebBrowserSystemCallback> system_cb; vm::ptr<CellWebBrowserSystemCallback> system_cb{};
vm::ptr<void> userData; vm::ptr<void> userData{};
shared_mutex mutex;
}; };
error_code cellWebBrowserActivate() error_code cellWebBrowserActivate()

View File

@ -69,6 +69,16 @@ struct ppu_segment
// PPU Module Information // PPU Module Information
struct ppu_module struct ppu_module
{ {
ppu_module() = default;
ppu_module(const ppu_module&) = delete;
ppu_module(ppu_module&&) = default;
ppu_module& operator=(const ppu_module&) = delete;
ppu_module& operator=(ppu_module&&) = default;
uchar sha1[20]{}; uchar sha1[20]{};
std::string name; std::string name;
std::string path; std::string path;

View File

@ -101,6 +101,12 @@ const ppu_static_module* ppu_module_manager::get_module(const std::string& name)
// Global linkage information // Global linkage information
struct ppu_linkage_info struct ppu_linkage_info
{ {
ppu_linkage_info() = default;
ppu_linkage_info(const ppu_linkage_info&) = delete;
ppu_linkage_info& operator=(const ppu_linkage_info&) = delete;
struct module_data struct module_data
{ {
struct info struct info

View File

@ -2597,6 +2597,13 @@ extern void ppu_initialize()
} }
} }
struct ppu_toc_manager
{
std::unordered_map<u32, u32> toc_map;
shared_mutex mutex;
};
bool ppu_initialize(const ppu_module& info, bool check_only) bool ppu_initialize(const ppu_module& info, bool check_only)
{ {
if (g_cfg.core.ppu_decoder != ppu_decoder_type::llvm) if (g_cfg.core.ppu_decoder != ppu_decoder_type::llvm)
@ -2607,7 +2614,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only)
} }
// Temporarily // Temporarily
s_ppu_toc = &g_fxo->get<std::unordered_map<u32, u32>>(); s_ppu_toc = &g_fxo->get<ppu_toc_manager>().toc_map;
for (const auto& func : info.funcs) for (const auto& func : info.funcs)
{ {
@ -2994,7 +3001,7 @@ bool ppu_initialize(const ppu_module& info, bool check_only)
} }
// Keep allocating workload // Keep allocating workload
const auto [obj_name, part] = std::as_const(workload)[i]; const auto& [obj_name, part] = std::as_const(workload)[i];
// Allocate "core" // Allocate "core"
std::lock_guard jlock(g_fxo->get<jit_core_allocator>().sem); std::lock_guard jlock(g_fxo->get<jit_core_allocator>().sem);

View File

@ -1665,6 +1665,12 @@ void spu_thread::cpu_task()
struct raw_spu_cleanup struct raw_spu_cleanup
{ {
raw_spu_cleanup() = default;
raw_spu_cleanup(const raw_spu_cleanup&) = delete;
raw_spu_cleanup& operator =(const raw_spu_cleanup&) = delete;
~raw_spu_cleanup() ~raw_spu_cleanup()
{ {
std::memset(spu_thread::g_raw_spu_id, 0, sizeof(spu_thread::g_raw_spu_id)); std::memset(spu_thread::g_raw_spu_id, 0, sizeof(spu_thread::g_raw_spu_id));

View File

@ -17,6 +17,8 @@ class pad_thread
{ {
public: public:
pad_thread(void* _curthread, void* _curwindow, std::string_view title_id); // void * instead of QThread * and QWindow * because of include in emucore pad_thread(void* _curthread, void* _curwindow, std::string_view title_id); // void * instead of QThread * and QWindow * because of include in emucore
pad_thread(const pad_thread&) = delete;
pad_thread& operator=(const pad_thread&) = delete;
~pad_thread(); ~pad_thread();
PadInfo& GetInfo() { return m_info; } PadInfo& GetInfo() { return m_info; }

View File

@ -481,11 +481,11 @@ void gs_frame::take_screenshot(const std::vector<u8> sshot_data, const u32 sshot
} }
} }
screenshot_manager manager; screenshot_info manager;
{ {
auto& fxo = g_fxo->get<screenshot_manager>(); auto& s = g_fxo->get<screenshot_manager>();
std::lock_guard lock(screenshot_mtx); std::lock_guard lock(s.mutex);
manager = fxo; manager = s;
} }
struct scoped_png_ptrs struct scoped_png_ptrs

View File

@ -49,6 +49,8 @@ namespace stx
template <typename T> template <typename T>
static typeinfo make_typeinfo() static typeinfo make_typeinfo()
{ {
static_assert(!std::is_copy_assignable_v<T> && !std::is_copy_constructible_v<T>, "Please make sure the object cannot be accidentally copied.");
typeinfo r; typeinfo r;
r.create = &call_ctor<T>; r.create = &call_ctor<T>;
r.destroy = &call_dtor<T>; r.destroy = &call_dtor<T>;