|
Boost Users : |
Subject: Re: [Boost-users] problem with memcpy to shared memory
From: Cuneyt Taskiran (ctaskiran_at_[hidden])
Date: 2010-03-02 13:06:59
Sorry, forgot to provide gdb output in my message:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000001000990e8
0x00007fffffe007c5 in __memcpy ()
The address 0x00000001000990e8 is the start address of the buffer,
i.e. the initial value of m_write_ptr.
The output of where is:
(gdb) where
#0 0x00007fffffe007c5 in __memcpy ()
#1 0x0000000100002e64 in SharedMemoryBufferMock<int>::write
(this=0x7fff5fbff7d0, item_ptr=0x7fff5fbff828) at
SharedMemoryBufferMock.hpp:93
#2 0x0000000100000c7e in main (argc=1, argv=0x7fff5fbff868) at ../main.cpp:27
I am running this on a MAC with snow Leopard, could that have
something to do with this?
Thanks,
C
On Tue, Mar 2, 2010 at 11:05 AM, Cuneyt Taskiran <ctaskiran_at_[hidden]> wrote:
> Hi,
>
> I want to create a buffer in shared memory and have modified the
> example code provided in Boost.Interprocess to get the following
> class:
>
> template<typename ItemType>
> class SharedMemoryBufferMock {
> private:
> ItemType* m_data; // array of ItemType items
> ItemType* m_read_ptr; // points to next buffer
> location to be read from
> ItemType* m_write_ptr; // points to next buffer
> location to be written to
> std::string m_segmentName; // unique name for the memory
> segment that holds the buffer object
> std::string m_objectName; // unique name for the buffer object
> unsigned long m_nItems;
> unsigned long m_capacity;
> public:
> SharedMemoryBufferMock( unsigned long maxItemCount );
> virtual ~SharedMemoryBufferMock();
>
> unsigned long capacity() { return m_capacity; }
> unsigned long size() { return m_nItems; }
> bool isFull() { return m_nItems == m_capacity; }
> bool isEmpty() { return m_nItems == 0; }
>
> ItemType* read();
> void write( ItemType* item_ptr);
> };
>
> /*
> * Implementation of the templated methods.
> */
> template<typename
> ItemType>SharedMemoryBufferMock<ItemType>::SharedMemoryBufferMock(
> unsigned long maxItemCount )
> {
> if( maxItemCount == 0 ) {
> std::cerr << "Buffer cannot be created with a capacity of zero!" << std::endl;
> exit(1);
> }
>
> // Create unique name for memory segment using PID of current process.
> std::stringstream pid_str;
> pid_str << "BufferMemorySegment_" << getpid();
> m_segmentName = pid_str.str();
> pid_str.str("");
> pid_str << "BufferMemoryObject_" << getpid();
> m_objectName = pid_str.str();
>
> boost::interprocess::shared_memory_object::remove(m_segmentName.c_str());
>
> m_capacity = maxItemCount;
>
> // Create a new segment with given name and size
> boost::interprocess::managed_shared_memory segment(
> boost::interprocess::create_only,
> m_segmentName.c_str(),
> //memSize
> 65536
> );
>
> // Create the buffer data object with specified item capacity.
> m_data = segment.construct<ItemType>
> ( m_objectName.c_str() ) // name of the object
> [maxItemCount] // number of items
> (ItemType()); // ctor for elements
>
> // Initialize read and write locations.
> m_write_ptr = m_read_ptr = m_data;
> }
>
> template<typename ItemType> void
> SharedMemoryBufferMock<ItemType>::write( ItemType* item_ptr )
> {
> if( isFull() ) {
> std::cerr << "Cannot write to buffer, it's full. Read one or more
> elements first!" << std::endl;
> exit(1);
> }
> std::memcpy( m_write_ptr, item_ptr, sizeof(ItemType) );
> m_write_ptr++;
> m_nItems++;
> }
>
> When I test the code using the following:
> SharedMemoryBufferMock<int> sharedBuf(100);
> for( int i = 0; i < 10; i++ ) {
> cout << "writing " << i << endl;
> sharedBuf.write( &i );
> }
>
> I get a segmentation fault at the memcpy step. I've been at this for a
> couple of hours now and cannot see what I'm doing wrong. Any comments
> would be greatly appreciated.
>
> Thanks,
>
> C
>
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net