Skip to content

Commit

Permalink
Import intrusively ref counted shared pointers into FML. (flutter#5062)
Browse files Browse the repository at this point in the history
  • Loading branch information
chinmaygarde authored Apr 22, 2018
1 parent cb3376c commit 4691a0b
Show file tree
Hide file tree
Showing 47 changed files with 1,511 additions and 86 deletions.
8 changes: 8 additions & 0 deletions fml/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

source_set("fml") {
sources = [
"build_config.h",
"compiler_specific.h",
"eintr_wrapper.h",
"file.h",
"icu_util.cc",
"icu_util.h",
Expand All @@ -13,6 +16,10 @@ source_set("fml") {
"memory/weak_ptr.h",
"memory/weak_ptr_internal.cc",
"memory/weak_ptr_internal.h",
"memory/ref_counted.h",
"memory/ref_counted_internal.h",
"memory/ref_ptr.h",
"memory/ref_ptr_internal.h",
"message_loop.cc",
"message_loop.h",
"message_loop_impl.cc",
Expand Down Expand Up @@ -130,6 +137,7 @@ executable("fml_unittests") {

sources = [
"memory/weak_ptr_unittest.cc",
"memory/ref_counted_unittest.cc",
"message_loop_unittests.cc",
"thread_local_unittests.cc",
"thread_unittests.cc",
Expand Down
110 changes: 110 additions & 0 deletions fml/build_config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file adds defines about the platform we're currently building on.
// Operating System:
// OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) /
// OS_NACL (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
// Compiler:
// COMPILER_MSVC / COMPILER_GCC
// Processor:
// ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
// ARCH_CPU_32_BITS / ARCH_CPU_64_BITS

#ifndef FLUTTER_FML_BUILD_CONFIG_H_
#define FLUTTER_FML_BUILD_CONFIG_H_

#if defined(__Fuchsia__)
#define OS_FUCHSIA 1
#elif defined(ANDROID)
#define OS_ANDROID 1
#elif defined(__APPLE__)
// only include TargetConditions after testing ANDROID as some android builds
// on mac don't have this header available and it's not needed unless the target
// is really mac/ios.
#include <TargetConditionals.h>
#define OS_MACOSX 1
#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
#define OS_IOS 1
#endif // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
#elif defined(__linux__)
#define OS_LINUX 1
// include a system header to pull in features.h for glibc/uclibc macros.
#include <unistd.h>
#if defined(__GLIBC__) && !defined(__UCLIBC__)
// we really are using glibc, not uClibc pretending to be glibc
#define LIBC_GLIBC 1
#endif
#elif defined(_WIN32)
#define OS_WIN 1
#elif defined(__FreeBSD__)
#define OS_FREEBSD 1
#elif defined(__OpenBSD__)
#define OS_OPENBSD 1
#elif defined(__sun)
#define OS_SOLARIS 1
#elif defined(__QNXNTO__)
#define OS_QNX 1
#else
#error Please add support for your platform in flutter/fml/build_config.h
#endif

// For access to standard BSD features, use OS_BSD instead of a
// more specific macro.
#if defined(OS_FREEBSD) || defined(OS_OPENBSD)
#define OS_BSD 1
#endif

// For access to standard POSIXish features, use OS_POSIX instead of a
// more specific macro.
#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FREEBSD) || \
defined(OS_OPENBSD) || defined(OS_SOLARIS) || defined(OS_ANDROID) || \
defined(OS_NACL) || defined(OS_QNX)
#define OS_POSIX 1
#endif

// Processor architecture detection. For more info on what's defined, see:
// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
// http://www.agner.org/optimize/calling_conventions.pdf
// or with gcc, run: "echo | gcc -E -dM -"
#if defined(_M_X64) || defined(__x86_64__)
#define ARCH_CPU_X86_FAMILY 1
#define ARCH_CPU_X86_64 1
#define ARCH_CPU_64_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#elif defined(_M_IX86) || defined(__i386__)
#define ARCH_CPU_X86_FAMILY 1
#define ARCH_CPU_X86 1
#define ARCH_CPU_32_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#elif defined(__ARMEL__)
#define ARCH_CPU_ARM_FAMILY 1
#define ARCH_CPU_ARMEL 1
#define ARCH_CPU_32_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#elif defined(__aarch64__)
#define ARCH_CPU_ARM_FAMILY 1
#define ARCH_CPU_ARM64 1
#define ARCH_CPU_64_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#elif defined(__pnacl__)
#define ARCH_CPU_32_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#elif defined(__MIPSEL__)
#if defined(__LP64__)
#define ARCH_CPU_MIPS64_FAMILY 1
#define ARCH_CPU_MIPS64EL 1
#define ARCH_CPU_64_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#else
#define ARCH_CPU_MIPS_FAMILY 1
#define ARCH_CPU_MIPSEL 1
#define ARCH_CPU_32_BITS 1
#define ARCH_CPU_LITTLE_ENDIAN 1
#endif
#else
#error Please add support for your architecture in flutter/fml/build_config.h
#endif

#endif // FLUTTER_FML_BUILD_CONFIG_H_
79 changes: 79 additions & 0 deletions fml/compiler_specific.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_FML_COMPILER_SPECIFIC_H_
#define FLUTTER_FML_COMPILER_SPECIFIC_H_

#if !defined(__GNUC__) && !defined(__clang__) && !defined(_MSC_VER)
#error Unsupported compiler.
#endif

// Annotate a variable indicating it's ok if the variable is not used.
// (Typically used to silence a compiler warning when the assignment
// is important for some other reason.)
// Use like:
// int x = ...;
// FML_ALLOW_UNUSED_LOCAL(x);
#define FML_ALLOW_UNUSED_LOCAL(x) false ? (void)x : (void)0

// Annotate a typedef or function indicating it's ok if it's not used.
// Use like:
// typedef Foo Bar ALLOW_UNUSED_TYPE;
#if defined(__GNUC__) || defined(__clang__)
#define FML_ALLOW_UNUSED_TYPE __attribute__((unused))
#else
#define FML_ALLOW_UNUSED_TYPE
#endif

// Annotate a function indicating it should not be inlined.
// Use like:
// NOINLINE void DoStuff() { ... }
#if defined(__GNUC__) || defined(__clang__)
#define FML_NOINLINE __attribute__((noinline))
#elif defined(_MSC_VER)
#define FML_NOINLINE __declspec(noinline)
#endif

// Specify memory alignment for structs, classes, etc.
// Use like:
// class FML_ALIGNAS(16) MyClass { ... }
// FML_ALIGNAS(16) int array[4];
#if defined(__GNUC__) || defined(__clang__)
#define FML_ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment)))
#elif defined(_MSC_VER)
#define FML_ALIGNAS(byte_alignment) __declspec(align(byte_alignment))
#endif

// Return the byte alignment of the given type (available at compile time).
// Use like:
// FML_ALIGNOF(int32) // this would be 4
#if defined(__GNUC__) || defined(__clang__)
#define FML_ALIGNOF(type) __alignof__(type)
#elif defined(_MSC_VER)
#define FML_ALIGNOF(type) __alignof(type)
#endif

// Annotate a function indicating the caller must examine the return value.
// Use like:
// int foo() FML_WARN_UNUSED_RESULT;
// To explicitly ignore a result, see |ignore_result()| in base/macros.h.
#if defined(__GNUC__) || defined(__clang__)
#define FML_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
#define FML_WARN_UNUSED_RESULT
#endif

// Tell the compiler a function is using a printf-style format string.
// |format_param| is the one-based index of the format string parameter;
// |dots_param| is the one-based index of the "..." parameter.
// For v*printf functions (which take a va_list), pass 0 for dots_param.
// (This is undocumented but matches what the system C headers do.)
#if defined(__GNUC__) || defined(__clang__)
#define FML_PRINTF_FORMAT(format_param, dots_param) \
__attribute__((format(printf, format_param, dots_param)))
#else
#define FML_PRINTF_FORMAT(format_param, dots_param)
#endif

#endif // FLUTTER_FML_COMPILER_SPECIFIC_H_
60 changes: 60 additions & 0 deletions fml/eintr_wrapper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_FML_EINTR_WRAPPER_H_
#define FLUTTER_FML_EINTR_WRAPPER_H_

#include "flutter/fml/build_config.h"

#include <errno.h>

#if defined(OS_WIN)

// Windows has no concept of EINTR.
#define FML_HANDLE_EINTR(x) (x)
#define FML_IGNORE_EINTR(x) (x)

#else

#if defined(NDEBUG)

#define FML_HANDLE_EINTR(x) \
({ \
decltype(x) eintr_wrapper_result; \
do { \
eintr_wrapper_result = (x); \
} while (eintr_wrapper_result == -1 && errno == EINTR); \
eintr_wrapper_result; \
})

#else

#define FML_HANDLE_EINTR(x) \
({ \
int eintr_wrapper_counter = 0; \
decltype(x) eintr_wrapper_result; \
do { \
eintr_wrapper_result = (x); \
} while (eintr_wrapper_result == -1 && errno == EINTR && \
eintr_wrapper_counter++ < 100); \
eintr_wrapper_result; \
})

#endif // NDEBUG

#define FML_IGNORE_EINTR(x) \
({ \
decltype(x) eintr_wrapper_result; \
do { \
eintr_wrapper_result = (x); \
if (eintr_wrapper_result == -1 && errno == EINTR) { \
eintr_wrapper_result = 0; \
} \
} while (0); \
eintr_wrapper_result; \
})

#endif // defined(OS_WIN)

#endif // FLUTTER_FML_EINTR_WRAPPER_H_
2 changes: 1 addition & 1 deletion fml/file.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
#ifndef FLUTTER_FML_FILE_H_
#define FLUTTER_FML_FILE_H_

#include "flutter/fml/macros.h"
#include "flutter/fml/unique_fd.h"
#include "lib/fxl/macros.h"

namespace fml {

Expand Down
4 changes: 2 additions & 2 deletions fml/icu_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
#include <memory>
#include <mutex>

#include "flutter/fml/build_config.h"
#include "flutter/fml/mapping.h"
#include "flutter/fml/paths.h"
#include "lib/fxl/build_config.h"
#include "lib/fxl/logging.h"
#include "third_party/icu/source/common/unicode/udata.h"

Expand Down Expand Up @@ -87,7 +87,7 @@ class ICUContext {
bool valid_;
std::unique_ptr<Mapping> mapping_;

FXL_DISALLOW_COPY_AND_ASSIGN(ICUContext);
FML_DISALLOW_COPY_AND_ASSIGN(ICUContext);
};

void InitializeICUOnce(const std::string& icu_data_path) {
Expand Down
2 changes: 1 addition & 1 deletion fml/icu_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

#include <string>

#include "lib/fxl/macros.h"
#include "flutter/fml/macros.h"

namespace fml {
namespace icu {
Expand Down
25 changes: 24 additions & 1 deletion fml/macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#ifndef FLUTTER_FML_MACROS_H_
#define FLUTTER_FML_MACROS_H_

#include "lib/fxl/macros.h"
#include "flutter/fml/macros.h"

#ifndef FML_USED_ON_EMBEDDER

Expand All @@ -17,4 +17,27 @@

#endif // FML_USED_ON_EMBEDDER

#define FML_DISALLOW_COPY(TypeName) TypeName(const TypeName&) = delete

#define FML_DISALLOW_ASSIGN(TypeName) \
TypeName& operator=(const TypeName&) = delete

#define FML_DISALLOW_MOVE(TypeName) \
TypeName(TypeName&&) = delete; \
TypeName& operator=(TypeName&&) = delete

#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
TypeName& operator=(const TypeName&) = delete

#define FML_DISALLOW_COPY_ASSIGN_AND_MOVE(TypeName) \
TypeName(const TypeName&) = delete; \
TypeName(TypeName&&) = delete; \
TypeName& operator=(const TypeName&) = delete; \
TypeName& operator=(TypeName&&) = delete

#define FML_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
TypeName() = delete; \
FML_DISALLOW_COPY_ASSIGN_AND_MOVE(TypeName)

#endif // FLUTTER_FML_MACROS_H_
10 changes: 5 additions & 5 deletions fml/mapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
#include <vector>

#include "flutter/fml//unique_fd.h"
#include "lib/fxl/build_config.h"
#include "lib/fxl/macros.h"
#include "flutter/fml/build_config.h"
#include "flutter/fml/macros.h"

namespace fml {

Expand All @@ -26,7 +26,7 @@ class Mapping {
virtual const uint8_t* GetMapping() const = 0;

private:
FXL_DISALLOW_COPY_AND_ASSIGN(Mapping);
FML_DISALLOW_COPY_AND_ASSIGN(Mapping);
};

bool PlatformHasResourcesBundle();
Expand All @@ -53,7 +53,7 @@ class FileMapping : public Mapping {
fml::UniqueFD mapping_handle_;
#endif

FXL_DISALLOW_COPY_AND_ASSIGN(FileMapping);
FML_DISALLOW_COPY_AND_ASSIGN(FileMapping);
};

class DataMapping : public Mapping {
Expand All @@ -69,7 +69,7 @@ class DataMapping : public Mapping {
private:
std::vector<uint8_t> data_;

FXL_DISALLOW_COPY_AND_ASSIGN(DataMapping);
FML_DISALLOW_COPY_AND_ASSIGN(DataMapping);
};

} // namespace fml
Expand Down
Loading

0 comments on commit 4691a0b

Please sign in to comment.