From 7638d0b8b6ec080bda334afd4c2c6497c3cd263c Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Wed, 15 Dec 2021 15:42:33 +0100 Subject: [PATCH] Disable stdout during vulkan operations --- src/common/io.c | 31 +++++++++++++++++++++++++++++++ src/fastfetch.h | 3 +++ src/modules/gpu.c | 8 ++++++++ 3 files changed, 42 insertions(+) diff --git a/src/common/io.c b/src/common/io.c index f3a8aa9b5..0251c8f22 100644 --- a/src/common/io.c +++ b/src/common/io.c @@ -462,3 +462,34 @@ bool ffGetFileContent(const char* fileName, FFstrbuf* buffer) ffStrbufClear(buffer); return ffAppendFileContent(fileName, buffer); } + +static volatile bool originalPipesSet = false; +static volatile int originalStdout = -1; +static volatile int originalStderr = -1; + +void ffDisableOutput() +{ + fflush(stdout); + fflush(stderr); + + if(!originalPipesSet) + { + originalStdout = dup(STDOUT_FILENO); + originalStderr = dup(STDERR_FILENO); + originalPipesSet = true; + } + + int nullFile = open("/dev/null", O_WRONLY); + dup2(nullFile, STDOUT_FILENO); + dup2(nullFile, STDERR_FILENO); + close(nullFile); +} + +void ffEnableOutput() +{ + fflush(stdout); + fflush(stderr); + + dup2(originalStdout, STDOUT_FILENO); + dup2(originalStderr, STDERR_FILENO); +} diff --git a/src/fastfetch.h b/src/fastfetch.h index 2aee3d23b..73bfacdf8 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -328,6 +328,9 @@ bool ffGetFileContent(const char* fileName, FFstrbuf* buffer); bool ffWriteFDContent(int fd, const FFstrbuf* content); void ffWriteFileContent(const char* fileName, const FFstrbuf* buffer); +void ffDisableOutput(); +void ffEnableOutput(); + // They return true if the file was found, independently if start was found // Buffers which already contain content are not overwritten // The last occurence of start in the first file will be the one used diff --git a/src/modules/gpu.c b/src/modules/gpu.c index c24e6c451..642d02762 100644 --- a/src/modules/gpu.c +++ b/src/modules/gpu.c @@ -22,6 +22,10 @@ static void vulkanFillGPUs(FFinstance* instance, FFlist* results) FF_LIBRARY_LOAD_SYMBOL(vulkan, vkEnumeratePhysicalDevices,) FF_LIBRARY_LOAD_SYMBOL(vulkan, vkGetPhysicalDeviceProperties,) + //Some drivers (nvdc) print messages to stdout + //and thats the best way i found to disable that + ffDisableOutput(); + const VkApplicationInfo applicationInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pNext = NULL, @@ -47,6 +51,7 @@ static void vulkanFillGPUs(FFinstance* instance, FFlist* results) if(ffvkCreateInstance(&instanceCreateInfo, NULL, &vkInstance) != VK_SUCCESS) { dlclose(vulkan); + ffEnableOutput(); return; } @@ -55,6 +60,7 @@ static void vulkanFillGPUs(FFinstance* instance, FFlist* results) { ffvkDestroyInstance(vkInstance, NULL); dlclose(vulkan); + ffEnableOutput(); return; } @@ -64,6 +70,7 @@ static void vulkanFillGPUs(FFinstance* instance, FFlist* results) free(physicalDevices); ffvkDestroyInstance(vkInstance, NULL); dlclose(vulkan); + ffEnableOutput(); return; } @@ -86,6 +93,7 @@ static void vulkanFillGPUs(FFinstance* instance, FFlist* results) free(physicalDevices); ffvkDestroyInstance(vkInstance, NULL); dlclose(vulkan); + ffEnableOutput(); return; }