// // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Posix_system_utils.cpp: Implementation of OS-specific functions for Posix systems #include "system_utils.h" #include #include #include #include #include namespace angle { void Sleep(unsigned int milliseconds) { // On Windows Sleep(0) yields while it isn't guaranteed by Posix's sleep // so we replicate Windows' behavior with an explicit yield. if (milliseconds == 0) { sched_yield(); } else { timespec sleepTime = { .tv_sec = milliseconds / 1000, .tv_nsec = (milliseconds % 1000) * 1000000, }; nanosleep(&sleepTime, nullptr); } } void SetLowPriorityProcess() { setpriority(PRIO_PROCESS, getpid(), 10); } void WriteDebugMessage(const char *format, ...) { // TODO(jmadill): Implement this } class PosixLibrary : public Library { public: PosixLibrary(const std::string &libraryName); ~PosixLibrary() override; void *getSymbol(const std::string &symbolName) override; private: void *mModule; }; PosixLibrary::PosixLibrary(const std::string &libraryName) : mModule(nullptr) { const auto &fullName = libraryName + "." + GetSharedLibraryExtension(); mModule = dlopen(fullName.c_str(), RTLD_NOW); } PosixLibrary::~PosixLibrary() { if (mModule) { dlclose(mModule); } } void *PosixLibrary::getSymbol(const std::string &symbolName) { if (!mModule) { return nullptr; } return dlsym(mModule, symbolName.c_str()); } Library *loadLibrary(const std::string &libraryName) { return new PosixLibrary(libraryName); } } // namespace angle