15 #include "subprocessWindowBuffer.h"
24 const char SubprocessWindowBuffer::
25 _magic_number[SubprocessWindowBuffer::magic_number_length] =
"pNdaSWB";
33 void *SubprocessWindowBuffer::
34 operator
new(size_t,
void *addr) {
46 SubprocessWindowBuffer::
47 SubprocessWindowBuffer(
int x_size,
int y_size) {
48 memcpy(_this_magic, _magic_number, magic_number_length);
51 _row_size = _x_size * 4;
52 _framebuffer_size = _row_size * y_size;
58 _mmap_size =
sizeof(*this) + _framebuffer_size;
66 SubprocessWindowBuffer::
68 _mmap_size(copy._mmap_size),
69 _x_size(copy._x_size),
70 _y_size(copy._y_size),
71 _row_size(copy._row_size),
72 _framebuffer_size(copy._framebuffer_size)
74 memcpy(_this_magic, _magic_number, magic_number_length);
86 SubprocessWindowBuffer::
87 ~SubprocessWindowBuffer() {
109 int x_size,
int y_size) {
113 filename = tmpnam(NULL);
115 fd = open(filename.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
117 perror(filename.c_str());
123 mmap_size = temp._mmap_size;
126 size_t zero_size = 1024;
127 char zero[zero_size];
128 memset(zero, 0, zero_size);
129 for (
size_t bi = 0; bi < mmap_size; bi += zero_size) {
130 write(fd, zero, zero_size);
133 void *shared_mem = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
135 if (shared_mem == (
void *)-1) {
158 buffer->~SubprocessWindowBuffer();
162 unlink(filename.c_str());
184 fd = open(filename.c_str(), O_RDWR);
186 perror(filename.c_str());
191 off_t file_size = lseek(fd, 0, SEEK_END);
193 cerr << filename <<
" not large enough.\n";
201 void *shared_mem = mmap(NULL, initial_size, PROT_READ,
203 if (shared_mem == (
void *)-1) {
205 cerr <<
"Couldn't map.\n";
213 cerr <<
"Not a subprocess window buffer: " << filename <<
"\n";
214 munmap(shared_mem, initial_size);
221 mmap_size = temp->_mmap_size;
224 munmap(shared_mem, initial_size);
226 if (file_size < mmap_size) {
227 cerr << filename <<
" not large enough.\n";
233 shared_mem = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE,
235 if (shared_mem == (
void *)-1) {
237 cerr <<
"Couldn't map 2.\n";
249 assert(buffer->_mmap_size == mmap_size);
264 munmap((
void *)buffer, mmap_size);
276 return (memcmp(_this_magic, _magic_number, magic_number_length) == 0);
static void close_buffer(int fd, size_t mmap_size, const string &filename, SubprocessWindowBuffer *buffer)
Closes a buffer object created via a previous call to open_buffer().
bool verify_magic_number() const
Returns true if the buffer's magic number matches, false otherwise.
static SubprocessWindowBuffer * new_buffer(int &fd, size_t &mmap_size, string &filename, int x_size, int y_size)
Call this method to create a new buffer in shared memory space.
This is a special class that is designed to faciliate SubprocessWindow.
static void destroy_buffer(int fd, size_t mmap_size, const string &filename, SubprocessWindowBuffer *buffer)
Destroys a buffer object created via a previous call to new_buffer().
static SubprocessWindowBuffer * open_buffer(int &fd, size_t &mmap_size, const string &filename)
Call this method to open a reference to an existing buffer in shared memory space.