framebuffer.accelerant: Utilize AreaDeleter.

This commit is contained in:
Augustin Cavalier
2021-10-20 13:53:12 -04:00
parent 3c181db6bf
commit d81238bf2f
2 changed files with 11 additions and 57 deletions
@@ -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
@@ -14,6 +14,8 @@
#include <errno.h>
#include <syslog.h>
#include <AutoDeleterOS.h>
//#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;
}