diff --git a/src/add-ons/accelerants/framebuffer/Jamfile b/src/add-ons/accelerants/framebuffer/Jamfile index e60738fa7f..3af0baa6e9 100644 --- a/src/add-ons/accelerants/framebuffer/Jamfile +++ b/src/add-ons/accelerants/framebuffer/Jamfile @@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons accelerants framebuffer ; UsePrivateHeaders graphics ; UsePrivateHeaders [ FDirName graphics vesa ] ; UsePrivateHeaders [ FDirName graphics common ] ; +UsePrivateHeaders shared ; Addon framebuffer.accelerant : accelerant.cpp diff --git a/src/add-ons/accelerants/framebuffer/accelerant.cpp b/src/add-ons/accelerants/framebuffer/accelerant.cpp index c90999af87..8b442c20e0 100644 --- a/src/add-ons/accelerants/framebuffer/accelerant.cpp +++ b/src/add-ons/accelerants/framebuffer/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; @@ -96,23 +54,18 @@ init_common(int device, bool isClone) // get basic info from driver area_id sharedArea; - if (ioctl(device, VESA_GET_PRIVATE_DATA, &sharedArea, sizeof(area_id)) - != 0) { - free(gInfo); + if (ioctl(device, VESA_GET_PRIVATE_DATA, &sharedArea, sizeof(area_id)) != 0) return B_ERROR; - } - AreaCloner sharedCloner; - gInfo->shared_info_area = sharedCloner.Clone("framebuffer 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; - } - sharedCloner.Keep(); + infoDeleter.Detach(); + sharedDeleter.Detach(); return B_OK; }