zero_fd is not longer used since vm_alloc.cpp should handle that correctly.

However, vm_init() and vm_exit() are called in main_unix.cpp to ensure proper
initialization of the internal zero_fd descriptor, if needed. i.e. no
anonymous mapping for mmap()-based memory allocation.
This commit is contained in:
gbeauche 2001-06-28 22:06:18 +00:00
parent 2ab43425c5
commit d011594d4e
2 changed files with 16 additions and 34 deletions

View File

@ -34,8 +34,8 @@
#endif
// Variables for Video on SEGV support
static uint8 *the_host_buffer; // Host frame buffer in VOSF mode
static uint32 the_buffer_size; // Size of allocated the_buffer
static uint8 *the_host_buffer; // Host frame buffer in VOSF mode
static uint32 the_buffer_size; // Size of allocated the_buffer
struct ScreenPageInfo {
int top, bottom; // Mapping between this virtual page and Mac scanlines
@ -131,8 +131,6 @@ static inline int find_next_page_clear(int page)
#endif
}
static int zero_fd = -1;
#ifdef HAVE_PTHREADS
static pthread_mutex_t vosf_lock = PTHREAD_MUTEX_INITIALIZER; // Mutex to protect frame buffer (dirtyPages in fact)
#define LOCK_VOSF pthread_mutex_lock(&vosf_lock);
@ -153,6 +151,14 @@ static int log_base_2(uint32 x)
return l;
}
// Extend size to page boundary
static uint32 page_extend(uint32 size)
{
const uint32 page_size = getpagesize();
const uint32 page_mask = page_size - 1;
return (size + page_mask) & ~page_mask;
}
/*
* Initialize mainBuffer structure
@ -165,7 +171,7 @@ static bool video_init_buffer(void)
const uint32 page_mask = page_size - 1;
mainBuffer.memBase = (uintptr) the_buffer;
// Align the frame buffer on page boundary
// Round up frame buffer base to page boundary
mainBuffer.memStart = (uintptr)((((unsigned long) the_buffer) + page_mask) & ~page_mask);
mainBuffer.memLength = the_buffer_size;
mainBuffer.memEnd = mainBuffer.memStart + mainBuffer.memLength;
@ -195,7 +201,7 @@ static bool video_init_buffer(void)
PFLAG_CLEAR_ALL;
// Safety net to insure the loops in the update routines will terminate
// See a discussion in <video_vosf.h> for further details
// See "How can we deal with array overrun conditions ?" hereunder for further details
PFLAG_CLEAR(mainBuffer.pageCount);
PFLAG_SET(mainBuffer.pageCount+1);
@ -226,25 +232,16 @@ static bool video_init_buffer(void)
/*
* Page-aligned memory allocation
* Screen fault handler
*/
// Extend size to page boundary
static uint32 page_extend(uint32 size)
{
const uint32 page_size = getpagesize();
const uint32 page_mask = page_size - 1;
return (size + page_mask) & ~page_mask;
}
// Screen fault handler
static bool screen_fault_handler(sigsegv_address_t fault_address, sigsegv_address_t fault_instruction)
{
D(bug("screen_fault_handler: ADDR=0x%08X from IP=0x%08X\n", fault_address, fault_instruction));
const uintptr addr = (uintptr)fault_address;
/* Someone attempted to write to the frame buffer. Make it writeable
* now so that the data could actually be written. It will be made
* now so that the data could actually be written to. It will be made
* read-only back in one of the screen update_*() functions.
*/
if ((addr >= mainBuffer.memStart) && (addr < mainBuffer.memEnd)) {
@ -276,6 +273,7 @@ static bool screen_fault_handler(sigsegv_address_t fault_address, sigsegv_addres
return false;
}
/*
* Update display for Windowed mode and VOSF
*/
@ -364,14 +362,13 @@ static inline void update_display_window_vosf(void)
else
XPutImage(x_display, the_win, the_gc, img, 0, y1, 0, y1, VideoMonitor.mode.x, height);
}
mainBuffer.dirty = false;
}
/*
* Update display for DGA mode and VOSF
* (only in Direct Addressing mode)
* (only in Real or Direct Addressing mode)
*/
#if REAL_ADDRESSING || DIRECT_ADDRESSING

View File

@ -803,15 +803,6 @@ bool VideoInit(bool classic)
classic_mode = classic;
#ifdef ENABLE_VOSF
// Open /dev/zero
zero_fd = open("/dev/zero", O_RDWR);
if (zero_fd < 0) {
char str[256];
sprintf(str, GetString(STR_NO_DEV_ZERO_ERR), strerror(errno));
ErrorAlert(str);
return false;
}
// Zero the mainBuffer structure
mainBuffer.dirtyPages = 0;
mainBuffer.pageInfo = 0;
@ -1083,12 +1074,6 @@ static void video_close(void)
void VideoExit(void)
{
video_close();
#ifdef ENABLE_VOSF
// Close /dev/zero
if (zero_fd > 0)
close(zero_fd);
#endif
}