Memory: Reference count number of clients, to support multiple independent clients in same process.

Addresses 2nd item in #976.
This commit is contained in:
John Kessenich 2017-11-16 22:48:41 -07:00
parent b63f4a3808
commit e2c15b4f6e
2 changed files with 25 additions and 6 deletions

View File

@ -1074,21 +1074,24 @@ int singleMain()
if (Options & EOptionLinkProgram || if (Options & EOptionLinkProgram ||
Options & EOptionOutputPreprocessed) { Options & EOptionOutputPreprocessed) {
glslang::InitializeProcess(); glslang::InitializeProcess();
glslang::InitializeProcess(); // also test reference counting of users
glslang::InitializeProcess(); // also test reference counting of users
glslang::FinalizeProcess(); // also test reference counting of users
glslang::FinalizeProcess(); // also test reference counting of users
CompileAndLinkShaderFiles(workList); CompileAndLinkShaderFiles(workList);
glslang::FinalizeProcess(); glslang::FinalizeProcess();
} else { } else {
ShInitialize(); ShInitialize();
ShInitialize(); // also test reference counting of users
ShFinalize(); // also test reference counting of users
bool printShaderNames = workList.size() > 1; bool printShaderNames = workList.size() > 1;
if (Options & EOptionMultiThreaded) if (Options & EOptionMultiThreaded) {
{
std::array<std::thread, 16> threads; std::array<std::thread, 16> threads;
for (unsigned int t = 0; t < threads.size(); ++t) for (unsigned int t = 0; t < threads.size(); ++t) {
{
threads[t] = std::thread(CompileShaders, std::ref(workList)); threads[t] = std::thread(CompileShaders, std::ref(workList));
if (threads[t].get_id() == std::thread::id()) if (threads[t].get_id() == std::thread::id()) {
{
fprintf(stderr, "Failed to create thread\n"); fprintf(stderr, "Failed to create thread\n");
return EFailThreadCreate; return EFailThreadCreate;
} }

View File

@ -69,6 +69,10 @@
namespace { // anonymous namespace for file-local functions and symbols namespace { // anonymous namespace for file-local functions and symbols
// Total number of successful initializers of glslang: a refcount
// Shared global; access should be protected by a global mutex/critical section.
int NumberOfClients = 0;
using namespace glslang; using namespace glslang;
// Create a language specific version of parseables. // Create a language specific version of parseables.
@ -1193,6 +1197,10 @@ int ShInitialize()
if (! InitProcess()) if (! InitProcess())
return 0; return 0;
glslang::GetGlobalLock();
++NumberOfClients;
glslang::ReleaseGlobalLock();
if (PerProcessGPA == nullptr) if (PerProcessGPA == nullptr)
PerProcessGPA = new TPoolAllocator(); PerProcessGPA = new TPoolAllocator();
@ -1259,6 +1267,14 @@ void ShDestruct(ShHandle handle)
// //
int __fastcall ShFinalize() int __fastcall ShFinalize()
{ {
glslang::GetGlobalLock();
--NumberOfClients;
assert(NumberOfClients >= 0);
bool finalize = NumberOfClients == 0;
glslang::ReleaseGlobalLock();
if (! finalize)
return 1;
for (int version = 0; version < VersionCount; ++version) { for (int version = 0; version < VersionCount; ++version) {
for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) { for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {
for (int p = 0; p < ProfileCount; ++p) { for (int p = 0; p < ProfileCount; ++p) {