50# define WIN32_LEAN_AND_MEAN
85 bool create(
size_t size)
89 const unsigned long pid = GetCurrentProcessId();
90 name_ = stde::safe_format(
"Local\\LassIOSharedMemory_%lx_%i", pid, id_++);
94 map_ = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, s.HighPart, s.LowPart, name_.c_str());
104 bool open(
const char* name)
109 map_ = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, name);
116 MEMORY_BASIC_INFORMATION buffer;
117 if ( VirtualQuery( view_, &buffer,
sizeof(buffer) ) )
119 size_ = buffer.RegionSize;
129 UnmapViewOfFile(view_);
140 const char* name()
const
142 return name_.c_str();
164 view_ = MapViewOfFile(map_, FILE_MAP_ALL_ACCESS, 0, 0, 0);
180unsigned SharedMemoryImpl::id_ = 0;
184class SharedMemoryImpl
199 bool create(
size_t size)
203 off_t ssize = num::numCast<off_t>(size);
205 char shmname[] =
"/dev/shm/lass-shm.XXXXXX";
206 if (tryCreate(shmname, ssize))
208 return mapView(ssize);
211 char tmpname[] =
"/tmp/lass-shm.XXXXXX";
212 if (tryCreate(tmpname, ssize))
214 return mapView(ssize);
217 if (
const char* tmpdir = getenv(
"TMPDIR"))
219 const size_t n = ::strlen(tmpdir) + 16;
220 std::vector<char> buf(n + 1);
221 const int written = ::snprintf(buf.data(), buf.size(),
"%s/lass-shm.XXXXXX", tmpdir);
222 LASS_ENFORCE(written > 0 &&
static_cast<size_t>(written) == n);
224 if (tryCreate(buf.data(), ssize))
226 return mapView(ssize);
233 bool open(
const char* name)
237 fd_ = ::open(name, O_RDWR, 0);
244 if (fstat(fd_, &st) == -1)
250 return mapView(st.st_size);
255 if (view_ && view_ != MAP_FAILED)
257 munmap(view_, this->size());
271 const char* name()
const
273 return name_.c_str();
283 LASS_ASSERT(size_ >= 0);
284 return static_cast<size_t>(size_);
289 bool tryCreate(
char* namebuf, off_t size)
291 fd_ = mkstemp(namebuf);
297 return ftruncate(fd_, size) == 0;
300 bool mapView(off_t size)
302 const int pid = getpid();
303 name_ = lass::stde::safe_format(
"/proc/%i/fd/%i", pid, fd_);
305 LASS_ASSERT(size_ >= 0);
306 view_ = mmap(0,
static_cast<size_t>(size), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd_, 0);
307 if (view_ == MAP_FAILED)
329SharedMemory::SharedMemory():
330 pimpl_(new impl::SharedMemoryImpl())
335SharedMemory::~SharedMemory()
341bool SharedMemory::create(
size_t size)
343 return pimpl_->create(size);
347bool SharedMemory::open(
const char* pipeName)
349 return pimpl_->open(pipeName);
353void SharedMemory::close()
359const char* SharedMemory::name()
const
361 return pimpl_->name();
365size_t SharedMemory::size()
const
367 return pimpl_->size();
371void* SharedMemory::get()
const
373 return pimpl_->get();
377bool SharedMemory::operator!()
const
379 return !pimpl_->get();
streams, binary streams, vrmlstreams, ...
Library for Assembled Shared Sources.