Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a3d41ab authored by Zhi Dou's avatar Zhi Dou Committed by Gerrit Code Review
Browse files

Merge "Revert "new buffer reader for buffer read"" into main

parents 0f9295bd d93145e5
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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() {
@@ -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);
    }

@@ -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();
    }
}
+8 −8
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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;
            }
+10 −12
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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;
            }
@@ -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;
    }
+0 −44
Original line number Diff line number Diff line
@@ -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 {
@@ -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();
        }
    }
}