diff options
Diffstat (limited to 'include/utils')
-rw-r--r-- | include/utils/AndroidThreads.h | 5 | ||||
-rw-r--r-- | include/utils/Compat.h | 39 | ||||
-rw-r--r-- | include/utils/Condition.h | 14 | ||||
-rw-r--r-- | include/utils/Endian.h | 15 | ||||
-rw-r--r-- | include/utils/FileMap.h | 26 | ||||
-rw-r--r-- | include/utils/Mutex.h | 36 | ||||
-rw-r--r-- | include/utils/RWLock.h | 6 | ||||
-rw-r--r-- | include/utils/RefBase.h | 6 | ||||
-rw-r--r-- | include/utils/Singleton.h | 7 | ||||
-rw-r--r-- | include/utils/Thread.h | 6 | ||||
-rw-r--r-- | include/utils/Timers.h | 32 | ||||
-rw-r--r-- | include/utils/Unicode.h | 6 |
12 files changed, 106 insertions, 92 deletions
diff --git a/include/utils/AndroidThreads.h b/include/utils/AndroidThreads.h index 4eee14d..aad1e82 100644 --- a/include/utils/AndroidThreads.h +++ b/include/utils/AndroidThreads.h @@ -20,7 +20,7 @@ #include <stdint.h> #include <sys/types.h> -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) # include <pthread.h> #endif @@ -73,9 +73,6 @@ extern void androidSetCreateThreadFunc(android_create_thread_fn func); // ------------------------------------------------------------------ // Extra functions working with raw pids. -// Get pid for the current thread. -extern pid_t androidGetTid(); - #ifdef HAVE_ANDROID_OS // Change the priority AND scheduling group of a particular thread. The priority // should be one of the ANDROID_PRIORITY constants. Returns INVALID_OPERATION diff --git a/include/utils/Compat.h b/include/utils/Compat.h index fb7748e..7d96310 100644 --- a/include/utils/Compat.h +++ b/include/utils/Compat.h @@ -19,11 +19,9 @@ #include <unistd.h> -/* Compatibility definitions for non-Linux (i.e., BSD-based) hosts. */ -#ifndef HAVE_OFF64_T -#if _FILE_OFFSET_BITS < 64 -#error "_FILE_OFFSET_BITS < 64; large files are not supported on this platform" -#endif /* _FILE_OFFSET_BITS < 64 */ +#if defined(__APPLE__) + +/* Mac OS has always had a 64-bit off_t, so it doesn't have off64_t. */ typedef off_t off64_t; @@ -31,20 +29,35 @@ static inline off64_t lseek64(int fd, off64_t offset, int whence) { return lseek(fd, offset, whence); } -#ifdef HAVE_PREAD static inline ssize_t pread64(int fd, void* buf, size_t nbytes, off64_t offset) { return pread(fd, buf, nbytes, offset); } -#endif -#endif /* !HAVE_OFF64_T */ +#endif /* __APPLE__ */ + +#if defined(_WIN32) +#define O_CLOEXEC O_NOINHERIT +#define O_NOFOLLOW 0 +#define DEFFILEMODE 0666 +#endif /* _WIN32 */ + +#if defined(_WIN32) +#define ZD "%ld" +#define ZD_TYPE long +#else +#define ZD "%zd" +#define ZD_TYPE ssize_t +#endif -#if HAVE_PRINTF_ZD -# define ZD "%zd" -# define ZD_TYPE ssize_t +/* + * Needed for cases where something should be constexpr if possible, but not + * being constexpr is fine if in pre-C++11 code (such as a const static float + * member variable). + */ +#if __cplusplus >= 201103L +#define CONSTEXPR constexpr #else -# define ZD "%ld" -# define ZD_TYPE long +#define CONSTEXPR #endif /* diff --git a/include/utils/Condition.h b/include/utils/Condition.h index 1c99d1a..5a72519 100644 --- a/include/utils/Condition.h +++ b/include/utils/Condition.h @@ -21,7 +21,7 @@ #include <sys/types.h> #include <time.h> -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) # include <pthread.h> #endif @@ -74,7 +74,7 @@ public: void broadcast(); private: -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) pthread_cond_t mCond; #else void* mState; @@ -83,7 +83,7 @@ private: // --------------------------------------------------------------------------- -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) inline Condition::Condition() { pthread_cond_init(&mCond, NULL); @@ -113,15 +113,15 @@ inline status_t Condition::waitRelative(Mutex& mutex, nsecs_t reltime) { return -pthread_cond_timedwait_relative_np(&mCond, &mutex.mMutex, &ts); #else // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE struct timespec ts; -#if defined(HAVE_POSIX_CLOCKS) +#if defined(__linux__) clock_gettime(CLOCK_REALTIME, &ts); -#else // HAVE_POSIX_CLOCKS +#else // __APPLE__ // we don't support the clocks here. struct timeval t; gettimeofday(&t, NULL); ts.tv_sec = t.tv_sec; ts.tv_nsec= t.tv_usec*1000; -#endif // HAVE_POSIX_CLOCKS +#endif ts.tv_sec += reltime/1000000000; ts.tv_nsec+= reltime%1000000000; if (ts.tv_nsec >= 1000000000) { @@ -149,7 +149,7 @@ inline void Condition::broadcast() { pthread_cond_broadcast(&mCond); } -#endif // HAVE_PTHREADS +#endif // !defined(_WIN32) // --------------------------------------------------------------------------- }; // namespace android diff --git a/include/utils/Endian.h b/include/utils/Endian.h index 19f2504..591cae0 100644 --- a/include/utils/Endian.h +++ b/include/utils/Endian.h @@ -20,21 +20,16 @@ #ifndef _LIBS_UTILS_ENDIAN_H #define _LIBS_UTILS_ENDIAN_H -#if defined(HAVE_ENDIAN_H) - -#include <endian.h> - -#else /*not HAVE_ENDIAN_H*/ +#if defined(__APPLE__) || defined(_WIN32) #define __BIG_ENDIAN 0x1000 #define __LITTLE_ENDIAN 0x0001 +#define __BYTE_ORDER __LITTLE_ENDIAN -#if defined(HAVE_LITTLE_ENDIAN) -# define __BYTE_ORDER __LITTLE_ENDIAN #else -# define __BYTE_ORDER __BIG_ENDIAN -#endif -#endif /*not HAVE_ENDIAN_H*/ +#include <endian.h> + +#endif #endif /*_LIBS_UTILS_ENDIAN_H*/ diff --git a/include/utils/FileMap.h b/include/utils/FileMap.h index dfe6d51..f70fc92 100644 --- a/include/utils/FileMap.h +++ b/include/utils/FileMap.h @@ -24,7 +24,11 @@ #include <utils/Compat.h> -#ifdef HAVE_WIN32_FILEMAP +#if defined(__MINGW32__) +// Ensure that we always pull in winsock2.h before windows.h +#ifdef HAVE_WINSOCK +#include <winsock2.h> +#endif #include <windows.h> #endif @@ -59,6 +63,8 @@ public: bool create(const char* origFileName, int fd, off64_t offset, size_t length, bool readOnly); + ~FileMap(void); + /* * Return the name of the file this map came from, if known. */ @@ -80,19 +86,6 @@ public: off64_t getDataOffset(void) const { return mDataOffset; } /* - * Get a "copy" of the object. - */ - FileMap* acquire(void) { mRefCount++; return this; } - - /* - * Call this when mapping is no longer needed. - */ - void release(void) { - if (--mRefCount <= 0) - delete this; - } - - /* * This maps directly to madvise() values, but allows us to avoid * including <sys/mman.h> everywhere. */ @@ -108,22 +101,19 @@ public: int advise(MapAdvice advice); protected: - // don't delete objects; call release() - ~FileMap(void); private: // these are not implemented FileMap(const FileMap& src); const FileMap& operator=(const FileMap& src); - int mRefCount; // reference count char* mFileName; // original file name, if known void* mBasePtr; // base of mmap area; page aligned size_t mBaseLength; // length, measured from "mBasePtr" off64_t mDataOffset; // offset used when map was created void* mDataPtr; // start of requested data, offset from base size_t mDataLength; // length, measured from "mDataPtr" -#ifdef HAVE_WIN32_FILEMAP +#if defined(__MINGW32__) HANDLE mFileHandle; // Win32 file handle HANDLE mFileMapping; // Win32 file mapping handle #endif diff --git a/include/utils/Mutex.h b/include/utils/Mutex.h index dd201c8..757519b 100644 --- a/include/utils/Mutex.h +++ b/include/utils/Mutex.h @@ -21,11 +21,12 @@ #include <sys/types.h> #include <time.h> -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) # include <pthread.h> #endif #include <utils/Errors.h> +#include <utils/Timers.h> // --------------------------------------------------------------------------- namespace android { @@ -45,7 +46,7 @@ public: PRIVATE = 0, SHARED = 1 }; - + Mutex(); Mutex(const char* name); Mutex(int type, const char* name = NULL); @@ -58,6 +59,16 @@ public: // lock if possible; returns 0 on success, error otherwise status_t tryLock(); +#if HAVE_ANDROID_OS + // lock the mutex, but don't wait longer than timeoutMilliseconds. + // Returns 0 on success, TIMED_OUT for failure due to timeout expiration. + // + // OSX doesn't have pthread_mutex_timedlock() or equivalent. To keep + // capabilities consistent across host OSes, this method is only available + // when building Android binaries. + status_t timedLock(nsecs_t timeoutMilliseconds); +#endif + // Manages the mutex automatically. It'll be locked when Autolock is // constructed and released when Autolock goes out of scope. class Autolock { @@ -71,12 +82,12 @@ public: private: friend class Condition; - + // A mutex cannot be copied Mutex(const Mutex&); Mutex& operator = (const Mutex&); - -#if defined(HAVE_PTHREADS) + +#if !defined(_WIN32) pthread_mutex_t mMutex; #else void _init(); @@ -86,7 +97,7 @@ private: // --------------------------------------------------------------------------- -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) inline Mutex::Mutex() { pthread_mutex_init(&mMutex, NULL); @@ -117,8 +128,17 @@ inline void Mutex::unlock() { inline status_t Mutex::tryLock() { return -pthread_mutex_trylock(&mMutex); } +#if HAVE_ANDROID_OS +inline status_t Mutex::timedLock(nsecs_t timeoutNs) { + const struct timespec ts = { + /* .tv_sec = */ static_cast<time_t>(timeoutNs / 1000000000), + /* .tv_nsec = */ static_cast<long>(timeoutNs % 1000000000), + }; + return -pthread_mutex_timedlock(&mMutex, &ts); +} +#endif -#endif // HAVE_PTHREADS +#endif // !defined(_WIN32) // --------------------------------------------------------------------------- @@ -127,7 +147,7 @@ inline status_t Mutex::tryLock() { * When the function returns, it will go out of scope, and release the * mutex. */ - + typedef Mutex::Autolock AutoMutex; // --------------------------------------------------------------------------- diff --git a/include/utils/RWLock.h b/include/utils/RWLock.h index 90beb5f..e743b1c 100644 --- a/include/utils/RWLock.h +++ b/include/utils/RWLock.h @@ -20,7 +20,7 @@ #include <stdint.h> #include <sys/types.h> -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) # include <pthread.h> #endif @@ -31,7 +31,7 @@ namespace android { // --------------------------------------------------------------------------- -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) /* * Simple mutex class. The implementation is system-dependent. @@ -117,7 +117,7 @@ inline void RWLock::unlock() { pthread_rwlock_unlock(&mRWLock); } -#endif // HAVE_PTHREADS +#endif // !defined(_WIN32) // --------------------------------------------------------------------------- }; // namespace android diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h index 8e15c19..eac6a78 100644 --- a/include/utils/RefBase.h +++ b/include/utils/RefBase.h @@ -491,7 +491,8 @@ public: TYPE::renameRefId(d[i].get(), &s[i], &d[i]); } public: - Renamer(sp<TYPE>* d, sp<TYPE> const* s) : s(s), d(d) { } + Renamer(sp<TYPE>* d, sp<TYPE> const* s) : d(d), s(s) { } + virtual ~Renamer() { } }; memmove(d, s, n*sizeof(sp<TYPE>)); @@ -510,7 +511,8 @@ public: TYPE::renameRefId(d[i].get_refs(), &s[i], &d[i]); } public: - Renamer(wp<TYPE>* d, wp<TYPE> const* s) : s(s), d(d) { } + Renamer(wp<TYPE>* d, wp<TYPE> const* s) : d(d), s(s) { } + virtual ~Renamer() { } }; memmove(d, s, n*sizeof(wp<TYPE>)); diff --git a/include/utils/Singleton.h b/include/utils/Singleton.h index c60680e..ffc03cb 100644 --- a/include/utils/Singleton.h +++ b/include/utils/Singleton.h @@ -65,9 +65,10 @@ private: */ #define ANDROID_SINGLETON_STATIC_INSTANCE(TYPE) \ - template<> Mutex Singleton< TYPE >::sLock(Mutex::PRIVATE); \ - template<> TYPE* Singleton< TYPE >::sInstance(0); \ - template class Singleton< TYPE >; + template<> ::android::Mutex \ + (::android::Singleton< TYPE >::sLock)(::android::Mutex::PRIVATE); \ + template<> TYPE* ::android::Singleton< TYPE >::sInstance(0); \ + template class ::android::Singleton< TYPE >; // --------------------------------------------------------------------------- diff --git a/include/utils/Thread.h b/include/utils/Thread.h index df30611..28839fd 100644 --- a/include/utils/Thread.h +++ b/include/utils/Thread.h @@ -21,7 +21,7 @@ #include <sys/types.h> #include <time.h> -#if defined(HAVE_PTHREADS) +#if !defined(_WIN32) # include <pthread.h> #endif @@ -71,8 +71,8 @@ public: bool isRunning() const; #ifdef HAVE_ANDROID_OS - // Return the thread's kernel ID, same as the thread itself calling gettid() or - // androidGetTid(), or -1 if the thread is not running. + // Return the thread's kernel ID, same as the thread itself calling gettid(), + // or -1 if the thread is not running. pid_t getTid() const; #endif diff --git a/include/utils/Timers.h b/include/utils/Timers.h index d015421..54ec474 100644 --- a/include/utils/Timers.h +++ b/include/utils/Timers.h @@ -24,6 +24,8 @@ #include <sys/types.h> #include <sys/time.h> +#include <utils/Compat.h> + // ------------------------------------------------------------------ // C API @@ -33,46 +35,46 @@ extern "C" { typedef int64_t nsecs_t; // nano-seconds -static inline nsecs_t seconds_to_nanoseconds(nsecs_t secs) +static CONSTEXPR inline nsecs_t seconds_to_nanoseconds(nsecs_t secs) { return secs*1000000000; } -static inline nsecs_t milliseconds_to_nanoseconds(nsecs_t secs) +static CONSTEXPR inline nsecs_t milliseconds_to_nanoseconds(nsecs_t secs) { return secs*1000000; } -static inline nsecs_t microseconds_to_nanoseconds(nsecs_t secs) +static CONSTEXPR inline nsecs_t microseconds_to_nanoseconds(nsecs_t secs) { return secs*1000; } -static inline nsecs_t nanoseconds_to_seconds(nsecs_t secs) +static CONSTEXPR inline nsecs_t nanoseconds_to_seconds(nsecs_t secs) { return secs/1000000000; } -static inline nsecs_t nanoseconds_to_milliseconds(nsecs_t secs) +static CONSTEXPR inline nsecs_t nanoseconds_to_milliseconds(nsecs_t secs) { return secs/1000000; } -static inline nsecs_t nanoseconds_to_microseconds(nsecs_t secs) +static CONSTEXPR inline nsecs_t nanoseconds_to_microseconds(nsecs_t secs) { return secs/1000; } -static inline nsecs_t s2ns(nsecs_t v) {return seconds_to_nanoseconds(v);} -static inline nsecs_t ms2ns(nsecs_t v) {return milliseconds_to_nanoseconds(v);} -static inline nsecs_t us2ns(nsecs_t v) {return microseconds_to_nanoseconds(v);} -static inline nsecs_t ns2s(nsecs_t v) {return nanoseconds_to_seconds(v);} -static inline nsecs_t ns2ms(nsecs_t v) {return nanoseconds_to_milliseconds(v);} -static inline nsecs_t ns2us(nsecs_t v) {return nanoseconds_to_microseconds(v);} +static CONSTEXPR inline nsecs_t s2ns(nsecs_t v) {return seconds_to_nanoseconds(v);} +static CONSTEXPR inline nsecs_t ms2ns(nsecs_t v) {return milliseconds_to_nanoseconds(v);} +static CONSTEXPR inline nsecs_t us2ns(nsecs_t v) {return microseconds_to_nanoseconds(v);} +static CONSTEXPR inline nsecs_t ns2s(nsecs_t v) {return nanoseconds_to_seconds(v);} +static CONSTEXPR inline nsecs_t ns2ms(nsecs_t v) {return nanoseconds_to_milliseconds(v);} +static CONSTEXPR inline nsecs_t ns2us(nsecs_t v) {return nanoseconds_to_microseconds(v);} -static inline nsecs_t seconds(nsecs_t v) { return s2ns(v); } -static inline nsecs_t milliseconds(nsecs_t v) { return ms2ns(v); } -static inline nsecs_t microseconds(nsecs_t v) { return us2ns(v); } +static CONSTEXPR inline nsecs_t seconds(nsecs_t v) { return s2ns(v); } +static CONSTEXPR inline nsecs_t milliseconds(nsecs_t v) { return ms2ns(v); } +static CONSTEXPR inline nsecs_t microseconds(nsecs_t v) { return us2ns(v); } enum { SYSTEM_TIME_REALTIME = 0, // system-wide realtime clock diff --git a/include/utils/Unicode.h b/include/utils/Unicode.h index 5b98de2..b76a5e2 100644 --- a/include/utils/Unicode.h +++ b/include/utils/Unicode.h @@ -22,12 +22,6 @@ extern "C" { -// Definitions exist in C++11 -#if defined __cplusplus && __cplusplus < 201103L -typedef uint32_t char32_t; -typedef uint16_t char16_t; -#endif - // Standard string functions on char16_t strings. int strcmp16(const char16_t *, const char16_t *); int strncmp16(const char16_t *s1, const char16_t *s2, size_t n); |