From 3878f25fa777fe724b9326fd0f375f30f2b68112 Mon Sep 17 00:00:00 2001 From: guoling Date: Thu, 26 Mar 2020 10:37:50 +0800 Subject: [PATCH 1/3] remove mavenLocal() repo --- Android/MMKV/mmkvdemo/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Android/MMKV/mmkvdemo/build.gradle b/Android/MMKV/mmkvdemo/build.gradle index 23427316..6367f972 100644 --- a/Android/MMKV/mmkvdemo/build.gradle +++ b/Android/MMKV/mmkvdemo/build.gradle @@ -57,7 +57,7 @@ repositories { // } jcenter() mavenCentral() - mavenLocal() +// mavenLocal() } dependencies { From 27bf37f171512c6ee44e69d04b21b8980f0801a5 Mon Sep 17 00:00:00 2001 From: guoling Date: Thu, 26 Mar 2020 16:21:01 +0800 Subject: [PATCH 2/3] fix crc32 crash on some arm64 devices --- Core/MMKV_OSX.cpp | 44 ++++++++++++++++++++++++++++++++++++++ Core/crc32/Checksum.h | 11 ++-------- Core/crc32/crc32_armv8.cpp | 6 +----- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Core/MMKV_OSX.cpp b/Core/MMKV_OSX.cpp index aa56697d..08aeae25 100644 --- a/Core/MMKV_OSX.cpp +++ b/Core/MMKV_OSX.cpp @@ -32,7 +32,9 @@ # include "ThreadLock.h" # ifdef MMKV_IOS +# include "Checksum.h" # include +# include # endif # if __has_feature(objc_arc) @@ -45,6 +47,9 @@ using namespace mmkv; extern ThreadLock *g_instanceLock; extern MMKVPath_t g_rootDir; +enum { UnKnown = 0, PowerMac = 1, Mac, iPhone, iPod, iPad, AppleTV, AppleWatch }; +static void GetAppleMachineInfo(int &device, int &version); + MMKV_NAMESPACE_BEGIN extern ThreadOnceToken_t once_control; @@ -53,6 +58,16 @@ extern void initialize(); void MMKV::minimalInit(MMKVPath_t defaultRootDir) { ThreadLock::ThreadOnce(&once_control, initialize); + // crc32 instruction requires A10 chip, aka iPhone 7 or iPad 6th generation + int device = 0, version = 0; + GetAppleMachineInfo(device, version); +# ifdef __aarch64__ + if ((device == iPhone && version >= 9) || (device == iPad && version >= 7)) { + CRC32 = mmkv::armv8_crc32; + } +# endif + MMKVInfo("Apple Device:%d, version:%d", device, version); + g_rootDir = defaultRootDir; mkPath(g_rootDir); @@ -215,4 +230,33 @@ void MMKV::enumerateKeys(EnumerateBlock block) { MMKV_NAMESPACE_END +static void GetAppleMachineInfo(int &device, int &version) { + device = UnKnown; + version = 0; + + struct utsname systemInfo = {}; + uname(&systemInfo); + + std::string machine(systemInfo.machine); + if (machine.find("PowerMac") != std::string::npos || machine.find("Power Macintosh") != std::string::npos) { + device = PowerMac; + } else if (machine.find("Mac") != std::string::npos || machine.find("Macintosh") != std::string::npos) { + device = Mac; + } else if (machine.find("iPhone") != std::string::npos) { + device = iPhone; + } else if (machine.find("iPod") != std::string::npos) { + device = iPod; + } else if (machine.find("iPad") != std::string::npos) { + device = iPad; + } else if (machine.find("AppleTV") != std::string::npos) { + device = AppleTV; + } else if (machine.find("AppleWatch") != std::string::npos) { + device = AppleWatch; + } + auto pos = machine.find_first_of("0123456789"); + if (pos != std::string::npos) { + version = std::atoi(machine.substr(pos).c_str()); + } +} + #endif // MMKV_IOS_OR_MAC diff --git a/Core/crc32/Checksum.h b/Core/crc32/Checksum.h index 4763a804..a46d8ab5 100644 --- a/Core/crc32/Checksum.h +++ b/Core/crc32/Checksum.h @@ -19,7 +19,7 @@ */ #pragma once -#ifdef __cplusplus +#ifdef __cplusplus #include "../MMKVPredef.h" @@ -43,17 +43,10 @@ namespace mmkv { uint32_t armv8_crc32(uint32_t crc, const unsigned char *buf, size_t len); } -# ifndef MMKV_ANDROID - -# define CRC32(crc, buf, len) mmkv::armv8_crc32(crc, buf, len) - -# else // Android runs on too many devices, have to check CPU's instruction set dynamically - +// have to check CPU's instruction set dynamically typedef uint32_t (*CRC32_Func_t)(uint32_t crc, const unsigned char *buf, size_t len); extern CRC32_Func_t CRC32; -# endif // MMKV_ANDROID - # else // __aarch64__ # include diff --git a/Core/crc32/crc32_armv8.cpp b/Core/crc32/crc32_armv8.cpp index 3c9378bd..3ae07dcf 100644 --- a/Core/crc32/crc32_armv8.cpp +++ b/Core/crc32/crc32_armv8.cpp @@ -22,9 +22,7 @@ #ifdef __aarch64__ -# ifdef MMKV_ANDROID - -# include +# include static inline uint32_t _crc32Wrap(uint32_t crc, const unsigned char *buf, size_t len) { return static_cast(::crc32(crc, buf, static_cast(len))); @@ -32,8 +30,6 @@ static inline uint32_t _crc32Wrap(uint32_t crc, const unsigned char *buf, size_t CRC32_Func_t CRC32 = _crc32Wrap; -# endif // MMKV_ANDROID - // targeting armv8 with crc instruction extension # define TARGET_ARM_CRC __attribute__((target("crc"))) From 3e637381713443ab1e0f1588ada9b6fd5a7f8db9 Mon Sep 17 00:00:00 2001 From: guoling Date: Thu, 26 Mar 2020 16:24:57 +0800 Subject: [PATCH 3/3] fix macOS compile error --- Core/MMKV_OSX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MMKV_OSX.cpp b/Core/MMKV_OSX.cpp index 08aeae25..bafac4a3 100644 --- a/Core/MMKV_OSX.cpp +++ b/Core/MMKV_OSX.cpp @@ -30,11 +30,11 @@ # include "MiniPBCoder.h" # include "ScopedLock.hpp" # include "ThreadLock.h" +# include # ifdef MMKV_IOS # include "Checksum.h" # include -# include # endif # if __has_feature(objc_arc)