Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a better way to check for the existence of a boost shared memory segment?

The only way I could see how to do this was to try to access it and catch the exception that gets thrown if it isn't there.

bool exists()
{
    using namespace boost::interprocess;
    try
    {
        managed_shared_memory segment(open_only, kSharedMemorySegmentName);
        return segment.check_sanity();
    } 
    catch (const std::exception &ex) {
        std::cout << "managed_shared_memory ex: "  << ex.what();
    }
    return false;
}

Is there a better way?

like image 326
marathon Avatar asked Aug 29 '14 18:08

marathon


People also ask

Can two processes share memory?

Context switching between processes is more expensive. Processes don't share memory with other processes. Threads share memory with other threads of the same process.

What is shared memory mechanism?

What is shared memory? Shared memory is the fastest interprocess communication mechanism. The operating system maps a memory segment in the address space of several processes, so that several processes can read and write in that memory segment without calling operating system functions.


1 Answers

I was playing around with boost::interprocess and happened to ask the same question. I did a little digging before finally settling on open_or_create for my needs. However, deep in the bowels of the template spaghetti that is boost (mine is 1.62), we find this gem:

      /*<... snip ...>*/
     //This loop is very ugly, but brute force is sometimes better
     //than diplomacy. If someone knows how to open or create a
     //file and know if we have really created it or just open it
     //drop me a e-mail!
     bool completed = false;
     spin_wait swait;
     while(!completed){
        try{
           create_device<FileBased>(dev, id, size, perm, file_like_t());
           created     = true;
           completed   = true;
        }
        catch(interprocess_exception &ex){
           if(ex.get_error_code() != already_exists_error){
              throw;
           }
           else{
              try{
                 DeviceAbstraction tmp(open_only, id, read_write);
                 dev.swap(tmp);
                 created     = false;
                 completed   = true;
              }
              catch(interprocess_exception &e){
                 if(e.get_error_code() != not_found_error){
                    throw;
                 }
              }
              catch(...){
                 throw;
              }
           }
        }
        catch(...){
           throw;
        }
        swait.yield();
     }

     /* <... snip ...> */

The above is from managed_open_or_create_impl.hpp at about line 360, in the priv_open_or_create() method. Seems the answer is no. No, there's no good way to check whether a shared memory has been created prior to trying to opening it.

like image 94
MFT Avatar answered Sep 28 '22 03:09

MFT