header.cpp

00001
00002 /***************************************************************************
00003  *  bb_shmem_header.cpp - BlackBoard shared memory header
00004  *
00005  *  Created: Thu Oct 19 14:21:07 2006 (Anne's 25th Birthday)
00006  *  Copyright  2006  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version. A runtime exception applies to
00014  *  this software (see LICENSE.GPL_WRE file mentioned below for details).
00015  *
00016  *  This program is distributed in the hope that it will be useful,
00017  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  *  GNU Library General Public License for more details.
00020  *
00021  *  Read the full text in the LICENSE.GPL_WRE file in the doc directory.
00022  */
00023
00024 #include <blackboard/shmem/header.h>
00025 #include <utils/ipc/shm.h>
00026 #include <cstddef>
00027
00028 namespace fawkes {
00029 
00030 /** @class BlackBoardSharedMemoryHeader <blackboard/shmem/header.h>
00031  * BlackBoard Shared Memory Header.
00032  * This class is used identify BlackBoard shared memory headers and
00033  * to interact with the management data in the shared memory segment.
00034  * The basic options stored in the header is a version identifier
00035  * and pointers to the list heads of the free and allocated chunk
00036  * lists.
00037  *
00038  * @author Tim Niemueller
00039  * @see SharedMemoryHeader
00040  */
00041
00042 
00043 /** Constructor
00044  * @param data_size the size of the shared memory segment without the header
00045  *                  that should be allocated.
00046  * @param version The BB version to store in the shared memory segment to prevent
00047  *                conflicts with older software.
00048  */
00049 BlackBoardSharedMemoryHeader::BlackBoardSharedMemoryHeader(size_t data_size,
00050                                                            unsigned int version)
00051 {
00052   _data_size = data_size;
00053   _version   = version;
00054   data       = NULL;
00055 }
00056
00057 
00058 /** Constructor.
00059  * @param version The BB version to store in the shared memory segment to prevent
00060  *                conflicts with older software.
00061  */
00062 BlackBoardSharedMemoryHeader::BlackBoardSharedMemoryHeader(unsigned int version)
00063 {
00064   _data_size = 0;
00065   _version   = version;
00066   data       = NULL;
00067 }
00068
00069 
00070 /** Copy constructor.
00071  * @param h header to copy
00072  */
00073 BlackBoardSharedMemoryHeader::BlackBoardSharedMemoryHeader(const BlackBoardSharedMemoryHeader *h)
00074 {
00075   _data_size = h->_data_size;
00076   _version   = h->_version;
00077   data       = h->data;
00078 }
00079
00080 
00081 /** Set SharedMemory instance.
00082  * This is needed for address conversion and must be set right after the constructor
00083  * call of SharedMemory!
00084  * @param shmem SharedMemory segment used for this header
00085  */
00086 void
00087 BlackBoardSharedMemoryHeader::set_shared_memory(SharedMemory *shmem)
00088 {
00089   this->shmem = shmem;
00090 }
00091
00092 
00093 /** Destructor */
00094 BlackBoardSharedMemoryHeader::~BlackBoardSharedMemoryHeader()
00095 {
00096 }
00097
00098
00099
00100 SharedMemoryHeader *
00101 BlackBoardSharedMemoryHeader::clone() const
00102 {
00103   return new BlackBoardSharedMemoryHeader(this);
00104 }
00105
00106 
00107 /** Check if the given shared memory segment is a Fawkes BB segment
00108  * @param memptr Ptr to the segment
00109  * @return true if the version matches, false otherwise
00110  */
00111 bool
00112 BlackBoardSharedMemoryHeader::matches(void *memptr)
00113 {
00114   BlackBoardSharedMemoryHeaderData *md = (BlackBoardSharedMemoryHeaderData *)memptr;
00115   return (_version == md->version);
00116 }
00117
00118
00119 bool
00120 BlackBoardSharedMemoryHeader::operator==(const SharedMemoryHeader &s) const
00121 {
00122   const BlackBoardSharedMemoryHeader *h = dynamic_cast<const BlackBoardSharedMemoryHeader *>(&s);
00123   if ( ! h ) {
00124     return false;
00125   } else {
00126     return ( (_version == h->_version) &&
00127              (_data_size == h->_data_size) &&
00128              (data == h->data) );
00129   }
00130 }
00131 
00132 /** Get the size of the header data.
00133  * @return size of the header data
00134  */
00135 size_t
00136 BlackBoardSharedMemoryHeader::size()
00137 {
00138   return sizeof(BlackBoardSharedMemoryHeaderData);
00139 }
00140
00141 
00142 /** Initialize shared memory segment
00143  * This copies basic management header data into the shared memory segment.
00144  * Basically sets the version and list heads to NULL
00145  * @param memptr pointer to the memory
00146  */
00147 void
00148 BlackBoardSharedMemoryHeader::initialize(void *memptr)
00149 {
00150   data = (BlackBoardSharedMemoryHeaderData *)memptr;
00151   data->version         = _version;
00152   data->shm_addr        = memptr;
00153   data->free_list_head  = NULL;
00154   data->alloc_list_head = NULL;
00155 }
00156
00157 
00158 /** Set data of this header
00159  * Sets the internal pointer to the shared memory header data 
00160  * to the data retrieved from the shared memory segment.
00161  * @param memptr pointer to the memory
00162  */
00163 void
00164 BlackBoardSharedMemoryHeader::set(void *memptr)
00165 {
00166   data = (BlackBoardSharedMemoryHeaderData *)memptr;
00167 }
00168
00169
00170 void
00171 BlackBoardSharedMemoryHeader::reset()
00172 {
00173   data = NULL;
00174 }
00175
00176 
00177 /** Data segment size.
00178  * @return size of the data segment without header
00179  */
00180 size_t
00181 BlackBoardSharedMemoryHeader::data_size()
00182 {
00183   return _data_size;
00184 }
00185
00186 
00187 /** Get the head of the free chunks list.
00188  * @return pointer to the free list head, local pointer, already transformed,
00189  * you can use this without further conversion.
00190  */
00191 chunk_list_t *
00192 BlackBoardSharedMemoryHeader::free_list_head()
00193 {
00194   return (chunk_list_t *)shmem->ptr(data->free_list_head);
00195 }
00196
00197 
00198 /** Get the head of the allocated chunks list.
00199  * @return pointer to the allocated list head, local pointer, already transformed,
00200  * you can use this without further conversion.
00201  */
00202 chunk_list_t *
00203 BlackBoardSharedMemoryHeader::alloc_list_head()
00204 {
00205   return (chunk_list_t *)shmem->ptr(data->alloc_list_head);
00206 }
00207
00208 
00209 /** Set the head of the free chunks list.
00210  * @param flh pointer to the new free list head, must be a pointer to the local
00211  * shared memory segment. Will be transformed to a shared memory address.
00212  */
00213 void
00214 BlackBoardSharedMemoryHeader::set_free_list_head(chunk_list_t *flh)
00215 {
00216   data->free_list_head = (chunk_list_t *)shmem->addr(flh);
00217 }
00218
00219 
00220 /** Set the head of the allocated chunks list.
00221  * @param alh pointer to the new allocated list head, must be a pointer to the local
00222  * shared memory segment. Will be transformed to a shared memory address.
00223  */
00224 void
00225 BlackBoardSharedMemoryHeader::set_alloc_list_head(chunk_list_t *alh)
00226 {
00227   data->alloc_list_head = (chunk_list_t *)shmem->addr(alh);
00228 }
00229
00230 
00231 /** Get BlackBoard version.
00232  * @return BlackBoard version
00233  */
00234 unsigned int
00235 BlackBoardSharedMemoryHeader::version() const
00236 {
00237   return data->version;
00238 }
00239
00240 } // end namespace fawkes