174fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart/*
274fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * Copyright (C) 2016 The Android Open Source Project
374fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart *
474fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * Licensed under the Apache License, Version 2.0 (the "License");
574fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * you may not use this file except in compliance with the License.
674fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * You may obtain a copy of the License at
774fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart *
874fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart *      http://www.apache.org/licenses/LICENSE-2.0
974fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart *
1074fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * Unless required by applicable law or agreed to in writing, software
1174fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * distributed under the License is distributed on an "AS IS" BASIS,
1274fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1374fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * See the License for the specific language governing permissions and
1474fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * limitations under the License.
1574fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart */
1674fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
1774fc3bfc009f736d058797e9ddda500d114e3135Paul Stewartpackage android.net;
1874fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
1974fc3bfc009f736d058797e9ddda500d114e3135Paul Stewartimport android.os.HandlerThread;
2074fc3bfc009f736d058797e9ddda500d114e3135Paul Stewartimport android.os.Looper;
2174fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
2274fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart/**
2374fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * Shared singleton connectivity thread for the system.  This is a thread for
2474fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * connectivity operations such as AsyncChannel connections to system services.
2574fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * Various connectivity manager objects can use this singleton as a common
2674fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * resource for their handlers instead of creating separate threads of their own.
2774fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart * @hide
2874fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart */
2974fc3bfc009f736d058797e9ddda500d114e3135Paul Stewartpublic final class ConnectivityThread extends HandlerThread {
30c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi
31c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    // A class implementing the lazy holder idiom: the unique static instance
32c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    // of ConnectivityThread is instantiated in a thread-safe way (guaranteed by
33c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    // the language specs) the first time that Singleton is referenced in get()
34c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    // or getInstanceLooper().
35c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    private static class Singleton {
36c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi        private static final ConnectivityThread INSTANCE = createInstance();
37c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    }
3874fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
3974fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    private ConnectivityThread() {
4074fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart        super("ConnectivityThread");
4174fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    }
4274fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
43c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi    private static ConnectivityThread createInstance() {
44c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi        ConnectivityThread t = new ConnectivityThread();
45c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi        t.start();
46c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi        return t;
4774fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    }
4874fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
4974fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    public static ConnectivityThread get() {
50c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi        return Singleton.INSTANCE;
5174fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    }
5274fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart
5374fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    public static Looper getInstanceLooper() {
54c4fe5d373caa9f53686e4d58e61394dd40558957Hugo Benichi        return Singleton.INSTANCE.getLooper();
5574fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart    }
5674fc3bfc009f736d058797e9ddda500d114e3135Paul Stewart}
57