mirror of
https://github.com/DrKLO/Telegram.git
synced 2025-03-15 20:08:00 +01:00
improvements for BufferStorage
This commit is contained in:
parent
8ecb9e97c9
commit
a2089edbf8
1 changed files with 55 additions and 81 deletions
|
@ -9,15 +9,19 @@
|
|||
package org.telegram.messenger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
public class BuffersStorage {
|
||||
public static BuffersStorage Instance = new BuffersStorage();
|
||||
|
||||
private final ArrayList<ByteBufferDesc> freeBuffers128;
|
||||
private final ArrayList<ByteBufferDesc> freeBuffers1024;
|
||||
private final ArrayList<ByteBufferDesc> freeBuffers4096;
|
||||
private final ArrayList<ByteBufferDesc> freeBuffers16384;
|
||||
private final ArrayList<ByteBufferDesc> freeBuffers32768;
|
||||
private List<ByteBufferDesc> freeBuffers128;
|
||||
private List<ByteBufferDesc> freeBuffers1024;
|
||||
private List<ByteBufferDesc> freeBuffers4096;
|
||||
private List<ByteBufferDesc> freeBuffers16384;
|
||||
private List<ByteBufferDesc> freeBuffers32768;
|
||||
|
||||
private ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
public BuffersStorage() {
|
||||
freeBuffers128 = new ArrayList<ByteBufferDesc>();
|
||||
|
@ -26,85 +30,34 @@ public class BuffersStorage {
|
|||
freeBuffers16384 = new ArrayList<ByteBufferDesc>();
|
||||
freeBuffers32768 = new ArrayList<ByteBufferDesc>();
|
||||
|
||||
for (int a = 0; a < 5; a++) {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
freeBuffers128.add(new ByteBufferDesc(128));
|
||||
}
|
||||
for (int a = 0; a < 5; a++) {
|
||||
freeBuffers1024.add(new ByteBufferDesc(1024 + 200));
|
||||
}
|
||||
for (int a = 0; a < 2; a++) {
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
freeBuffers4096.add(new ByteBufferDesc(4096 + 200));
|
||||
}
|
||||
for (int a = 0; a < 2; a++) {
|
||||
freeBuffers16384.add(new ByteBufferDesc(16384 + 200));
|
||||
}
|
||||
for (int a = 0; a < 2; a++) {
|
||||
freeBuffers32768.add(new ByteBufferDesc(40000));
|
||||
}
|
||||
}
|
||||
|
||||
public ByteBufferDesc getFreeBuffer(int size) {
|
||||
ByteBufferDesc buffer = null;
|
||||
if (size <= 128) {
|
||||
synchronized (freeBuffers128) {
|
||||
if (freeBuffers128.size() > 0) {
|
||||
buffer = freeBuffers128.get(0);
|
||||
freeBuffers128.remove(0);
|
||||
}
|
||||
}
|
||||
if (buffer == null) {
|
||||
buffer = new ByteBufferDesc(128);
|
||||
FileLog.e("tmessages", "create new 128 buffer");
|
||||
}
|
||||
return getFreeBuffer(freeBuffers128, 128);
|
||||
} else if (size <= 1024 + 200) {
|
||||
synchronized (freeBuffers1024) {
|
||||
if (freeBuffers1024.size() > 0) {
|
||||
buffer = freeBuffers1024.get(0);
|
||||
freeBuffers1024.remove(0);
|
||||
}
|
||||
}
|
||||
if (buffer == null) {
|
||||
buffer = new ByteBufferDesc(1024 + 200);
|
||||
FileLog.e("tmessages", "create new 1024 buffer");
|
||||
}
|
||||
return getFreeBuffer(freeBuffers1024, 1024, 200);
|
||||
} else if (size <= 4096 + 200) {
|
||||
synchronized (freeBuffers4096) {
|
||||
if (freeBuffers4096.size() > 0) {
|
||||
buffer = freeBuffers4096.get(0);
|
||||
freeBuffers4096.remove(0);
|
||||
}
|
||||
}
|
||||
if (buffer == null) {
|
||||
buffer = new ByteBufferDesc(4096 + 200);
|
||||
FileLog.e("tmessages", "create new 4096 buffer");
|
||||
}
|
||||
return getFreeBuffer(freeBuffers4096, 4096, 200);
|
||||
} else if (size <= 16384 + 200) {
|
||||
synchronized (freeBuffers16384) {
|
||||
if (freeBuffers16384.size() > 0) {
|
||||
buffer = freeBuffers16384.get(0);
|
||||
freeBuffers16384.remove(0);
|
||||
}
|
||||
}
|
||||
if (buffer == null) {
|
||||
buffer = new ByteBufferDesc(16384 + 200);
|
||||
FileLog.e("tmessages", "create new 16384 buffer");
|
||||
}
|
||||
return getFreeBuffer(freeBuffers16384, 16384, 200);
|
||||
} else if (size <= 40000) {
|
||||
synchronized (freeBuffers32768) {
|
||||
if (freeBuffers32768.size() > 0) {
|
||||
buffer = freeBuffers32768.get(0);
|
||||
freeBuffers32768.remove(0);
|
||||
}
|
||||
}
|
||||
if (buffer == null) {
|
||||
buffer = new ByteBufferDesc(40000);
|
||||
FileLog.e("tmessages", "create new 40000 buffer");
|
||||
}
|
||||
return getFreeBuffer(freeBuffers32768, 40000);
|
||||
} else {
|
||||
buffer = new ByteBufferDesc(size);
|
||||
ByteBufferDesc buffer = new ByteBufferDesc(size);
|
||||
buffer.buffer.limit(size).rewind();
|
||||
return buffer;
|
||||
}
|
||||
buffer.buffer.limit(size).rewind();
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public void reuseFreeBuffer(ByteBufferDesc buffer) {
|
||||
|
@ -112,25 +65,46 @@ public class BuffersStorage {
|
|||
return;
|
||||
}
|
||||
if (buffer.buffer.capacity() == 128) {
|
||||
synchronized (freeBuffers128) {
|
||||
freeBuffers128.add(buffer);
|
||||
}
|
||||
reuseFreeBuffer(freeBuffers128, buffer);
|
||||
} else if (buffer.buffer.capacity() == 1024 + 200) {
|
||||
synchronized (freeBuffers1024) {
|
||||
freeBuffers1024.add(buffer);
|
||||
}
|
||||
reuseFreeBuffer(freeBuffers1024, buffer);
|
||||
} else if (buffer.buffer.capacity() == 4096 + 200) {
|
||||
synchronized (freeBuffers4096) {
|
||||
freeBuffers4096.add(buffer);
|
||||
}
|
||||
reuseFreeBuffer(freeBuffers4096, buffer);
|
||||
} else if (buffer.buffer.capacity() == 16384 + 200) {
|
||||
synchronized (freeBuffers16384) {
|
||||
freeBuffers16384.add(buffer);
|
||||
}
|
||||
reuseFreeBuffer(freeBuffers16384, buffer);
|
||||
} else if (buffer.buffer.capacity() == 40000) {
|
||||
synchronized (freeBuffers32768) {
|
||||
freeBuffers32768.add(buffer);
|
||||
reuseFreeBuffer(freeBuffers32768, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
private ByteBufferDesc getFreeBuffer(List<ByteBufferDesc> freeBuffersOfSize, int size) {
|
||||
return getFreeBuffer(freeBuffersOfSize, size, 0);
|
||||
}
|
||||
|
||||
private ByteBufferDesc getFreeBuffer(List<ByteBufferDesc> freeBuffersOfSize, int size, int overhead) {
|
||||
lock.lock();
|
||||
try {
|
||||
ByteBufferDesc buffer;
|
||||
if (freeBuffersOfSize.size() > 0) {
|
||||
buffer = freeBuffersOfSize.get(0);
|
||||
freeBuffersOfSize.remove(0);
|
||||
} else {
|
||||
buffer = new ByteBufferDesc(size + overhead);
|
||||
FileLog.e("tmessages", "create new " + size + "buffer");
|
||||
}
|
||||
buffer.buffer.limit(size).rewind();
|
||||
return buffer;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
private void reuseFreeBuffer(List<ByteBufferDesc> freeBuffersOfSize, ByteBufferDesc buffer) {
|
||||
lock.lock();
|
||||
try {
|
||||
freeBuffersOfSize.add(buffer);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue