blob: 010735b3bf6b049ff04b2733e8ea74e83ca753de [file] [log] [blame]
//
// 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 <sys/resource.h>
#include <dlfcn.h>
#include <sched.h>
#include <time.h>
#include <unistd.h>
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