RollingMultiplexingDataManager.cpp

Go to the documentation of this file.
00001 // Copyright CERN 2012 - Developed in collaboration with GSI
00002 
00003 #include <fesa-core/Synchronization/RollingMultiplexingDataManager.h>
00004 
00005 #include <fesa-core/Utilities/Lock.h>
00006 #include <fesa-core/Exception/FesaException.h>
00007 
00008 
00009 namespace fesa
00010 {
00011 
00012 RollingMultiplexingDataManager::RollingMultiplexingDataManager(int32_t depth) :
00013     depth_(depth)
00014 {
00015 }
00016 
00017 int32_t RollingMultiplexingDataManager::findCycleIdBackward(int32_t cycleId)
00018 {
00019     // lock the access to the data
00020     Lock lock(*mutex_);
00021 
00022     int32_t index = *currentPosition_ - 1;
00023     if (index == -1)
00024     {
00025         index = depth_ - 1;
00026     }
00027 
00028     for (int32_t i = 0; i < depth_;i++)
00029     {
00030         // update index
00031         index--;
00032         if (index == -1)
00033         {
00034             index = depth_ - 1;
00035         }
00036 
00037         if (currentIdsCol_[index] == cycleId)
00038         {
00039             return index;
00040         }
00041 
00042     }
00043     return -1;
00044 }
00045 
00046 int32_t RollingMultiplexingDataManager::findCycleStampBackward(int64_t cycleStamp)
00047 {
00048     // lock the access to the data
00049     Lock lock(*mutex_);
00050 
00051     int32_t index = *currentPosition_;
00052 
00053     for (int32_t i = 0; i < depth_;i++)
00054     {
00055         // update index
00056         index--;
00057         if (index == -1)
00058             index = depth_ - 1;
00059 
00060         if (currentCycleStampsCol_[index] == cycleStamp)
00061         {
00062             return index;
00063         }
00064 
00065     }
00066     return -1;
00067 }
00068 
00069 //    int RollingMultiplexingDataManager::findCyleId(long cycleId)
00070 //    {
00071 //        // lock the access to the data
00072 //        mutex_->lock();
00073 //
00074 //        int index = *currentPosition_;
00075 //
00076 //        for (int i = 0; i < depth_;i++)
00077 //        {
00078 //            // update index
00079 //            index = (index + 1) % depth_;
00080 //
00081 //            if (currentIdsCol_[index] == cycleId)
00082 //            {
00083 //                mutex_->unlock();
00084 //                return index;
00085 //            }
00086 //
00087 //        }
00088 //        mutex_->unlock();
00089 //        return -1;
00090 //    }
00091 //
00092 //    int RollingMultiplexingDataManager::findCyleStamp(long long cycleStamp)
00093 //    {
00094 //        // lock the access to the data
00095 //        mutex_->lock();
00096 //
00097 //        int index = *currentPosition_;
00098 //
00099 //        for (int i = 0; i < depth_;i++)
00100 //        {
00101 //            // update index
00102 //            index = (index + 1) % depth_;
00103 //
00104 //            if (currentCycleStampsCol_[index] == cycleStamp)
00105 //            {
00106 //                mutex_->unlock();
00107 //                return index;
00108 //            }
00109 //
00110 //        }
00111 //
00112 //        mutex_->unlock();
00113 //        return -1;
00114 //
00115 //    }
00116 
00117 //    int RollingMultiplexingDataManager::putCycleId(long cycleId)
00118 //    {
00119 //        int result = -1;
00120 //        mutex_->lock();
00121 //
00122 //        if (*currentPosition_ < 0 || *currentPosition_ >= depth_)
00123 //        {
00124 //            mutex_->unlock();
00125 //            return -1;
00126 //        }
00127 //        currentIdsCol_[*currentPosition_] = cycleId;
00128 //        result = *currentPosition_;
00129 //
00130 //        mutex_->unlock();
00131 //
00132 //        return result;
00133 //    }
00134 //
00135 //    int RollingMultiplexingDataManager::putCycleStamp(long long cycleStamp)
00136 //    {
00137 //        int result = -1;
00138 //        mutex_->lock();
00139 //
00140 //        if (*currentPosition_ < 0 || *currentPosition_ >= depth_)
00141 //        {
00142 //            mutex_->unlock();
00143 //            return -1;
00144 //        }
00145 //        currentCycleStampsCol_[*currentPosition_] = cycleStamp;
00146 //
00147 //        result = *currentPosition_;
00148 //
00149 //        mutex_->unlock();
00150 //
00151 //        return result;
00152 //    }
00153 
00154 int32_t RollingMultiplexingDataManager::nextPosition(int64_t cycleStamp, int32_t cycleId)
00155 {
00156     int32_t result = -1;
00157     Lock lock(*mutex_);
00158     if (*currentPosition_ < 0 || *currentPosition_ >= depth_)
00159     {
00160         return -1;
00161     }
00162     currentCycleStampsCol_[*currentPosition_] = cycleStamp;
00163     currentIdsCol_[*currentPosition_] = cycleId;
00164 
00165     result = *currentPosition_;
00166     // move the pointer
00167     *currentPosition_ = (*currentPosition_ + 1) % depth_;
00168     return result;
00169 }
00170 
00171 //    std::pair<long, long long> RollingMultiplexingDataManager::getLastCycleInfo()
00172 //    {
00173 //        std::pair<long, long long> tmp;
00174 //        mutex_->lock();
00175 //        if (*currentPosition_ == 0)
00176 //        {
00177 //            tmp.first = currentIdsCol_[depth_ - 1];
00178 //            tmp.second = currentCycleStampsCol_[depth_ - 1];
00179 //        }
00180 //        else
00181 //        {
00182 //            tmp.first = currentIdsCol_[*currentPosition_ - 1];
00183 //            tmp.second = currentCycleStampsCol_[*currentPosition_ - 1];
00184 //        }
00185 //        mutex_->unlock();
00186 //        return tmp;
00187 //    }
00188 
00189 } // fesa

Generated on 18 Jan 2013 for Fesa by  doxygen 1.6.1