LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter( U8* address, LLSegment& segment) { LLMemType m1(LLMemType::MTYPE_IO_BUFFER); segment_iterator_t rv = mSegments.begin(); segment_iterator_t end = mSegments.end(); if(!address) { if(rv != end) { segment = (*rv); } } else { // we have an address - find the segment it is in. for( ; rv != end; ++rv) { if((address >= (*rv).data()) && (address < ((*rv).data() + (*rv).size()))) { if((++address) < ((*rv).data() + (*rv).size())) { // it's in this segment - construct an appropriate // sub-segment. segment = LLSegment( (*rv).getChannel(), address, (*rv).size() - (address - (*rv).data())); } else { ++rv; if(rv != end) { segment = (*rv); } } break; } } } if(rv == end) { segment = LLSegment(); } return rv; }
// virtual bool LLHeapBuffer::createSegment( S32 channel, S32 size, LLSegment& segment) { // get actual size of the segment. S32 actual_size = llmin(size, (mSize - S32(mNextFree - mBuffer))); // bail if we cannot build a valid segment if(actual_size <= 0) { return false; } // Yay, we're done. segment = LLSegment(channel, mNextFree, actual_size); mNextFree += actual_size; return true; }