mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-12-29 08:30:04 +00:00
linux munmap: fix comment and simplify memory free. (PR #1293)
This commit is contained in:
parent
664d7c2d86
commit
c0bfb0b0fe
@ -243,6 +243,7 @@ static LPBYTE RWpages[kMaxExMemoryBanks]; // pointers to RW memory banks
|
|||||||
static const UINT kNumAnnunciators = 4;
|
static const UINT kNumAnnunciators = 4;
|
||||||
static bool g_Annunciator[kNumAnnunciators] = {};
|
static bool g_Annunciator[kNumAnnunciators] = {};
|
||||||
|
|
||||||
|
static const UINT num64KPages = 2; // number of 64K pages used to create hardware circular buffer
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
static HANDLE g_hMemImage = NULL; // NB. When not initialised, this handle is NULL (not INVALID_HANDLE_VALUE)
|
static HANDLE g_hMemImage = NULL; // NB. When not initialised, this handle is NULL (not INVALID_HANDLE_VALUE)
|
||||||
#else
|
#else
|
||||||
@ -1522,7 +1523,6 @@ static void FreeMemImage(void)
|
|||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
if (g_hMemImage)
|
if (g_hMemImage)
|
||||||
{
|
{
|
||||||
const UINT num64KPages = 2;
|
|
||||||
for (UINT i = 0; i < num64KPages; i++)
|
for (UINT i = 0; i < num64KPages; i++)
|
||||||
UnmapViewOfFile(memimage + i * _6502_MEM_LEN);
|
UnmapViewOfFile(memimage + i * _6502_MEM_LEN);
|
||||||
|
|
||||||
@ -1536,13 +1536,8 @@ static void FreeMemImage(void)
|
|||||||
#else
|
#else
|
||||||
if (g_hMemTempFile)
|
if (g_hMemTempFile)
|
||||||
{
|
{
|
||||||
const UINT num64KPages = 2;
|
// unmap the whole region, everything inside will be unmapped too
|
||||||
for (UINT i = 0; i < num64KPages; i++)
|
munmap(memimage, num64KPages * _6502_MEM_LEN);
|
||||||
{
|
|
||||||
munmap(memimage + i * _6502_MEM_LEN, _6502_MEM_LEN);
|
|
||||||
}
|
|
||||||
// with the following line, SDL_Quit() segfaults ????
|
|
||||||
// munmap(memimage + num64KPages * _6502_MEM_LEN, _6502_MEM_LEN);
|
|
||||||
|
|
||||||
fclose(g_hMemTempFile);
|
fclose(g_hMemTempFile);
|
||||||
g_hMemTempFile = NULL;
|
g_hMemTempFile = NULL;
|
||||||
@ -1572,8 +1567,7 @@ static LPBYTE AllocMemImage(void)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
res = false;
|
res = false;
|
||||||
const UINT num64KRegions = 2;
|
const SIZE_T totalVirtualSize = _6502_MEM_LEN * num64KPages;
|
||||||
const SIZE_T totalVirtualSize = _6502_MEM_LEN * num64KRegions;
|
|
||||||
baseAddr = (LPBYTE)VirtualAlloc(0, totalVirtualSize, MEM_RESERVE, PAGE_NOACCESS);
|
baseAddr = (LPBYTE)VirtualAlloc(0, totalVirtualSize, MEM_RESERVE, PAGE_NOACCESS);
|
||||||
if (baseAddr == NULL)
|
if (baseAddr == NULL)
|
||||||
break;
|
break;
|
||||||
@ -1586,7 +1580,7 @@ static LPBYTE AllocMemImage(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
UINT count = 0;
|
UINT count = 0;
|
||||||
while (count < num64KRegions)
|
while (count < num64KPages)
|
||||||
{
|
{
|
||||||
// MSDN: "To specify a suggested base address for the view, use the MapViewOfFileEx function. However, this practice is not recommended."
|
// MSDN: "To specify a suggested base address for the view, use the MapViewOfFileEx function. However, this practice is not recommended."
|
||||||
// The OS (ie. another process) may've beaten us to this suggested baseAddr. This is why we retry multiple times.
|
// The OS (ie. another process) may've beaten us to this suggested baseAddr. This is why we retry multiple times.
|
||||||
@ -1595,7 +1589,7 @@ static LPBYTE AllocMemImage(void)
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = (count == num64KRegions);
|
res = (count == num64KPages);
|
||||||
if (res)
|
if (res)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1633,19 +1627,25 @@ static LPBYTE AllocMemImage(void)
|
|||||||
const int fd = fileno(g_hMemTempFile);
|
const int fd = fileno(g_hMemTempFile);
|
||||||
if (!ftruncate(fd, _6502_MEM_LEN))
|
if (!ftruncate(fd, _6502_MEM_LEN))
|
||||||
{
|
{
|
||||||
const UINT num64KPages = 2;
|
|
||||||
LPBYTE baseAddr = static_cast<LPBYTE>(mmap(NULL, num64KPages * _6502_MEM_LEN, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
LPBYTE baseAddr = static_cast<LPBYTE>(mmap(NULL, num64KPages * _6502_MEM_LEN, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
||||||
if (baseAddr)
|
if (baseAddr)
|
||||||
{
|
{
|
||||||
|
bool ok = true;
|
||||||
for (UINT i = 0; i < num64KPages; i++)
|
for (UINT i = 0; i < num64KPages; i++)
|
||||||
{
|
{
|
||||||
// can this ever fail?
|
void * target = baseAddr + i * _6502_MEM_LEN;
|
||||||
mmap(baseAddr + i * _6502_MEM_LEN , _6502_MEM_LEN, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
|
void * addr = mmap(target, _6502_MEM_LEN, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
|
||||||
|
ok = ok && (target == addr);
|
||||||
}
|
}
|
||||||
// we could fclose the file here
|
// we could fclose the file here
|
||||||
// but we keep it as a reminder of how to free the memory later
|
// but we keep it as a reminder of how to free the memory later
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
return baseAddr;
|
return baseAddr;
|
||||||
}
|
}
|
||||||
|
// revert to ALIGNED_ALLOC
|
||||||
|
munmap(baseAddr, num64KPages * _6502_MEM_LEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(g_hMemTempFile);
|
fclose(g_hMemTempFile);
|
||||||
|
Loading…
Reference in New Issue
Block a user