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

Commit ff0ff67e authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by Android (Google) Code Review
Browse files

Merge changes from topic 'blockOnProcessingUnsolicited' into nyc-dev

* changes:
  Tethering: interface updates can be handled again
  NativeDaemonConnector: add waitForCallbacks method
parents d212cfa1 636c07d9
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.LinkedList;

@@ -343,6 +344,30 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo
        rawBuilder.append('\0');
    }

    /**
     * Method that waits until all asychronous notifications sent by the native daemon have
     * been processed. This method must not be called on the notification thread or an
     * exception will be thrown.
     */
    public void waitForCallbacks() {
        if (Thread.currentThread() == mLooper.getThread()) {
            throw new IllegalStateException("Must not call this method on callback thread");
        }

        final CountDownLatch latch = new CountDownLatch(1);
        mCallbackHandler.post(new Runnable() {
            @Override
            public void run() {
                latch.countDown();
            }
        });
        try {
            latch.await();
        } catch (InterruptedException e) {
            Slog.wtf(TAG, "Interrupted while waiting for unsolicited response handling", e);
        }
    }

    /**
     * Issue the given command to the native daemon and return a single expected
     * response.
+5 −0
Original line number Diff line number Diff line
@@ -1507,6 +1507,11 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }

        // Ensure that before we return from this command, any asynchronous
        // notifications generated before the command completed have been
        // processed by all NetworkManagementEventObservers.
        mConnector.waitForCallbacks();
    }

    @Override
+0 −3
Original line number Diff line number Diff line
@@ -273,9 +273,6 @@ public class Tethering extends BaseNetworkObserver {
                    // ignore usb0 down after enabling RNDIS
                    // we will handle disconnect in interfaceRemoved instead
                    if (VDBG) Log.d(TAG, "ignore interface down for " + iface);
                } else if (isWifi(iface)) {
                    // handle disconnect in interfaceRemoved
                    if (VDBG) Log.d(TAG, "ignore interface down for " + iface);
                } else if (sm != null) {
                    sm.sendMessage(TetherInterfaceSM.CMD_INTERFACE_DOWN);
                    mIfaces.remove(iface);