$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Pataki Szilard (ceelurd_at_[hidden])
Date: 2006-08-01 04:19:15
Hello,
I have a problem retrieving objects from a map placed in shared
memory. I have two processes:
proc#1: creates the shared memory, puts a map into it and populates it
with objects
proc#2: connects to the shared memory and tries to read out the
objects from the map
Whenever I try to read out the objects from the map, I get zeroes for
the internal members (a, b).
The class definition for the objects:
--------------------------------------------------
class ShmNode
{
private:
        int a;
        int b;
public:
        ShmNode();
        ShmNode(int newa, int newb);
        ~ShmNode();
        void set(int newa, int newb);
        int getA();
        int getB();
};
--------------------------------------------------
I'm posting the source codes for the two programs. I removed the
synchronization stuff with semaphores for the sake of clarity:
Proc#1:
--------------------------------------------------
#include <boost/shmem/named_shared_object.hpp>
#include <boost/shmem/allocators/allocator.hpp>
#include <boost/shmem/containers/vector.hpp>
#include <boost/shmem/containers/map.hpp>
#include <boost/shmem/sync/named_semaphore.hpp>
#include <iostream>
#include "../shmem/ShmNode.hpp"
typedef std::pair<
                        const int,
                        ShmNode*>
                MyPair;
typedef boost::shmem::allocator <
                        MyPair,
                        boost::shmem::named_shared_object::segment_manager>
                MyAlloc;
typedef boost::shmem::map<
                        const int,
                        ShmNode*,
                        std::less<const int>,
                        MyAlloc>
                MyMap;
int main()
{
        boost::shmem::named_shared_object segment;
        segment.create("/myshmem", 20000);
        
        MyAlloc nodesAlloc(segment.get_segment_manager());
        std::less<const int> comparator;
        
        MyMap *table = segment.construct<MyMap>("table")(comparator, nodesAlloc);
        MyPair myPair1(1, new ShmNode(1,2));
        MyPair myPair2(2, new ShmNode(3,4));
        MyPair myPair3(3, new ShmNode(5,6));
        table->insert(myPair3);
        table->insert(myPair1);
        table->insert(myPair2);	
        return 0;
}
--------------------------------------------------
Proc#2
--------------------------------------------------
/* same includes */
/* same typedefs */
int main()
{
        boost::shmem::named_shared_object segment;
        segment.open("/myshmem");
        
        MyMap *table = segment.find<MyMap>("table").first;
                
        std::cout << "table size: " << table->size() << std::endl;
        
        MyMap::iterator iter;	
        for (iter = table->begin(); ; iter++)
        {		
                if (iter == table->end())
                        break;
                std::cout << iter->second->getA() << "  " << iter->second->getB() <<
std::endl;
        }	
        return 0;
}
--------------------------------------------------
The problem once again: in proc#2,  iter->second->getA() and
iter->second->getB() return 0. If I put the same loop into proc#1, the
correct values are returned. As a further hint, the size of the map
object in proc#2 is returned correctly (=3).
What am I doing wrong?
Regards,
Szilard