Add secondary counter in place of tls_nodelete flag

The tls_nodelete state should apply to load_group not
isolated soinfo. This actually also means that multiple
soinfos may have tls_counter on their dso_handles.

This change replaces TLS_NODELETE flag with secondary counter.
Note that access to the secondary counter (located inside soinfo)
is pretty expensive because it requires soinfo lookup by dso_handle
whereas dso_handle counter is much faster. This is why it is updated
only when dso_handle counter starts or hits 0.

Bug: http://b/80278285
Test: bionic-unit-tests --gtest_filter=dl*
Change-Id: I535583f6714e45fa2a7eaf7bb3126da20ee7cba9
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 0a931c6..12d3a78 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1937,7 +1937,7 @@
     soinfo* si = find_containing_library(dso_handle);
     if (si != nullptr) {
       ProtectedDataGuard guard;
-      si->set_tls_nodelete();
+      si->increment_ref_count();
     } else {
       async_safe_fatal(
           "increment_dso_handle_reference_counter: Couldn't find soinfo by dso_handle=%p",
@@ -1960,11 +1960,7 @@
     soinfo* si = find_containing_library(dso_handle);
     if (si != nullptr) {
       ProtectedDataGuard guard;
-      si->unset_tls_nodelete();
-      if (si->get_ref_count() == 0) {
-        // Perform deferred unload - note that soinfo_unload_impl does not decrement ref_count
-        soinfo_unload_impl(si);
-      }
+      soinfo_unload(si);
     } else {
       async_safe_fatal(
           "decrement_dso_handle_reference_counter: Couldn't find soinfo by dso_handle=%p",