shared.h
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __THREAD_SHARED_H
  2. #define __THREAD_SHARED_H
  3. #include "thread.h"
  4. #include "thread_list.h"
  5. extern "C" {
  6. #    include <sys/ipc.h>
  7. #    include <sys/shm.h>
  8. };
  9. /**
  10.  * This is a class that takes care of shared memory allocations
  11.  * and access.
  12.  *
  13.  * By utilizing a malloc() like scheme, the class retrieves
  14.  * shared pages from the kernel and installs them into a list
  15.  * of free pages.  These pages are usually far larger, then
  16.  * the amount of memory a user will need, thus they will
  17.  * fragmented and saved in a used list, where they can be
  18.  * checked against, when a user returns them to the pool
  19.  *
  20.  * Memory that doesn't belong to the pool of shared memory,
  21.  * is not returned to it... but ignored.
  22.  *
  23.  * @author Orn Hansen <oe.hansen@gamma.telenordia.se>
  24.  * @short Maintain shared memory.
  25.  */
  26. class shared_mem {
  27.  public:
  28.   struct mem_entry {
  29.     size_t    _size;
  30.     void *    _data;
  31.   };
  32.   struct storage {
  33.     int       _id;
  34.     int       _mid;
  35.     key_t     _key;
  36.     char *    _file;
  37.     int       _proj;
  38.     void *    _ptr;
  39.     size_t    _page;
  40.   };
  41.   typedef list<storage>::iterator   sto_iterator;
  42.   typedef list<mem_entry>::iterator mem_iterator;
  43.  private:
  44.   int _perm;
  45.   int _blocks;
  46.   char *_key_root;
  47.   mutex _key_lock;               // Exclusive access to keys.
  48.   mutex _mem_lock;               // Exclusive access to memory lists.
  49.   struct mem_entry  _mem_entry;
  50.   struct storage    _work_area;
  51.   list<storage>     _shared;
  52.   list<mem_entry>   _free_list;
  53.   list<mem_entry>   _used_list;
  54.   mem_iterator getmem(sto_iterator,size_t);
  55.   mem_iterator fillup(size_t,int);
  56.   void fragment(mem_iterator,size_t);
  57.  public:
  58.   shared_mem();
  59.   shared_mem(const char *);
  60.   ~shared_mem();
  61.   /**
  62.    * Create a new branch from the main project tree.
  63.    *
  64.    * @param s The branch name.
  65.    * @return An integer identifying the project.
  66.    */
  67.   int create_proj(const char *);
  68.   /**
  69.    * Create a key project, that is connected to the
  70.    * branch tree obtain from @ref #create_proj
  71.    *
  72.    * @param p The project id.
  73.    * @return A key identifier that can be used to get shared memory.
  74.    */
  75.   key_t make_key(int);
  76.   /**
  77.    * Obtain a key, which has alredy been created.  The key
  78.    * is calculated, based on a branch and project identifier.
  79.    *
  80.    * @param s The branch name.
  81.    * @param i The project identifier.
  82.    * @return Calculated key, or -1 if error.
  83.    */
  84.   key_t get_key(const char *,int);
  85.   /**
  86.    * Allocate a selected sized memory, based on the given
  87.    * key.
  88.    *
  89.    * @param k The key to allocate memory with.
  90.    * @param s The size of memory to allocate.
  91.    * @return A pointer to allocated memory, or 0 if error.
  92.    */
  93.   void *keyalloc(key_t,size_t);
  94.   /**
  95.    * Allocate memory, and associate it with a given project
  96.    * identifier.  See @ref #create_proj
  97.    * 
  98.    * @param s The size of memory to allocate.
  99.    * @param i The project identifier, 0 = main project.
  100.    * @return Allocated memory, or 0 if error.
  101.    */
  102.   void *alloc(size_t,int);
  103.   /**
  104.    * Memory allocated should be returned to the memory pool.  This will
  105.    * enable programs to reuse it in another context, if needed.  This is
  106.    * not necessary though, as all shared memory mapped will be destroyed
  107.    * on exit.
  108.    *
  109.    * @param p A pointer to the memory, that was allocated.
  110.    */
  111.   void dealloc(void *);
  112.   /**
  113.    * Change the name of the main project... root name.
  114.    *
  115.    * @param s The name to give the root project.
  116.    */
  117.   void change_proj(const char *);
  118.   /**
  119.    * Change the permissions, that are given to newly
  120.    * allocated shared memory pages.
  121.    *
  122.    * @param p The permissions to give.
  123.    */
  124.   void change_perm(int);
  125.   /**
  126.    * Cleanup all memory, and lock the allocator to prohibit any
  127.    * other access.
  128.    */
  129.   void cleanup();
  130.   /**
  131.    * This is the global allocator object.
  132.    */
  133.   static shared_mem share;
  134. };
  135. #endif /* __THREAD_SHARED_H */