framebuffer.accelerant: Utilize AreaDeleter.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user