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

Commit 32e6eaa1 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "performance: ensure PerfLock is thread safe"

parents c3a5347b e4558597
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@

#include <dlfcn.h>
#include <limits.h>
#include <pthread.h>
#include <string.h>

#include <cutils/properties.h>
@@ -46,6 +47,7 @@ namespace android
static int  (*perf_lock_acq)(int, int, int[], int)  = NULL;
static int  (*perf_lock_rel)(int)                   = NULL;
static void *dlhandle                               = NULL;
static pthread_mutex_t dl_mutex                     = PTHREAD_MUTEX_INITIALIZER;

// ----------------------------------------------------------------------------

@@ -98,6 +100,7 @@ cleanup:
static void
org_codeaurora_performance_native_deinit(JNIEnv *env, jobject clazz)
{
    pthread_mutex_lock(&dl_mutex);
    if (dlhandle) {
        perf_lock_acq  = NULL;
        perf_lock_rel  = NULL;
@@ -105,6 +108,7 @@ org_codeaurora_performance_native_deinit(JNIEnv *env, jobject clazz)
        dlclose(dlhandle);
        dlhandle       = NULL;
    }
    pthread_mutex_unlock(&dl_mutex);
}

static jint
@@ -113,27 +117,29 @@ org_codeaurora_performance_native_perf_lock_acq(JNIEnv *env, jobject clazz, jint
    jint listlen = env->GetArrayLength(list);
    jint buf[listlen];
    int i=0;
    int ret = 0;
    env->GetIntArrayRegion(list, 0, listlen, buf);

    if (dlhandle == NULL) {
    pthread_mutex_lock(&dl_mutex);
    if (perf_lock_acq == NULL) {
        org_codeaurora_performance_native_init();
    }
    if (perf_lock_acq) {
        return (*perf_lock_acq)(handle, duration, buf, listlen);
    }
    return 0;
    ret = (*perf_lock_acq)(handle, duration, buf, listlen);
    pthread_mutex_unlock(&dl_mutex);
    return ret;
}

static jint
org_codeaurora_performance_native_perf_lock_rel(JNIEnv *env, jobject clazz, jint handle)
{
    if (dlhandle == NULL) {
    int ret = 0;
    pthread_mutex_lock(&dl_mutex);
    if (perf_lock_rel == NULL) {
        org_codeaurora_performance_native_init();
    }
    if (perf_lock_rel) {
        return (*perf_lock_rel)(handle);
    }
    return 0;
    ret = (*perf_lock_rel)(handle);
    pthread_mutex_unlock(&dl_mutex);
    return ret;
}
// ----------------------------------------------------------------------------

@@ -145,7 +151,9 @@ static JNINativeMethod gMethods[] = {

int register_org_codeaurora_Performance(JNIEnv *env)
{
    pthread_mutex_lock(&dl_mutex);
    org_codeaurora_performance_native_init();
    pthread_mutex_unlock(&dl_mutex);

    return AndroidRuntime::registerNativeMethods(env,
            "org/codeaurora/Performance", gMethods, NELEM(gMethods));