framebuffer.accelerant: Utilize AreaDeleter.
This commit is contained in:
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons accelerants framebuffer ;
|
|||||||
UsePrivateHeaders graphics ;
|
UsePrivateHeaders graphics ;
|
||||||
UsePrivateHeaders [ FDirName graphics vesa ] ;
|
UsePrivateHeaders [ FDirName graphics vesa ] ;
|
||||||
UsePrivateHeaders [ FDirName graphics common ] ;
|
UsePrivateHeaders [ FDirName graphics common ] ;
|
||||||
|
UsePrivateHeaders shared ;
|
||||||
|
|
||||||
Addon framebuffer.accelerant :
|
Addon framebuffer.accelerant :
|
||||||
accelerant.cpp
|
accelerant.cpp
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
|
||||||
|
#include <AutoDeleterOS.h>
|
||||||
|
|
||||||
|
|
||||||
//#define TRACE_ACCELERANT
|
//#define TRACE_ACCELERANT
|
||||||
#ifdef TRACE_ACCELERANT
|
#ifdef TRACE_ACCELERANT
|
||||||
@@ -27,51 +29,6 @@ extern "C" void _sPrintf(const char *format, ...);
|
|||||||
struct accelerant_info *gInfo;
|
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 -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
@@ -84,6 +41,7 @@ init_common(int device, bool isClone)
|
|||||||
// initialize global accelerant info structure
|
// initialize global accelerant info structure
|
||||||
|
|
||||||
gInfo = (accelerant_info *)malloc(sizeof(accelerant_info));
|
gInfo = (accelerant_info *)malloc(sizeof(accelerant_info));
|
||||||
|
MemoryDeleter infoDeleter(gInfo);
|
||||||
if (gInfo == NULL)
|
if (gInfo == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
@@ -96,23 +54,18 @@ init_common(int device, bool isClone)
|
|||||||
// get basic info from driver
|
// get basic info from driver
|
||||||
|
|
||||||
area_id sharedArea;
|
area_id sharedArea;
|
||||||
if (ioctl(device, VESA_GET_PRIVATE_DATA, &sharedArea, sizeof(area_id))
|
if (ioctl(device, VESA_GET_PRIVATE_DATA, &sharedArea, sizeof(area_id)) != 0)
|
||||||
!= 0) {
|
|
||||||
free(gInfo);
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
|
||||||
|
|
||||||
AreaCloner sharedCloner;
|
AreaDeleter sharedDeleter(clone_area("vesa shared info",
|
||||||
gInfo->shared_info_area = sharedCloner.Clone("framebuffer shared info",
|
|
||||||
(void **)&gInfo->shared_info, B_ANY_ADDRESS,
|
(void **)&gInfo->shared_info, B_ANY_ADDRESS,
|
||||||
B_READ_AREA | B_WRITE_AREA, sharedArea);
|
B_READ_AREA | B_WRITE_AREA, sharedArea));
|
||||||
status_t status = sharedCloner.InitCheck();
|
status_t status = gInfo->shared_info_area = sharedDeleter.Get();
|
||||||
if (status < B_OK) {
|
if (status < B_OK)
|
||||||
free(gInfo);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
|
||||||
|
|
||||||
sharedCloner.Keep();
|
infoDeleter.Detach();
|
||||||
|
sharedDeleter.Detach();
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user