Loading tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/ByteBufferReader.java +7 −14 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import java.nio.charset.StandardCharsets; public class ByteBufferReader { private ByteBuffer mByteBuffer; private int mPosition; public ByteBufferReader(ByteBuffer byteBuffer) { this.mByteBuffer = byteBuffer; Loading @@ -31,19 +30,19 @@ public class ByteBufferReader { } public int readByte() { return Byte.toUnsignedInt(mByteBuffer.get(nextGetIndex(1))); return Byte.toUnsignedInt(mByteBuffer.get()); } public int readShort() { return Short.toUnsignedInt(mByteBuffer.getShort(nextGetIndex(2))); return Short.toUnsignedInt(mByteBuffer.getShort()); } public int readInt() { return this.mByteBuffer.getInt(nextGetIndex(4)); return this.mByteBuffer.getInt(); } public long readLong() { return this.mByteBuffer.getLong(nextGetIndex(8)); return this.mByteBuffer.getLong(); } public String readString() { Loading @@ -53,7 +52,7 @@ public class ByteBufferReader { "String length exceeds maximum allowed size (1024 bytes): " + length); } byte[] bytes = new byte[length]; mByteBuffer.get(nextGetIndex(length), bytes, 0, length); mByteBuffer.get(bytes, 0, length); return new String(bytes, StandardCharsets.UTF_8); } Loading @@ -62,16 +61,10 @@ public class ByteBufferReader { } public void position(int newPosition) { mPosition = newPosition; mByteBuffer.position(newPosition); } public int position() { return mPosition; } private int nextGetIndex(int nb) { int p = mPosition; mPosition += nb; return p; return mByteBuffer.position(); } } tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/FlagTable.java +8 −8 Original line number Diff line number Diff line Loading @@ -24,12 +24,12 @@ import java.util.Objects; public class FlagTable { private Header mHeader; private ByteBuffer mBuffer; private ByteBufferReader mReader; public static FlagTable fromBytes(ByteBuffer bytes) { FlagTable flagTable = new FlagTable(); flagTable.mBuffer = bytes; flagTable.mHeader = Header.fromBytes(new ByteBufferReader(bytes)); flagTable.mReader = new ByteBufferReader(bytes); flagTable.mHeader = Header.fromBytes(flagTable.mReader); return flagTable; } Loading @@ -41,16 +41,16 @@ public class FlagTable { if (newPosition >= mHeader.mNodeOffset) { return null; } ByteBufferReader reader = new ByteBufferReader(mBuffer) ; reader.position(newPosition); int nodeIndex = reader.readInt(); mReader.position(newPosition); int nodeIndex = mReader.readInt(); if (nodeIndex < mHeader.mNodeOffset || nodeIndex >= mHeader.mFileSize) { return null; } while (nodeIndex != -1) { reader.position(nodeIndex); Node node = Node.fromBytes(reader); mReader.position(nodeIndex); Node node = Node.fromBytes(mReader); if (Objects.equals(flagName, node.mFlagName) && packageId == node.mPackageId) { return node; } Loading tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java +10 −12 Original line number Diff line number Diff line Loading @@ -30,12 +30,12 @@ public class PackageTable { private static final int NODE_SKIP_BYTES = 12; private Header mHeader; private ByteBuffer mBuffer; private ByteBufferReader mReader; public static PackageTable fromBytes(ByteBuffer bytes) { PackageTable packageTable = new PackageTable(); packageTable.mBuffer = bytes; packageTable.mHeader = Header.fromBytes(new ByteBufferReader(bytes)); packageTable.mReader = new ByteBufferReader(bytes); packageTable.mHeader = Header.fromBytes(packageTable.mReader); return packageTable; } Loading @@ -47,17 +47,16 @@ public class PackageTable { if (newPosition >= mHeader.mNodeOffset) { return null; } ByteBufferReader reader = new ByteBufferReader(mBuffer); reader.position(newPosition); int nodeIndex = reader.readInt(); mReader.position(newPosition); int nodeIndex = mReader.readInt(); if (nodeIndex < mHeader.mNodeOffset || nodeIndex >= mHeader.mFileSize) { return null; } while (nodeIndex != -1) { reader.position(nodeIndex); Node node = Node.fromBytes(reader, mHeader.mVersion); mReader.position(nodeIndex); Node node = Node.fromBytes(mReader, mHeader.mVersion); if (Objects.equals(packageName, node.mPackageName)) { return node; } Loading @@ -69,13 +68,12 @@ public class PackageTable { public List<String> getPackageList() { List<String> list = new ArrayList<>(mHeader.mNumPackages); ByteBufferReader reader = new ByteBufferReader(mBuffer); reader.position(mHeader.mNodeOffset); mReader.position(mHeader.mNodeOffset); int fingerprintBytes = mHeader.mVersion == 1 ? 0 : FINGERPRINT_BYTES; int skipBytes = fingerprintBytes + NODE_SKIP_BYTES; for (int i = 0; i < mHeader.mNumPackages; i++) { list.add(reader.readString()); reader.position(reader.position() + skipBytes); list.add(mReader.readString()); mReader.position(mReader.position() + skipBytes); } return list; } Loading tools/aconfig/aconfig_storage_file/tests/srcs/PackageTableTest.java +0 −44 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.concurrent.CyclicBarrier; @RunWith(JUnit4.class) public class PackageTableTest { Loading Loading @@ -144,46 +142,4 @@ public class PackageTableTest { assertTrue(packages.contains("com.android.aconfig.storage.test_2")); assertTrue(packages.contains("com.android.aconfig.storage.test_4")); } @Test public void testPackageTable_multithreadsRead() throws Exception { PackageTable packageTable = PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2)); int numberOfThreads = 3; Thread[] threads = new Thread[numberOfThreads]; final CyclicBarrier gate = new CyclicBarrier(numberOfThreads + 1); String[] expects = { "com.android.aconfig.storage.test_1", "com.android.aconfig.storage.test_2", "com.android.aconfig.storage.test_4" }; for (int i = 0; i < numberOfThreads; i++) { final String packageName = expects[i]; threads[i] = new Thread() { @Override public void run() { try { gate.await(); } catch (Exception e) { } for (int j = 0; j < 10; j++) { if (!Objects.equals( packageName, packageTable.get(packageName).getPackageName())) { throw new RuntimeException(); } } } }; threads[i].start(); } gate.await(); for (int i = 0; i < numberOfThreads; i++) { threads[i].join(); } } } Loading
tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/ByteBufferReader.java +7 −14 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import java.nio.charset.StandardCharsets; public class ByteBufferReader { private ByteBuffer mByteBuffer; private int mPosition; public ByteBufferReader(ByteBuffer byteBuffer) { this.mByteBuffer = byteBuffer; Loading @@ -31,19 +30,19 @@ public class ByteBufferReader { } public int readByte() { return Byte.toUnsignedInt(mByteBuffer.get(nextGetIndex(1))); return Byte.toUnsignedInt(mByteBuffer.get()); } public int readShort() { return Short.toUnsignedInt(mByteBuffer.getShort(nextGetIndex(2))); return Short.toUnsignedInt(mByteBuffer.getShort()); } public int readInt() { return this.mByteBuffer.getInt(nextGetIndex(4)); return this.mByteBuffer.getInt(); } public long readLong() { return this.mByteBuffer.getLong(nextGetIndex(8)); return this.mByteBuffer.getLong(); } public String readString() { Loading @@ -53,7 +52,7 @@ public class ByteBufferReader { "String length exceeds maximum allowed size (1024 bytes): " + length); } byte[] bytes = new byte[length]; mByteBuffer.get(nextGetIndex(length), bytes, 0, length); mByteBuffer.get(bytes, 0, length); return new String(bytes, StandardCharsets.UTF_8); } Loading @@ -62,16 +61,10 @@ public class ByteBufferReader { } public void position(int newPosition) { mPosition = newPosition; mByteBuffer.position(newPosition); } public int position() { return mPosition; } private int nextGetIndex(int nb) { int p = mPosition; mPosition += nb; return p; return mByteBuffer.position(); } }
tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/FlagTable.java +8 −8 Original line number Diff line number Diff line Loading @@ -24,12 +24,12 @@ import java.util.Objects; public class FlagTable { private Header mHeader; private ByteBuffer mBuffer; private ByteBufferReader mReader; public static FlagTable fromBytes(ByteBuffer bytes) { FlagTable flagTable = new FlagTable(); flagTable.mBuffer = bytes; flagTable.mHeader = Header.fromBytes(new ByteBufferReader(bytes)); flagTable.mReader = new ByteBufferReader(bytes); flagTable.mHeader = Header.fromBytes(flagTable.mReader); return flagTable; } Loading @@ -41,16 +41,16 @@ public class FlagTable { if (newPosition >= mHeader.mNodeOffset) { return null; } ByteBufferReader reader = new ByteBufferReader(mBuffer) ; reader.position(newPosition); int nodeIndex = reader.readInt(); mReader.position(newPosition); int nodeIndex = mReader.readInt(); if (nodeIndex < mHeader.mNodeOffset || nodeIndex >= mHeader.mFileSize) { return null; } while (nodeIndex != -1) { reader.position(nodeIndex); Node node = Node.fromBytes(reader); mReader.position(nodeIndex); Node node = Node.fromBytes(mReader); if (Objects.equals(flagName, node.mFlagName) && packageId == node.mPackageId) { return node; } Loading
tools/aconfig/aconfig_storage_file/srcs/android/aconfig/storage/PackageTable.java +10 −12 Original line number Diff line number Diff line Loading @@ -30,12 +30,12 @@ public class PackageTable { private static final int NODE_SKIP_BYTES = 12; private Header mHeader; private ByteBuffer mBuffer; private ByteBufferReader mReader; public static PackageTable fromBytes(ByteBuffer bytes) { PackageTable packageTable = new PackageTable(); packageTable.mBuffer = bytes; packageTable.mHeader = Header.fromBytes(new ByteBufferReader(bytes)); packageTable.mReader = new ByteBufferReader(bytes); packageTable.mHeader = Header.fromBytes(packageTable.mReader); return packageTable; } Loading @@ -47,17 +47,16 @@ public class PackageTable { if (newPosition >= mHeader.mNodeOffset) { return null; } ByteBufferReader reader = new ByteBufferReader(mBuffer); reader.position(newPosition); int nodeIndex = reader.readInt(); mReader.position(newPosition); int nodeIndex = mReader.readInt(); if (nodeIndex < mHeader.mNodeOffset || nodeIndex >= mHeader.mFileSize) { return null; } while (nodeIndex != -1) { reader.position(nodeIndex); Node node = Node.fromBytes(reader, mHeader.mVersion); mReader.position(nodeIndex); Node node = Node.fromBytes(mReader, mHeader.mVersion); if (Objects.equals(packageName, node.mPackageName)) { return node; } Loading @@ -69,13 +68,12 @@ public class PackageTable { public List<String> getPackageList() { List<String> list = new ArrayList<>(mHeader.mNumPackages); ByteBufferReader reader = new ByteBufferReader(mBuffer); reader.position(mHeader.mNodeOffset); mReader.position(mHeader.mNodeOffset); int fingerprintBytes = mHeader.mVersion == 1 ? 0 : FINGERPRINT_BYTES; int skipBytes = fingerprintBytes + NODE_SKIP_BYTES; for (int i = 0; i < mHeader.mNumPackages; i++) { list.add(reader.readString()); reader.position(reader.position() + skipBytes); list.add(mReader.readString()); mReader.position(mReader.position() + skipBytes); } return list; } Loading
tools/aconfig/aconfig_storage_file/tests/srcs/PackageTableTest.java +0 −44 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.concurrent.CyclicBarrier; @RunWith(JUnit4.class) public class PackageTableTest { Loading Loading @@ -144,46 +142,4 @@ public class PackageTableTest { assertTrue(packages.contains("com.android.aconfig.storage.test_2")); assertTrue(packages.contains("com.android.aconfig.storage.test_4")); } @Test public void testPackageTable_multithreadsRead() throws Exception { PackageTable packageTable = PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2)); int numberOfThreads = 3; Thread[] threads = new Thread[numberOfThreads]; final CyclicBarrier gate = new CyclicBarrier(numberOfThreads + 1); String[] expects = { "com.android.aconfig.storage.test_1", "com.android.aconfig.storage.test_2", "com.android.aconfig.storage.test_4" }; for (int i = 0; i < numberOfThreads; i++) { final String packageName = expects[i]; threads[i] = new Thread() { @Override public void run() { try { gate.await(); } catch (Exception e) { } for (int j = 0; j < 10; j++) { if (!Objects.equals( packageName, packageTable.get(packageName).getPackageName())) { throw new RuntimeException(); } } } }; threads[i].start(); } gate.await(); for (int i = 0; i < numberOfThreads; i++) { threads[i].join(); } } }