Boost logo

Boost Users :

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


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