Boost logo

Boost Users :

Subject: [Boost-users] global instances for managed_shared_memory & message_queue
From: bb.andersen (bb.andersen_at_[hidden])
Date: 2013-06-24 18:45:40


Dear Boost Grurus,

First of all let me thank you for the huge effort that people like Mr.
Gaztañaga has made to keep boost interprocess improved. It is a really
time-saver API!

I have a very basic question that, despite the large amount of documentation
I've looked, I haven't clarified yet.

I just want to create a global static variables (i.e. instances) for
managed_shared_memory, message_queue, mutex and condition var.

By now I have my app prototype (CGI) is running fine with auto vars, as
appeared in the several examples:

/main() {
...
boost::interprocess::permissions perm;
perm.set_unrestricted();
managed_shared_memory segment(create_only,"MonitorOEE_SharedMemory", 65536,
0, perm);
...
message_queue mq(create_only, "MonitorOEE_MessageQueue", 256,
sizeof(t_QRequest), perm);
...
named_mutex mutex_waiting(create_only, namedMutex, perm);
...
named_condition cdv_wakeup(create_only, namedConditionVar, perm);
...
}/

All segment, mq, cdv_wakeup live in the context of the main function...

Now I want them to be globally accessible from different functions. But I am
not able to. I just partially succeeded creating global pointers to
managed_shared_memory and message_queue. But when constructing object to the
pointer segmentation faults appear...

///Global Declarations
...
static boost::interprocess::message_queue *mq;
static boost::interprocess::managed_shared_memory *segment;
static boost::interprocess::interprocess_mutex mutex_waiting;
static boost::interprocess::interprocess_condition cdv_wakeup;
...

main() {
..
std::auto_ptr<boost::interprocess::managed_shared_memory>ptr01(new
boost::interprocess::managed_shared_memory(open_only,"MonitorOEE_SharedMemory"));
segment = ptr01.get();
//this seems to work but fails when constructing objects:
IPC_SOAPRequest *pSOAPRequest
=segment->construct<IPC_SOAPRequest>(namedSOAPRequest)();
(the autovar counterpart works seamlessly)
...
std::auto_ptr<boost::interprocess::message_queue>ptr02(new
boost::interprocess::message_queue(open_only,MonitorOEE_MessageQueue"));
mq = ptr02.get();
//Seems to work...(send and receive)
..
//dunno how to instantiate to mutex and cond var global references
}
/
I am sure it should be an easier and tidier way. Can you give me just the
first steps to work this out? I've been sleepless a couple of nights.

Eskerrik Asko! (Thanks in the basque language!)

--
View this message in context: http://boost.2283326.n4.nabble.com/global-instances-for-managed-shared-memory-message-queue-tp4648903.html
Sent from the Boost - Users mailing list archive at Nabble.com.

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