
Hi, I am trying to make a shared memory block between 2 Intel Fortran programs and thought to use a small C/C++ lib file to accomplish this: Fortran can use the ISO_C_BINDING module to make its pointers point to C objects but not vice versa and there is a vast Fortran code base which we have no intention of porting. There is a native pipe mechanism but given the amount of data I will be exchanging, disk access is something I want to avoid. The application is FEM modeling and the sparse matrix can be several hundred MBs; as the program evolves and the matrix changes, I expect hundreds of GBs of data in total I/O. Seems like it would be better to have a shared memory region and let the OS manage things as much as possible. Starting small to test the idea, I am running into trouble with something which seems easy enough to do in the examples but which only seems to work in 32-bit. Here is an incomplete fragment (got stuck early): #include <string> #include <boost/interprocess/managed_shared_memory.hpp> using namespace boost::interprocess; struct shm_remove { shm_remove(const char *input) { name = std::string(input); shared_memory_object::remove(name.c_str()); } ~shm_remove() {shared_memory_object::remove(name.c_str());} std::string name; } *remover; extern "C" void alloc_mumps(const int n, const int nnz, const char *name) { int size_shm = sizeof(int)*(2+2*nnz) + sizeof(double)*(nnz+2*n); remover = new shm_remove(name); managed_shared_memory managed_shm(create_only,name,size_shm); // Trying to do the equivalent of *i = new int int *i = managed_shm.construct<int>(anonymous_instance)[1](n); } Calling the function with n=3 and nnz=6 (a very small value compared to my final application) works OK when the application is compiled under 32-bit. Compiling under 64-bit produces an access violation error in win32_api.hpp: inline long interlocked_compare_exchange(long volatile *addr, long val1, long val2) { return BOOST_INTERLOCKED_COMPARE_EXCHANGE(addr, val1, val2); } values in debugger: addr=0, val1=1 val2=0. I do not know enough about Boost to know whether this is a design limitation, a bug or just an issue with my initial build. Just for reference, this is what I used: bjam --toolset=msvc-9.0 address-model=64 --build-type=complete stage Any suggestions ? Michel Lestrade Crosslight Software