// Copyright 2015 The Gemmlowp Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// internal/platform.h: a place to put platform specific code

#ifndef GEMMLOWP_INTERNAL_PLATFORM_H_
#define GEMMLOWP_INTERNAL_PLATFORM_H_

#ifdef _WIN32
#include <windows.h>
#else
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#endif

#ifdef __APPLE__
#include <sys/time.h>
#endif

#if defined ANDROID || defined __ANDROID__
#include <malloc.h>
#include <android/api-level.h>
// The 18 here should be 16, but has to be 18 for now due
// to a Google-internal issue.
#if __ANDROID_API__ < 18
#define GEMMLOWP_USE_MEMALIGN
#endif
// posix_memalign is missing on some 4.1 x86 devices
#if __ANDROID_API__ == 18
#ifdef GEMMLOWP_X86_32
#define GEMMLOWP_USE_MEMALIGN
#endif
#endif
#endif

// Needed by chrome native builds
#ifndef _SC_NPROCESSORS_CONF
#define _SC_NPROCESSORS_CONF _SC_NPROCESSORS_ONLN
#endif

namespace gemmlowp {

#ifdef _WIN32
inline void *aligned_alloc(size_t alignment, size_t size) {
  return _aligned_malloc(size, alignment);
}

inline void aligned_free(void *memptr) { _aligned_free(memptr); }

inline int GetHardwareConcurrency(int max_threads) {
  if (max_threads == 0) {
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    return sysinfo.dwNumberOfProcessors;
  }
  return max_threads;
}

inline double real_time_in_seconds() {
  __int64 wintime;
  GetSystemTimeAsFileTime((FILETIME *)&wintime);
  wintime -= 116444736000000000i64;  // 1jan1601 to 1jan1970
  return wintime / 10000000i64 + wintime % 10000000i64 * 100 * 1e-9;
}

#else
inline void *aligned_alloc(size_t alignment, size_t size) {
#ifdef GEMMLOWP_USE_MEMALIGN
  return memalign(alignment, size);
#else
  void *memptr;
  if (posix_memalign(&memptr, alignment, size)) {
    memptr = nullptr;
  }
  return memptr;
#endif
}

inline int GetHardwareConcurrency(int max_threads) {
  if (max_threads == 0) {
    static const int hardware_threads_count =
        static_cast<int>(sysconf(_SC_NPROCESSORS_CONF));
    return hardware_threads_count;
  }
  return max_threads;
}

inline void aligned_free(void *memptr) { free(memptr); }

inline double real_time_in_seconds() {
#ifdef __APPLE__
  timeval t;
  gettimeofday(&t, nullptr);
  return t.tv_sec + 1e-6 * t.tv_usec;
#else
  timespec t;
  clock_gettime(CLOCK_REALTIME, &t);
  return t.tv_sec + 1e-9 * t.tv_nsec;
#endif
}

#endif
}  // namespace gemmlowp
#endif  // GEMMLOWP_INTERNAL_PLATFORM_H_
