mozglue/android/SharedMemNatives.cpp
author Eugen Sawin <esawin@mozilla.com>
Mon, 02 Dec 2019 23:11:32 +0000
changeset 563512 7fd12a78625c6f1725f64a42d7f4f8dbfeff7177
parent 528503 e9985b6b27691ba04672d788dac65e05687e2c8c
permissions -rw-r--r--
Bug 1592752 - [1.0] Conditionally check for storage clearing based on status of LSNG. r=snorp, a=test-only It looks like there is going to be a period of LSNG being disabled on some channels for a while. Making the test conditional on the pref will make it pass in all situations and would allow us to keep the test enabled. It doesn't help with the fact, that on some version we're clearing storage despite the flag not being set, but since it's clearing more, rather than less, it's at least not as critical in terms of privacy. Differential Revision: https://phabricator.services.mozilla.com/D55526

/* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include <errno.h>
#include <jni.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>

#include "mozilla/Sprintf.h"

extern "C" {

JNIEXPORT
void JNICALL
Java_org_mozilla_gecko_media_SampleBuffer_nativeReadFromDirectBuffer(
    JNIEnv* jenv, jclass, jobject src, jlong dest, jint offset, jint size) {
  uint8_t* from = static_cast<uint8_t*>(jenv->GetDirectBufferAddress(src));
  if (from == nullptr) {
    jenv->ThrowNew(jenv->FindClass("java/lang/NullPointerException"),
                   "Null direct buffer");
    return;
  }

  void* to = reinterpret_cast<void*>(dest);
  if (to == nullptr) {
    jenv->ThrowNew(jenv->FindClass("java/lang/NullPointerException"),
                   "Null shared memory buffer");
    return;
  }

  memcpy(to, from + offset, size);
}

JNIEXPORT
void JNICALL
Java_org_mozilla_gecko_media_SampleBuffer_nativeWriteToDirectBuffer(
    JNIEnv* jenv, jclass, jlong src, jobject dest, jint offset, jint size) {
  uint8_t* from = reinterpret_cast<uint8_t*>(src);
  if (from == nullptr) {
    jenv->ThrowNew(jenv->FindClass("java/lang/NullPointerException"),
                   "Null shared memory buffer");
    return;
  }

  void* to = jenv->GetDirectBufferAddress(dest);
  if (to == nullptr) {
    jenv->ThrowNew(jenv->FindClass("java/lang/NullPointerException"),
                   "Null direct buffer");
    return;
  }

  memcpy(to, from + offset, size);
}

JNIEXPORT
jlong JNICALL Java_org_mozilla_gecko_mozglue_SharedMemory_map(JNIEnv* env,
                                                              jobject jobj,
                                                              jint fd,
                                                              jint length) {
  void* address = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if (address == MAP_FAILED) {
    char msg[128];
    SprintfLiteral(msg, "mmap failed. errno=%d", errno);
    env->ThrowNew(env->FindClass("java/lang/NullPointerException"), msg);
    return 0;
  }
  return jlong(address);
}

JNIEXPORT
void JNICALL Java_org_mozilla_gecko_mozglue_SharedMemory_unmap(JNIEnv* env,
                                                               jobject jobj,
                                                               jlong address,
                                                               jint size) {
  munmap((void*)address, (size_t)size);
}
}