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