CudaPyramidCache.H

Go to the documentation of this file.
00001 /*!@file CUDA/CudaPyramidCache.H */
00002 
00003 // //////////////////////////////////////////////////////////////////// //
00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005   //
00005 // by the University of Southern California (USC) and the iLab at USC.  //
00006 // See http://iLab.usc.edu for information about this project.          //
00007 // //////////////////////////////////////////////////////////////////// //
00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected //
00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency //
00010 // in Visual Environments, and Applications'' by Christof Koch and      //
00011 // Laurent Itti, California Institute of Technology, 2001 (patent       //
00012 // pending; application number 09/912,225 filed July 23, 2001; see      //
00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status).     //
00014 // //////////////////////////////////////////////////////////////////// //
00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit.       //
00016 //                                                                      //
00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can   //
00018 // redistribute it and/or modify it under the terms of the GNU General  //
00019 // Public License as published by the Free Software Foundation; either  //
00020 // version 2 of the License, or (at your option) any later version.     //
00021 //                                                                      //
00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope  //
00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the   //
00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
00025 // PURPOSE.  See the GNU General Public License for more details.       //
00026 //                                                                      //
00027 // You should have received a copy of the GNU General Public License    //
00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write   //
00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,   //
00030 // Boston, MA 02111-1307 USA.                                           //
00031 // //////////////////////////////////////////////////////////////////// //
00032 //
00033 // Primary maintainer for this file: Rob Peters <rjpeters at usc dot edu>
00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/CUDA/CudaPyramidCache.H $
00035 // $Id: CudaPyramidCache.H 12962 2010-03-06 02:13:53Z irock $
00036 //
00037 
00038 #ifndef CUDA_CUDAPYRAMIDCACHE_H_DEFINED
00039 #define CUDA_CUDAPYRAMIDCACHE_H_DEFINED
00040 
00041 #include "CUDA/CudaImage.H"
00042 #include "CUDA/CudaImageSet.H"
00043 #include "Image/Pixels.H"
00044 
00045 #include <pthread.h>
00046 
00047 namespace rutz { class mutex_lock_class; }
00048 
00049 template <class T>
00050 class CudaPyramidCache
00051 {
00052 public:
00053   CudaPyramidCache();
00054 
00055   struct Item
00056   {
00057     Item();
00058     ~Item();
00059 
00060     /// Acquire an exclusive lock on the mutex so that we can set a new pyramid for the given image
00061     /** If we already have a pyramid for the given image, then the
00062         return value here will be false, indicating that there is no
00063         need to set the pyramid again.
00064 
00065         If we do need a new pyramid for the given image, then the
00066         return value will be true and the Lock will be filled in with
00067         lock information that must be passed back to endSet().
00068 
00069         Typical usage would look like this:
00070 
00071         \code
00072         rutz::mutex_lock_class lock;
00073         if (cache->gaussian5.beginSet(img, &lock))
00074         {
00075           ImageSet<float> pyr = doSomethingToComputePyramid(img);
00076           cache->gaussian5.endSet(img, pyr, &lock);
00077         }
00078         \endcode
00079     */
00080     bool beginSet(const CudaImage<T>& img, rutz::mutex_lock_class* l);
00081 
00082     /// Install a new image/pyramid pair using a lock previous acquired from beginSet()
00083     void endSet(const CudaImage<T>& img, const CudaImageSet<T>& pyr,
00084                 rutz::mutex_lock_class* l);
00085 
00086     /// Returns a pointer to the cached pyramid for img, or null if there is no such cached pyramid
00087     const CudaImageSet<T>* get(const CudaImage<T>& img) const;
00088 
00089   private:
00090     Item(const Item&);
00091     Item& operator=(const Item&);
00092 
00093     mutable pthread_mutex_t itsLock;
00094     CudaImage<T> itsImg;
00095     CudaImageSet<T> itsPyr;
00096   };
00097 
00098   Item gaussian5;
00099   Item laplacian9;
00100 
00101 private:
00102   CudaPyramidCache(const CudaPyramidCache&);
00103   CudaPyramidCache& operator=(const CudaPyramidCache&);
00104 };
00105 
00106 // ######################################################################
00107 /* So things look consistent in everyone's emacs... */
00108 /* Local Variables: */
00109 /* mode: c++ */
00110 /* indent-tabs-mode: nil */
00111 /* End: */
00112 
00113 #endif // CUDA_CUDAPYRAMIDCACHE_H_DEFINED
Generated on Sun May 8 08:04:44 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3