Author: James CE Johnson

ACE Tutorial 019
Sharing your Memories

Here's the mysterious shmem.h. I wanted to show it after the placement-new client and server so that the SharedData object would have some relevance.

shmem.h

    // page05.html,v 1.4 1999/04/03 21:56:33 jcej Exp

    #ifndef SHMEM_H
    #define SHMEM_H

    // This is where you'll find the ACE_Shared_Memory_SV object
    #include "ace/Shared_Memory_SV.h"

    // SHMSZ is just enough for the alphabet and a null terminator
    #define SHMSZ 27

    // Play with this, pick a value you like that isn't used by something else.
    #define SHM_KEY 4200

    /*
      This is what we stuff into shared memory via placement new in the
      second client/server pair.  Notice that it is a very basic object
      with no virtual methods and only concrete data.
     */
    class SharedData
    {
    public:
      // Construct the object and optionally initialize buf_.
      SharedData (int initialized = 1);

      // Put some data into buf_
      void set (void);

      // Show the data in buf_
      void show (void);

      // What is the value of available_
      int available (void);

      // Set the value of available_
      void available (int not_in_use);

    protected:
      // Big enough for a simple message
      char buf_[128];
      // A cheap mutex
      int available_;
    };

    #endif /* SHMEM_H */

shmem.cpp

    // page05.html,v 1.4 1999/04/03 21:56:33 jcej Exp

    #include "shmem.h"

    #if ! defined (ACE_LACKS_SYSV_SHMEM)

    /*
      Set the available_ flag to zero & optionally initialize the buf_
      area.
    */

    SharedData::SharedData (int initialize)
      : available_ (0)
    {
      if (initialize)
        ACE_OS::sprintf (buf_, "UNSET\n");
    }

    /*
      Write the process ID into the buffer.  This will prove to us that
      the data really is shared between the client and server.
    */
    void SharedData::set (void)
    {
      ACE_OS::sprintf (buf_,
                       "My PID is (%d)\n",
                       ACE_OS::getpid ());
    }

    /*
      Display the buffer to the user
    */
    void SharedData::show(void)
    {
      ACE_DEBUG ((LM_INFO,
                  "(%P|%t) Shared Data text is (%s)\n",
                  buf_));
    }

    // Show flag
    int SharedData::available(void)
    {
      return available_;
    }

    // Set flag
    void SharedData::available(int a)
    {
      available_ = a;
    }

    #endif /* ACE_LACKS_SYSV_SHMEM */

[Tutorial Index] [Continue This Tutorial]