Files
test2/intern/cycles/util/thread.cpp
Brecht Van Lommel d0c2e68e5f Refactor: Cycles: Automated clang-tidy fixups in Cycles
* Use .empty() and .data()
* Use nullptr instead of 0
* No else after return
* Simple class member initialization
* Add override for virtual methods
* Include C++ instead of C headers
* Remove some unused includes
* Use default constructors
* Always use braces
* Consistent names in definition and declaration
* Change typedef to using

Pull Request: https://projects.blender.org/blender/blender/pulls/132361
2025-01-03 10:22:55 +01:00

65 lines
1.4 KiB
C++

/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#include "util/thread.h"
#if defined(__APPLE__) || defined(__linux__) && !defined(__GLIBC__)
#else
# include "util/system.h"
# ifdef _WIN32
# include "util/windows.h"
# endif
# include <system_error>
#endif
CCL_NAMESPACE_BEGIN
thread::thread(std::function<void()> run_cb) : run_cb_(run_cb), joined_(false)
{
#if defined(__APPLE__) || defined(__linux__) && !defined(__GLIBC__)
/* Set the stack size to 2MB to match GLIBC. The default 512KB on macOS is
* too small for Embree, and consistent stack size also makes things more
* predictable in general. */
pthread_attr_t attribute;
pthread_attr_init(&attribute);
pthread_attr_setstacksize(&attribute, 1024 * 1024 * 2);
pthread_create(&pthread_id, &attribute, run, (void *)this);
#else
std_thread = std::thread(&thread::run, this);
#endif
}
thread::~thread()
{
if (!joined_) {
join();
}
}
void *thread::run(void *arg)
{
thread *self = (thread *)(arg);
self->run_cb_();
return nullptr;
}
bool thread::join()
{
joined_ = true;
#if defined(__APPLE__) || defined(__linux__) && !defined(__GLIBC__)
return pthread_join(pthread_id, nullptr) == 0;
#else
try {
std_thread.join();
return true;
}
catch (const std::system_error &) {
return false;
}
#endif
}
CCL_NAMESPACE_END