diff options
| author | Robert Greenwalt <rgreenwalt@google.com> | 2010-09-23 09:40:20 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-09-23 09:40:20 -0700 |
| commit | 35dcaece115e2f8e227c2e579d38c42b65ead85e (patch) | |
| tree | f82fc685865c90dd152858db15b5e08c4c0ba18a /services/java/com/android/server/NetworkManagementService.java | |
| parent | 27a835f8d8faf962d978cf7e1e3b562fa0715d60 (diff) | |
| parent | 9c38a6dc13ba55fccb9c66f347307a1b4ae68105 (diff) | |
am 9c38a6dc: am e87ebb08: Merge "Cleanup Netd to prevent getting hung." into gingerbread
Merge commit '9c38a6dc13ba55fccb9c66f347307a1b4ae68105'
* commit '9c38a6dc13ba55fccb9c66f347307a1b4ae68105':
Cleanup Netd to prevent getting hung.
Diffstat (limited to 'services/java/com/android/server/NetworkManagementService.java')
| -rw-r--r-- | services/java/com/android/server/NetworkManagementService.java | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index de459ab9a419..05abd99025b6 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -47,6 +47,7 @@ import java.lang.IllegalStateException; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.concurrent.CountDownLatch; /** * @hide @@ -54,7 +55,7 @@ import java.net.UnknownHostException; class NetworkManagementService extends INetworkManagementService.Stub { private static final String TAG = "NetworkManagmentService"; - + private static final boolean DBG = true; private static final String NETD_TAG = "NetdConnector"; class NetdResponseCode { @@ -86,6 +87,9 @@ class NetworkManagementService extends INetworkManagementService.Stub { */ private NativeDaemonConnector mConnector; + private Thread mThread; + private final CountDownLatch mConnectedSignal = new CountDownLatch(1); + private ArrayList<INetworkManagementEventObserver> mObservers; /** @@ -93,9 +97,8 @@ class NetworkManagementService extends INetworkManagementService.Stub { * * @param context Binder context for this service */ - public NetworkManagementService(Context context) { + private NetworkManagementService(Context context) { mContext = context; - mObservers = new ArrayList<INetworkManagementEventObserver>(); if ("simulator".equals(SystemProperties.get("ro.product.device"))) { @@ -104,8 +107,17 @@ class NetworkManagementService extends INetworkManagementService.Stub { mConnector = new NativeDaemonConnector( new NetdCallbackReceiver(), "netd", 10, NETD_TAG); - Thread thread = new Thread(mConnector, NETD_TAG); - thread.start(); + mThread = new Thread(mConnector, NETD_TAG); + } + + public static NetworkManagementService create(Context context) throws InterruptedException { + NetworkManagementService service = new NetworkManagementService(context); + if (DBG) Slog.d(TAG, "Creating NetworkManagementService"); + service.mThread.start(); + if (DBG) Slog.d(TAG, "Awaiting socket connection"); + service.mConnectedSignal.await(); + if (DBG) Slog.d(TAG, "Connected"); + return service; } public void registerObserver(INetworkManagementEventObserver obs) { @@ -157,6 +169,14 @@ class NetworkManagementService extends INetworkManagementService.Stub { } } + /** + * Let us know the daemon is connected + */ + protected void onConnected() { + if (DBG) Slog.d(TAG, "onConnected"); + mConnectedSignal.countDown(); + } + // // Netd Callback handling @@ -164,6 +184,7 @@ class NetworkManagementService extends INetworkManagementService.Stub { class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks { public void onDaemonConnected() { + NetworkManagementService.this.onConnected(); new Thread() { public void run() { } |
