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

Commit d52382ef authored by Kevin Lubick's avatar Kevin Lubick Committed by Android (Google) Code Review
Browse files

Merge "Replace sk_malloc* and sk_realloc* with direct native calls"

parents 9dee4982 f56871ab
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
#include "CreateJavaOutputStreamAdaptor.h"
#include "SkData.h"
#include "SkMalloc.h"
#include "SkRefCnt.h"
#include "SkStream.h"
#include "SkTypes.h"
#include "Utils.h"

#include <cstdlib>
#include <nativehelper/JNIHelp.h>
#include <log/log.h>
#include <memory>
@@ -177,6 +177,10 @@ SkStream* CreateJavaInputStreamAdaptor(JNIEnv* env, jobject stream, jbyteArray s
    return JavaInputStreamAdaptor::Create(env, stream, storage, swallowExceptions);
}

static void free_pointer_skproc(const void* ptr, void*) {
    free((void*)ptr);
}

sk_sp<SkData> CopyJavaInputStream(JNIEnv* env, jobject inputStream, jbyteArray storage) {
    std::unique_ptr<SkStream> stream(CreateJavaInputStreamAdaptor(env, inputStream, storage));
    if (!stream) {
@@ -186,19 +190,31 @@ sk_sp<SkData> CopyJavaInputStream(JNIEnv* env, jobject inputStream, jbyteArray s
    size_t bufferSize = 4096;
    size_t streamLen = 0;
    size_t len;
    char* data = (char*)sk_malloc_throw(bufferSize);
    char* data = (char*)malloc(bufferSize);
    LOG_ALWAYS_FATAL_IF(!data);

    while ((len = stream->read(data + streamLen,
                               bufferSize - streamLen)) != 0) {
        streamLen += len;
        if (streamLen == bufferSize) {
            bufferSize *= 2;
            data = (char*)sk_realloc_throw(data, bufferSize);
            data = (char*)realloc(data, bufferSize);
            LOG_ALWAYS_FATAL_IF(!data);
        }
    }
    data = (char*)sk_realloc_throw(data, streamLen);

    return SkData::MakeFromMalloc(data, streamLen);
    if (streamLen == 0) {
        // realloc with size 0 is unspecified behavior in C++11
        free(data);
        data = nullptr;
    } else {
        // Trim down the buffer to the actual size of the data.
        LOG_FATAL_IF(streamLen > bufferSize);
        data = (char*)realloc(data, streamLen);
        LOG_ALWAYS_FATAL_IF(!data);
    }
    // Just in case sk_free differs from free, we ask Skia to use
    // free to cleanup the buffer that SkData wraps.
    return SkData::MakeWithProc(data, streamLen, free_pointer_skproc, nullptr);
}

///////////////////////////////////////////////////////////////////////////////