blob: 1a60e63f43eee0b2e4301eda5475f96a6087aa7f [file] [log] [blame]
// Copyright (C) 2011 Tim Blechmann
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <cstdlib> //std::system
#include <sstream>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/lockfree/stack.hpp>
#include <boost/thread/thread.hpp>
using namespace boost::interprocess;
typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
typedef boost::lockfree::stack<int,
boost::lockfree::allocator<ShmemAllocator>,
boost::lockfree::capacity<2048>
> stack;
int main (int argc, char *argv[])
{
if(argc == 1){
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
} remover;
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
ShmemAllocator alloc_inst (segment.get_segment_manager());
stack * queue = segment.construct<stack>("stack")(alloc_inst);
for (int i = 0; i != 1024; ++i)
queue->push(i);
std::string s(argv[0]); s += " child ";
if(0 != std::system(s.c_str()))
return 1;
while (!queue->empty())
boost::thread::yield();
return 0;
} else {
managed_shared_memory segment(open_only, "MySharedMemory");
stack * queue = segment.find<stack>("stack").first;
int from_queue;
for (int i = 0; i != 1024; ++i) {
bool success = queue->pop(from_queue);
assert (success);
assert (from_queue == 1023 - i);
}
segment.destroy<stack>("stack");
}
return 0;
}