static void record_delete(char *buf, long len, bool move_after) { struct change *change = buffer->cur_change; BUG_ON(!len); BUG_ON(!buf); if (change_merge == prev_change_merge) { if (change_merge == CHANGE_MERGE_DELETE) { xrenew(change->buf, change->del_count + len); memcpy(change->buf + change->del_count, buf, len); change->del_count += len; free(buf); return; } if (change_merge == CHANGE_MERGE_ERASE) { xrenew(buf, len + change->del_count); memcpy(buf + len, change->buf, change->del_count); change->del_count += len; free(change->buf); change->buf = buf; change->offset -= len; return; } } change = new_change(); change->offset = buffer_offset(); change->del_count = len; change->move_after = move_after; change->buf = buf; }
static void record_replace(char *deleted, long del_count, long ins_count) { struct change *change; BUG_ON(del_count && !deleted); BUG_ON(!del_count && deleted); BUG_ON(!del_count && !ins_count); change = new_change(); change->offset = buffer_offset(); change->ins_count = ins_count; change->del_count = del_count; change->buf = deleted; }
static void record_insert(long len) { struct change *change = buffer->cur_change; BUG_ON(!len); if (change_merge == prev_change_merge && change_merge == CHANGE_MERGE_INSERT) { BUG_ON(change->del_count); change->ins_count += len; return; } change = new_change(); change->offset = buffer_offset(); change->ins_count = len; }
bool WLivelinessPeriodicAssertion::ManualByRTPSParticipantLivelinessAssertion() { std::lock_guard<std::recursive_mutex> guard(*this->mp_WLP->getBuiltinProtocols()->mp_PDP->getMutex()); bool livelinessAsserted = false; for(std::vector<RTPSWriter*>::iterator wit=this->mp_WLP->m_livManRTPSParticipantWriters.begin(); wit!=this->mp_WLP->m_livManRTPSParticipantWriters.end();++wit) { if((*wit)->getLivelinessAsserted()) { livelinessAsserted = true; } (*wit)->setLivelinessAsserted(false); } if(livelinessAsserted) { auto writer = this->mp_WLP->getBuiltinWriter(); auto history = this->mp_WLP->getBuiltinWriterHistory(); std::lock_guard<std::recursive_timed_mutex> wguard(writer->getMutex()); CacheChange_t* change=writer->new_change([]() -> uint32_t {return BUILTIN_PARTICIPANT_DATA_MAX_SIZE;}, ALIVE); if(change!=nullptr) { change->instanceHandle = m_iHandle; #if __BIG_ENDIAN__ change->serializedPayload.encapsulation = (uint16_t)PL_CDR_BE; #else change->serializedPayload.encapsulation = (uint16_t)PL_CDR_LE; #endif memcpy(change->serializedPayload.data,m_guidP.value,12); for(uint8_t i =12;i<24;++i) change->serializedPayload.data[i] = 0; change->serializedPayload.data[15] = m_livelinessKind+1; change->serializedPayload.length = 12+4+4+4; for(auto ch = history->changesBegin(); ch!=history->changesEnd();++ch) { if((*ch)->instanceHandle == change->instanceHandle) { history->remove_change(*ch); } } history->add_change(change); } } return false; }
bool WLivelinessPeriodicAssertion::AutomaticLivelinessAssertion() { std::lock_guard<std::recursive_mutex> guard(*this->mp_WLP->getBuiltinProtocols()->mp_PDP->getMutex()); if(this->mp_WLP->m_livAutomaticWriters.size()>0) { auto writer = this->mp_WLP->getBuiltinWriter(); auto history = this->mp_WLP->getBuiltinWriterHistory(); std::lock_guard<std::recursive_timed_mutex> wguard(writer->getMutex()); CacheChange_t* change=writer->new_change([]() -> uint32_t {return BUILTIN_PARTICIPANT_DATA_MAX_SIZE;}, ALIVE,m_iHandle); if(change!=nullptr) { //change->instanceHandle = m_iHandle; #if __BIG_ENDIAN__ change->serializedPayload.encapsulation = (uint16_t)PL_CDR_BE; #else change->serializedPayload.encapsulation = (uint16_t)PL_CDR_LE; #endif memcpy(change->serializedPayload.data,m_guidP.value,12); for(uint8_t i =12;i<24;++i) change->serializedPayload.data[i] = 0; change->serializedPayload.data[15] = m_livelinessKind+1; change->serializedPayload.length = 12+4+4+4; if(history->getHistorySize() > 0) { for(std::vector<CacheChange_t*>::iterator chit = history->changesBegin(); chit!=history->changesEnd();++chit) { if((*chit)->instanceHandle == change->instanceHandle) { history->remove_change(*chit); break; } } } history->add_change(change); } } return true; }