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

Commit ccf29801 authored by Rambo Wang's avatar Rambo Wang
Browse files

CellularDataService: mCallbackMap is not thread safe

The HashMap object mCallbackMap in CellularDataService is a shared
resource between DataService's handler thread and CellularDataService's
handler thread. The update operations (put and remove) has
synchronization issue.

This CL fixes the issue by letting CellularDataService shares the
looper/handler thread of DataService (but keeping its own handler). And
thus all the operations of mCallbackMap are handled serializally in
DataService's handler thread.

One alternative solution is to  move all operations of the mCallbackMap
into
CellularDataService's handler thread to make it thread-safe. But it's
difficult for close() method which need to clear mCallbackMap and
shutdown the handler thread.

The other alternative solution is to replace HashMap with
ConcurrentHashMap
for mCallbackMap. This do make mCallbackMap thread-safe but do not
change the fact that it is still a shared resource between two threads.

Bug: 151103522
Test: atest FrameworksTelephonyTests
Change-Id: I7f5a507c2a79c7c77c5c2d7d3be147af80dc9f69
parent 774efe07
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -234,6 +234,9 @@ public abstract class NetworkService extends Service {
     * this method to facilitate the creation of {@link NetworkServiceProvider} instances. The system
     * will call this method after binding the network service for each active SIM slot id.
     *
     * This methead is guaranteed to be invoked in {@link NetworkService}'s internal handler thread
     * whose looper can be retrieved with {@link Looper.myLooper()} when override this method.
     *
     * @param slotIndex SIM slot id the network service associated with.
     * @return Network service object. Null if failed to create the provider (e.g. invalid slot
     * index)
+3 −0
Original line number Diff line number Diff line
@@ -458,6 +458,9 @@ public abstract class DataService extends Service {
     * this method to facilitate the creation of {@link DataServiceProvider} instances. The system
     * will call this method after binding the data service for each active SIM slot id.
     *
     * This methead is guaranteed to be invoked in {@link DataService}'s internal handler thread
     * whose looper can be retrieved with {@link Looper.myLooper()} when override this method.
     *
     * @param slotIndex SIM slot id the data service associated with.
     * @return Data service object. Null if failed to create the provider (e.g. invalid slot index)
     */