b990bc3794
This CL allows native extension lookup to defer to the platform's library lookup (e.g. dlopen) when the library cannot be found next to the importing Dart library. It also allows dart-ext: to accept an absolute path to the native library. R=asiva@google.com Review URL: https://codereview.chromium.org/2285223003 .
132 lines
3.0 KiB
C++
132 lines
3.0 KiB
C++
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include "platform/globals.h"
|
|
#if defined(TARGET_OS_ANDROID)
|
|
|
|
#include <errno.h> // NOLINT
|
|
#include <netdb.h> // NOLINT
|
|
#include <sys/time.h> // NOLINT
|
|
#include <time.h> // NOLINT
|
|
|
|
#include "bin/utils.h"
|
|
#include "platform/assert.h"
|
|
#include "platform/utils.h"
|
|
|
|
namespace dart {
|
|
namespace bin {
|
|
|
|
OSError::OSError() : sub_system_(kSystem), code_(0), message_(NULL) {
|
|
set_sub_system(kSystem);
|
|
set_code(errno);
|
|
const int kBufferSize = 1024;
|
|
char error_message[kBufferSize];
|
|
Utils::StrError(errno, error_message, kBufferSize);
|
|
SetMessage(error_message);
|
|
}
|
|
|
|
|
|
void OSError::SetCodeAndMessage(SubSystem sub_system, int code) {
|
|
set_sub_system(sub_system);
|
|
set_code(code);
|
|
if (sub_system == kSystem) {
|
|
const int kBufferSize = 1024;
|
|
char error_message[kBufferSize];
|
|
Utils::StrError(code, error_message, kBufferSize);
|
|
SetMessage(error_message);
|
|
} else if (sub_system == kGetAddressInfo) {
|
|
SetMessage(gai_strerror(code));
|
|
} else {
|
|
UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
|
|
const char* StringUtils::ConsoleStringToUtf8(
|
|
const char* str, intptr_t len, intptr_t* result_len) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
const char* StringUtils::Utf8ToConsoleString(
|
|
const char* utf8, intptr_t len, intptr_t* result_len) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
char* StringUtils::ConsoleStringToUtf8(
|
|
char* str, intptr_t len, intptr_t* result_len) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
char* StringUtils::Utf8ToConsoleString(
|
|
char* utf8, intptr_t len, intptr_t* result_len) {
|
|
UNIMPLEMENTED();
|
|
return NULL;
|
|
}
|
|
|
|
|
|
char* StringUtils::StrNDup(const char* s, intptr_t n) {
|
|
return strndup(s, n);
|
|
}
|
|
|
|
|
|
bool ShellUtils::GetUtf8Argv(int argc, char** argv) {
|
|
return false;
|
|
}
|
|
|
|
|
|
void TimerUtils::InitOnce() {
|
|
}
|
|
|
|
|
|
int64_t TimerUtils::GetCurrentMonotonicMillis() {
|
|
return GetCurrentMonotonicMicros() / 1000;
|
|
}
|
|
|
|
|
|
int64_t TimerUtils::GetCurrentMonotonicMicros() {
|
|
struct timespec ts;
|
|
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
|
|
UNREACHABLE();
|
|
return 0;
|
|
}
|
|
// Convert to microseconds.
|
|
int64_t result = ts.tv_sec;
|
|
result *= kMicrosecondsPerSecond;
|
|
result += (ts.tv_nsec / kNanosecondsPerMicrosecond);
|
|
return result;
|
|
}
|
|
|
|
|
|
void TimerUtils::Sleep(int64_t millis) {
|
|
struct timespec req; // requested.
|
|
struct timespec rem; // remainder.
|
|
int64_t micros = millis * kMicrosecondsPerMillisecond;
|
|
int64_t seconds = micros / kMicrosecondsPerSecond;
|
|
micros = micros - seconds * kMicrosecondsPerSecond;
|
|
int64_t nanos = micros * kNanosecondsPerMicrosecond;
|
|
req.tv_sec = seconds;
|
|
req.tv_nsec = nanos;
|
|
while (true) {
|
|
int r = nanosleep(&req, &rem);
|
|
if (r == 0) {
|
|
break;
|
|
}
|
|
// We should only ever see an interrupt error.
|
|
ASSERT(errno == EINTR);
|
|
// Copy remainder into requested and repeat.
|
|
req = rem;
|
|
}
|
|
}
|
|
|
|
} // namespace bin
|
|
} // namespace dart
|
|
|
|
#endif // defined(TARGET_OS_ANDROID)
|