MCPcopy Create free account
hub / github.com/alibaba/CicadaPlayer / writeAt

Method writeAt

framework/data_source/cache/sliceBufferSource.cpp:55–117  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

53// TODO: use writeAt
54
55 int sliceBuffer::writeAt(const uint8_t *buffer, int size, uint64_t offset)
56 {
57// AF_LOGD("write size is %d write pos is %"
58// PRIu64
59// "\n", size, offset);
60 int curNum = static_cast<int>(offset / mSliceSize);
61 uint64_t startPos = offset % mSliceSize;
62
63 if (startPos > 0) {
64 curNum++;
65 startPos = mSliceSize * curNum - offset;
66 }
67
68// AF_LOGD("write %d slice skip %d data\n", curNum, startPos);
69// AF_LOGD("mSliceCount is %" PRIu32"\n", mSliceCount);
70 bool isLastSlice = curNum == mSliceCount - 1;
71
72 if (size - startPos < mSliceSize && !isLastSlice) {
73 return 0;
74 }
75
76 int beforePos = static_cast<int>(startPos);
77 size -= startPos;
78
79 for (int i = curNum; i < mSliceCount; ++i) {
80 ADD_LOCK;
81
82 if (mSlices[i] == nullptr) {
83 if (mManager) {
84 mSlices[i] = mManager->getSlice(mSliceSize, i * mSliceSize, *this);
85 } else {
86 mSlices[i] = new slice(mSliceSize, i * mSliceSize);
87 }
88
89 if (nullptr != mSlices[i]) {
90 mSliceCountGot++;
91 }
92 }
93
94 isLastSlice = curNum == mSliceCount - 1;
95 int writeSize = (int) MIN(mSliceSize, size);
96
97 if (size - startPos < mSliceSize && !isLastSlice) {
98 break;
99 }
100
101 if ((nullptr != mSlices[i])
102 && (0 < mSlices[i]->getRemainSize())) {
103 writeSize = mSlices[i]->write(buffer + startPos, writeSize);
104 } else {
105 AF_LOGI("slice %d is filed\n", i);
106 }
107
108 startPos += writeSize;
109 size -= writeSize;
110
111 if (size <= 0) {
112 break;

Callers 1

testSliceBufferFunction · 0.80

Calls 3

getSliceMethod · 0.80
getRemainSizeMethod · 0.80
writeMethod · 0.45

Tested by 1

testSliceBufferFunction · 0.64