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

Commit 67530d65 authored by Hugo Benichi's avatar Hugo Benichi
Browse files

Add volatile qualifier to boolean variable

DHCP receive thread was spinning on a boolean variable to know when to
stop. That variable had no volatile qualifier, potentially preventing
the thread from stopping at all. Without a volatile qualifier, the reads
and writes in halt() could be reordered in such a way that the running
thread is interrupted before mStopped is set t true. Also, the optimizer
could decide to hoist mStopped in a register inside the running thread,
preventing the loop from exiting.

Change-Id: I5b30c1247808114f0e5b46e230978ee7ea18ab8e
parent 6b34b310
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -336,17 +336,17 @@ public class DhcpClient extends StateMachine {
    class ReceiveThread extends Thread {

        private final byte[] mPacket = new byte[DhcpPacket.MAX_LENGTH];
        private boolean stopped = false;
        private volatile boolean mStopped = false;

        public void halt() {
            stopped = true;
            mStopped = true;
            closeSockets();  // Interrupts the read() call the thread is blocked in.
        }

        @Override
        public void run() {
            if (DBG) Log.d(TAG, "Receive thread started");
            while (!stopped) {
            while (!mStopped) {
                int length = 0;  // Or compiler can't tell it's initialized if a parse error occurs.
                try {
                    length = Os.read(mPacketSock, mPacket, 0, mPacket.length);
@@ -355,7 +355,7 @@ public class DhcpClient extends StateMachine {
                    if (DBG) Log.d(TAG, "Received packet: " + packet);
                    sendMessage(CMD_RECEIVED_PACKET, packet);
                } catch (IOException|ErrnoException e) {
                    if (!stopped) {
                    if (!mStopped) {
                        Log.e(TAG, "Read error", e);
                    }
                    DhcpClientEvent.logEvent(IpConnectivityEvent.IPCE_DHCP_RECV_ERROR,