From 47404f12f27fc45fc0c011b1c5ac6f0c1b52e0e6 Mon Sep 17 00:00:00 2001 From: X512 Date: Wed, 9 Dec 2020 16:06:53 +0900 Subject: [PATCH] accelerant: replace AreaCloner with AreaDeleter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduce code duplication. Change-Id: Ice1a14fc7378382e89c3e5a1aea6fa21b903e436 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3482 Reviewed-by: Axel Dörfler --- src/add-ons/accelerants/intel_extreme/Jamfile | 1 + .../accelerants/intel_extreme/accelerant.cpp | 80 ++++--------------- src/add-ons/accelerants/radeon_hd/Jamfile | 1 + .../accelerants/radeon_hd/accelerant.cpp | 71 +++------------- src/add-ons/accelerants/vesa/Jamfile | 1 + src/add-ons/accelerants/vesa/accelerant.cpp | 62 +++----------- 6 files changed, 38 insertions(+), 178 deletions(-) diff --git a/src/add-ons/accelerants/intel_extreme/Jamfile b/src/add-ons/accelerants/intel_extreme/Jamfile index 4f6fbf498d..cb4750872c 100644 --- a/src/add-ons/accelerants/intel_extreme/Jamfile +++ b/src/add-ons/accelerants/intel_extreme/Jamfile @@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons accelerants intel_extreme ; UsePrivateHeaders graphics ; UsePrivateHeaders [ FDirName graphics intel_extreme ] ; UsePrivateHeaders [ FDirName graphics common ] ; +UsePrivateHeaders shared ; Addon intel_extreme.accelerant : accelerant.cpp diff --git a/src/add-ons/accelerants/intel_extreme/accelerant.cpp b/src/add-ons/accelerants/intel_extreme/accelerant.cpp index 2ce15758aa..e81a34c5e2 100644 --- a/src/add-ons/accelerants/intel_extreme/accelerant.cpp +++ b/src/add-ons/accelerants/intel_extreme/accelerant.cpp @@ -22,6 +22,7 @@ #include #include +#include #undef TRACE @@ -40,53 +41,6 @@ struct accelerant_info* gInfo; uint32 gDumpCount; -class AreaCloner { -public: - AreaCloner(); - ~AreaCloner(); - - area_id Clone(const char* name, void** _address, - uint32 spec, uint32 protection, - area_id sourceArea); - status_t InitCheck() - { return fArea < 0 ? (status_t)fArea : B_OK; } - void Keep(); - -private: - area_id fArea; -}; - - -AreaCloner::AreaCloner() - : - fArea(-1) -{ -} - - -AreaCloner::~AreaCloner() -{ - if (fArea >= 0) - delete_area(fArea); -} - - -area_id -AreaCloner::Clone(const char* name, void** _address, uint32 spec, - uint32 protection, area_id sourceArea) -{ - fArea = clone_area(name, _address, spec, protection, sourceArea); - return fArea; -} - - -void -AreaCloner::Keep() -{ - fArea = -1; -} - - // #pragma mark - @@ -134,6 +88,7 @@ init_common(int device, bool isClone) gInfo = (accelerant_info*)malloc(sizeof(accelerant_info)); if (gInfo == NULL) return B_NO_MEMORY; + MemoryDeleter infoDeleter(gInfo); memset(gInfo, 0, sizeof(accelerant_info)); @@ -146,33 +101,26 @@ init_common(int device, bool isClone) data.magic = INTEL_PRIVATE_DATA_MAGIC; if (ioctl(device, INTEL_GET_PRIVATE_DATA, &data, - sizeof(intel_get_private_data)) != 0) { - free(gInfo); + sizeof(intel_get_private_data)) != 0) return B_ERROR; - } - AreaCloner sharedCloner; - gInfo->shared_info_area = sharedCloner.Clone("intel extreme shared info", + AreaDeleter sharedDeleter(clone_area("intel extreme shared info", (void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, - data.shared_info_area); - status_t status = sharedCloner.InitCheck(); - if (status < B_OK) { - free(gInfo); + data.shared_info_area)); + status_t status = gInfo->shared_info_area = sharedDeleter.Get(); + if (status < B_OK) return status; - } - AreaCloner regsCloner; - gInfo->regs_area = regsCloner.Clone("intel extreme regs", + AreaDeleter regsDeleter(clone_area("intel extreme regs", (void**)&gInfo->registers, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, - gInfo->shared_info->registers_area); - status = regsCloner.InitCheck(); - if (status < B_OK) { - free(gInfo); + gInfo->shared_info->registers_area)); + status = gInfo->regs_area = regsDeleter.Get(); + if (status < B_OK) return status; - } - sharedCloner.Keep(); - regsCloner.Keep(); + infoDeleter.Detach(); + sharedDeleter.Detach(); + regsDeleter.Detach(); // The overlay registers, hardware status, and cursor memory share // a single area with the shared_info diff --git a/src/add-ons/accelerants/radeon_hd/Jamfile b/src/add-ons/accelerants/radeon_hd/Jamfile index 42ea0fb242..d2ddb3efc3 100644 --- a/src/add-ons/accelerants/radeon_hd/Jamfile +++ b/src/add-ons/accelerants/radeon_hd/Jamfile @@ -6,6 +6,7 @@ UseHeaders [ FDirName $(SUBDIR) atombios ] ; UsePrivateHeaders graphics ; UsePrivateHeaders [ FDirName graphics radeon_hd ] ; UsePrivateHeaders [ FDirName graphics common ] ; +UsePrivateHeaders shared ; Addon radeon_hd.accelerant : accelerant.cpp diff --git a/src/add-ons/accelerants/radeon_hd/accelerant.cpp b/src/add-ons/accelerants/radeon_hd/accelerant.cpp index 727a3ca38a..4939654f31 100644 --- a/src/add-ons/accelerants/radeon_hd/accelerant.cpp +++ b/src/add-ons/accelerants/radeon_hd/accelerant.cpp @@ -19,6 +19,8 @@ #include #include +#include + #include "accelerant_protos.h" #include "bios.h" @@ -46,53 +48,6 @@ connector_info* gConnector[ATOM_MAX_SUPPORTED_DEVICE]; gpio_info* gGPIOInfo[MAX_GPIO_PINS]; -class AreaCloner { -public: - AreaCloner(); - ~AreaCloner(); - - area_id Clone(const char* name, void** _address, - uint32 spec, uint32 protection, - area_id sourceArea); - status_t InitCheck() - {return fArea < 0 ? (status_t)fArea : B_OK;} - void Keep(); - -private: - area_id fArea; -}; - - -AreaCloner::AreaCloner() - : - fArea(-1) -{ -} - - -AreaCloner::~AreaCloner() -{ - if (fArea >= 0) - delete_area(fArea); -} - - -area_id -AreaCloner::Clone(const char* name, void** _address, uint32 spec, - uint32 protection, area_id sourceArea) -{ - fArea = clone_area(name, _address, spec, protection, sourceArea); - return fArea; -} - - -void -AreaCloner::Keep() -{ - fArea = -1; -} - - // #pragma mark - @@ -105,6 +60,7 @@ init_common(int device, bool isClone) // initialize global accelerant info structure gInfo = (accelerant_info*)malloc(sizeof(accelerant_info)); + MemoryDeleter infoDeleter(gInfo); if (gInfo == NULL) return B_NO_MEMORY; @@ -161,24 +117,20 @@ init_common(int device, bool isClone) return B_ERROR; } - AreaCloner sharedCloner; - gInfo->shared_info_area = sharedCloner.Clone("radeon hd shared info", + AreaDeleter sharedDeleter(clone_area("radeon hd shared info", (void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, - data.shared_info_area); - status_t status = sharedCloner.InitCheck(); + data.shared_info_area)); + status_t status = gInfo->shared_info_area = sharedDeleter.Get(); if (status < B_OK) { - free(gInfo); TRACE("%s, failed to create shared area\n", __func__); return status; } - AreaCloner regsCloner; - gInfo->regs_area = regsCloner.Clone("radeon hd regs", + AreaDeleter regsDeleter(clone_area("radeon hd regs", (void**)&gInfo->regs, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, - gInfo->shared_info->registers_area); - status = regsCloner.InitCheck(); + gInfo->shared_info->registers_area)); + status = gInfo->regs_area = regsDeleter.Get(); if (status < B_OK) { - free(gInfo); TRACE("%s, failed to create mmio area\n", __func__); return status; } @@ -195,8 +147,9 @@ init_common(int device, bool isClone) if (gInfo->rom[0] != 0x55 || gInfo->rom[1] != 0xAA) TRACE("%s: didn't find a VGA bios in cloned region!\n", __func__); - sharedCloner.Keep(); - regsCloner.Keep(); + infoDeleter.Detach(); + sharedDeleter.Detach(); + regsDeleter.Detach(); return B_OK; } diff --git a/src/add-ons/accelerants/vesa/Jamfile b/src/add-ons/accelerants/vesa/Jamfile index 0983a5100a..5818056f80 100644 --- a/src/add-ons/accelerants/vesa/Jamfile +++ b/src/add-ons/accelerants/vesa/Jamfile @@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons accelerants vesa ; UsePrivateHeaders graphics ; UsePrivateHeaders [ FDirName graphics vesa ] ; UsePrivateHeaders [ FDirName graphics common ] ; +UsePrivateHeaders shared ; #AddResources vesa.accelerant : vesa.accelerant.rdef ; diff --git a/src/add-ons/accelerants/vesa/accelerant.cpp b/src/add-ons/accelerants/vesa/accelerant.cpp index 3120d46b7d..0597719e8c 100644 --- a/src/add-ons/accelerants/vesa/accelerant.cpp +++ b/src/add-ons/accelerants/vesa/accelerant.cpp @@ -14,6 +14,8 @@ #include #include +#include + //#define TRACE_ACCELERANT #ifdef TRACE_ACCELERANT @@ -27,51 +29,6 @@ extern "C" void _sPrintf(const char *format, ...); struct accelerant_info *gInfo; -class AreaCloner { - public: - AreaCloner(); - ~AreaCloner(); - - area_id Clone(const char *name, void **_address, uint32 spec, - uint32 protection, area_id sourceArea); - status_t InitCheck() { return fArea < B_OK ? (status_t)fArea : B_OK; } - void Keep(); - - private: - area_id fArea; -}; - - -AreaCloner::AreaCloner() - : - fArea(-1) -{ -} - - -AreaCloner::~AreaCloner() -{ - if (fArea >= B_OK) - delete_area(fArea); -} - - -area_id -AreaCloner::Clone(const char *name, void **_address, uint32 spec, - uint32 protection, area_id sourceArea) -{ - fArea = clone_area(name, _address, spec, protection, sourceArea); - return fArea; -} - - -void -AreaCloner::Keep() -{ - fArea = -1; -} - - // #pragma mark - @@ -84,6 +41,7 @@ init_common(int device, bool isClone) // initialize global accelerant info structure gInfo = (accelerant_info *)malloc(sizeof(accelerant_info)); + MemoryDeleter infoDeleter(gInfo); if (gInfo == NULL) return B_NO_MEMORY; @@ -102,15 +60,12 @@ init_common(int device, bool isClone) return B_ERROR; } - AreaCloner sharedCloner; - gInfo->shared_info_area = sharedCloner.Clone("vesa shared info", + AreaDeleter sharedDeleter(clone_area("vesa shared info", (void **)&gInfo->shared_info, B_ANY_ADDRESS, - B_READ_AREA | B_WRITE_AREA, sharedArea); - status_t status = sharedCloner.InitCheck(); - if (status < B_OK) { - free(gInfo); + B_READ_AREA | B_WRITE_AREA, sharedArea)); + status_t status = gInfo->shared_info_area = sharedDeleter.Get(); + if (status < B_OK) return status; - } if (gInfo->shared_info->vesa_mode_count == 0) gInfo->vesa_modes = NULL; @@ -118,7 +73,8 @@ init_common(int device, bool isClone) gInfo->vesa_modes = (vesa_mode *)((uint8 *)gInfo->shared_info + gInfo->shared_info->vesa_mode_offset); - sharedCloner.Keep(); + infoDeleter.Detach(); + sharedDeleter.Detach(); return B_OK; }