power: perform_hint_action: return an error code

So far the caller never knows if setting the hint actually worked.
This leads to a potential disconnect between the actual setting and the
UI because set_power_profile simply assumes perform_hint_action worked.

Return an error code or 0, so the callers can check for success.

Change-Id: I180a367e9d8581a63dfa703046b37bc5cae8c6cb
Signed-off-by: Corinna Vinschen <xda@vinschen.de>
This commit is contained in:
Corinna Vinschen
2018-08-26 21:16:23 +02:00
committed by Michael Bestas
parent 3b9e68c9a7
commit da09e1ea1e
2 changed files with 30 additions and 30 deletions

28
utils.c
View File

@@ -262,19 +262,26 @@ void release_request(int lock_handle) {
if (qcopt_handle && perf_lock_rel) perf_lock_rel(lock_handle); if (qcopt_handle && perf_lock_rel) perf_lock_rel(lock_handle);
} }
void perform_hint_action(int hint_id, int resource_values[], int num_resources) { int perform_hint_action(int hint_id, int resource_values[], int num_resources) {
if (qcopt_handle) { if (qcopt_handle && perf_lock_acq) {
if (perf_lock_acq) {
/* Acquire an indefinite lock for the requested resources. */ /* Acquire an indefinite lock for the requested resources. */
int lock_handle = perf_lock_acq(0, 0, resource_values, num_resources); int lock_handle = perf_lock_acq(0, 0, resource_values, num_resources);
if (lock_handle == -1) { if (lock_handle == -1) {
ALOGE("Failed to acquire lock."); ALOGE("Failed to acquire lock.");
} else { return -EINVAL;
}
/* Add this handle to our internal hint-list. */ /* Add this handle to our internal hint-list. */
struct hint_data* new_hint = (struct hint_data*)malloc(sizeof(struct hint_data)); struct hint_data* new_hint = (struct hint_data*)malloc(sizeof(struct hint_data));
if (new_hint) { if (!new_hint) {
/* Can't keep track of this lock. Release it. */
if (perf_lock_rel) perf_lock_rel(lock_handle);
ALOGE("Failed to process hint.");
return -ENOMEM;
}
if (!active_hint_list_head.compare) { if (!active_hint_list_head.compare) {
active_hint_list_head.compare = (int (*)(void*, void*))hint_compare; active_hint_list_head.compare = (int (*)(void*, void*))hint_compare;
active_hint_list_head.dump = (void (*)(void*))hint_dump; active_hint_list_head.dump = (void (*)(void*))hint_dump;
@@ -287,18 +294,11 @@ void perform_hint_action(int hint_id, int resource_values[], int num_resources)
free(new_hint); free(new_hint);
/* Can't keep track of this lock. Release it. */ /* Can't keep track of this lock. Release it. */
if (perf_lock_rel) perf_lock_rel(lock_handle); if (perf_lock_rel) perf_lock_rel(lock_handle);
ALOGE("Failed to process hint.");
}
} else {
/* Can't keep track of this lock. Release it. */
if (perf_lock_rel) perf_lock_rel(lock_handle);
ALOGE("Failed to process hint."); ALOGE("Failed to process hint.");
return -ENOMEM;
} }
} }
} return 0;
}
} }
void undo_hint_action(int hint_id) { void undo_hint_action(int hint_id) {

View File

@@ -40,7 +40,7 @@ int get_scaling_governor_check_cores(char governor[], int size, int core_num);
int is_interactive_governor(char*); int is_interactive_governor(char*);
int is_schedutil_governor(char*); int is_schedutil_governor(char*);
void perform_hint_action(int hint_id, int resource_values[], int num_resources); int perform_hint_action(int hint_id, int resource_values[], int num_resources);
void undo_hint_action(int hint_id); void undo_hint_action(int hint_id);
void undo_initial_hint_action(); void undo_initial_hint_action();
void release_request(int lock_handle); void release_request(int lock_handle);