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

Commit b3a3c09b authored by William Escande's avatar William Escande Committed by Gerrit Code Review
Browse files

Merge "Reduce memory footprint by releasing parsed config"

parents a7e4d670 e788a008
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -1813,7 +1813,6 @@ static void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event,
}

static void btif_dm_update_allowlisted_media_players() {
  uint8_t num_wlplayers = 0;
  uint8_t i = 0, buf_len = 0;
  bt_property_t wlplayers_prop;
  list_t* wl_players = list_new(nullptr);
@@ -1824,19 +1823,12 @@ static void btif_dm_update_allowlisted_media_players() {
  LOG_DEBUG("btif_dm_update_allowlisted_media_players");

  wlplayers_prop.len = 0;
  if (!interop_get_allowlisted_media_players_list(&wl_players)) {
  if (!interop_get_allowlisted_media_players_list(wl_players)) {
    LOG_DEBUG("Allowlisted media players not found");
    list_free(wl_players);
    return;
  }
  num_wlplayers = list_length(wl_players);
  LOG_DEBUG("%d - WL media players found", num_wlplayers);

  /* Now send the callback */
  if (num_wlplayers <= 0) {
    list_free(wl_players);
    return;
  }
  /*find the total number of bytes and allocate memory */
  for (list_node_t* node = list_begin(wl_players); node != list_end(wl_players);
       node = list_next(node)) {
+1 −1
Original line number Diff line number Diff line
@@ -392,7 +392,7 @@ bool interop_match_addr_get_max_lat(const interop_feature_t feature,
// This API is used for name based lookups for allowlisted media players.
// If allowlisted media players list found it will assign the media players list
// pointer to the argument passed and  return true else return false.
bool interop_get_allowlisted_media_players_list(list_t** p_bl_devices);
bool interop_get_allowlisted_media_players_list(list_t* p_bl_devices);

// Return feature's enum value according to feature'name.
int interop_feature_name_to_feature_id(const char* feature_name);
+1 −3
Original line number Diff line number Diff line
@@ -83,6 +83,4 @@ bool interop_database_match_addr_get_lmp_ver(const interop_feature_t feature,
                                             const RawAddress* addr,
                                             uint8_t* lmp_ver,
                                             uint16_t* lmp_sub_ver);
bool interop_get_allowlisted_media_players_list(list_t** p_bl_devices);
bool interop_database_get_allowlisted_media_players_list(
    const interop_feature_t feature, list_t** p_bl_devices);
bool interop_get_allowlisted_media_players_list(list_t* p_bl_devices);
+38 −16
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ static const char* INTEROP_STATIC_FILE_PATH =
    return #const;

static list_t* interop_list = NULL;
static list_t* media_player_list = NULL;

bool interop_is_initialized = false;
// protects operations on |interop_list|
@@ -85,7 +86,7 @@ pthread_mutex_t interop_list_lock;

// protects operations on |config|
static pthread_mutex_t file_lock;
static std::unique_ptr<config_t> config_static;
static std::unique_ptr<const config_t> config_static;
static std::unique_ptr<config_t> config_dynamic;
static const char* UNKNOWN_INTEROP_FEATURE = "UNKNOWN";
// map from feature name to feature id
@@ -184,6 +185,8 @@ static void interop_config_cleanup(void);
// This function is used to initialize the interop list and load the entries
// from file
static void load_config();
static void interop_database_save_allowlisted_media_players_list(
    const config_t* config);
static void interop_database_add_(interop_db_entry_t* db_entry, bool persist);
static bool interop_database_remove_(interop_db_entry_t* entry);
static bool interop_database_match(interop_db_entry_t* entry,
@@ -206,13 +209,6 @@ bool interop_match_name(const interop_feature_t feature, const char* name) {
  return (interop_database_match_name(feature, name));
}

bool interop_get_allowlisted_media_players_list(list_t** p_bl_devices) {
  interop_feature_t feature = INTEROP_BROWSE_PLAYER_ALLOW_LIST;

  return (interop_database_get_allowlisted_media_players_list(feature,
                                                              p_bl_devices));
}

bool interop_match_addr_or_name(const interop_feature_t feature,
                                const RawAddress* addr,
                                bt_status_t (*get_remote_device_property)(
@@ -300,6 +296,8 @@ static future_t* interop_clean_up(void) {
  pthread_mutex_lock(&interop_list_lock);
  list_free(interop_list);
  interop_list = NULL;
  list_free(media_player_list);
  media_player_list = NULL;
  interop_is_initialized = false;
  pthread_mutex_unlock(&interop_list_lock);
  pthread_mutex_destroy(&interop_list_lock);
@@ -1152,6 +1150,9 @@ static void load_config() {
      }
    }
  }
  interop_database_save_allowlisted_media_players_list(config_static.get());
  // We no longer need the static config file
  config_static.reset();

  for (const section_t& sec : config_dynamic.get()->sections) {
    int feature = -1;
@@ -1661,16 +1662,37 @@ bool interop_database_remove_addr_lmp_version(const interop_feature_t feature,
  return false;
}

bool interop_database_get_allowlisted_media_players_list(
    const interop_feature_t feature, list_t** p_bl_devices) {
  for (const section_t& sec : config_static.get()->sections) {
    if (feature == interop_feature_name_to_feature_id(sec.name.c_str())) {
static void delete_media_player_node(void* data) {
  std::string* key = static_cast<std::string*>(data);
  delete key;
}

static void interop_database_save_allowlisted_media_players_list(
    const config_t* config) {
  media_player_list = list_new(delete_media_player_node);
  for (const section_t& sec : config->sections) {
    if (INTEROP_BROWSE_PLAYER_ALLOW_LIST ==
        interop_feature_name_to_feature_id(sec.name.c_str())) {
      LOG_WARN("found feature - %s", sec.name.c_str());
      for (const entry_t& entry : sec.entries) {
        LOG_WARN("found feature - %s", interop_feature_string_(feature));
        list_append(*p_bl_devices, (void*)entry.key.c_str());
        list_append(media_player_list, (void*)(new std::string(entry.key)));
      }
      return true;
      break;
    }
  }
  return false;
}

bool interop_get_allowlisted_media_players_list(list_t* p_bl_devices) {
  if (media_player_list == nullptr) return false;

  const list_node_t* node = list_begin(media_player_list);
  bool found = false;

  while (node != list_end(media_player_list)) {
    found = true;
    std::string* key = (std::string*)list_node(node);
    list_append(p_bl_devices, (void*)key->c_str());
    node = list_next(node);
  }
  return found;
}
+2 −2
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ class IopMock {
              (const interop_feature_t, uint16_t));
  MOCK_METHOD(bool, InteropMatchAddrGetMaxLat,
              (const interop_feature_t, const RawAddress*, uint16_t*));
  MOCK_METHOD(bool, InteropGetAllowlistedMediaPlayersList, (list_t**));
  MOCK_METHOD(bool, InteropGetAllowlistedMediaPlayersList, (list_t*));
  MOCK_METHOD(int, InteropFeatureNameToFeatureId, (const char*));
};

@@ -123,7 +123,7 @@ bool interop_match_addr_get_max_lat(const interop_feature_t feature,
  return localIopMock->InteropMatchAddrGetMaxLat(feature, addr, max_lat);
}

bool interop_get_allowlisted_media_players_list(list_t** p_bl_devices) {
bool interop_get_allowlisted_media_players_list(list_t* p_bl_devices) {
  return localIopMock->InteropGetAllowlistedMediaPlayersList(p_bl_devices);
}

Loading