From 7e35777624aa2fd3c27f8effb5d070d4804c5ee6 Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Wed, 26 Apr 2017 13:46:31 -0500 Subject: [PATCH] swr/rast: add CreateDirectoryPath to recursively create directories Reviewed-by: Bruce Cherniak --- .../drivers/swr/rasterizer/common/os.cpp | 48 ++++++++++++++++++- .../drivers/swr/rasterizer/common/os.h | 3 +- .../swr/rasterizer/jitter/JitManager.cpp | 10 ++-- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/common/os.cpp b/src/gallium/drivers/swr/rasterizer/common/os.cpp index 295556a5678..27ad5e90b66 100644 --- a/src/gallium/drivers/swr/rasterizer/common/os.cpp +++ b/src/gallium/drivers/swr/rasterizer/common/os.cpp @@ -22,8 +22,14 @@ ****************************************************************************/ #include "common/os.h" +#include +#include -#if defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) +#if defined(_WIN32) +#include +#endif // Windows + +#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) #include #endif // Linux @@ -105,3 +111,43 @@ void SWR_API SetCurrentThreadName(const char* pThreadName) pthread_setname_np(pthread_self(), pThreadName); #endif // Linux } + +static void SplitString(std::vector& out_segments, const std::string& input, char splitToken) +{ + out_segments.clear(); + + std::istringstream f(input); + std::string s; + while (std::getline(f, s, splitToken)) + { + if (s.size()) + { + out_segments.push_back(s); + } + } +} + +void SWR_API CreateDirectoryPath(const std::string& path) +{ +#if defined(_WIN32) + SHCreateDirectoryExA(nullptr, path.c_str(), nullptr); +#endif // Windows + +#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__) + std::vector pathSegments; + SplitString(pathSegments, path, '/'); + + std::string tmpPath; + for (auto const& segment : pathSegments) + { + tmpPath.push_back('/'); + tmpPath += segment; + + int result = mkdir(tmpPath.c_str(), 0777); + if (result == -1 && errno != EEXIST) + { + break; + } + } +#endif // Unix +} diff --git a/src/gallium/drivers/swr/rasterizer/common/os.h b/src/gallium/drivers/swr/rasterizer/common/os.h index f9b6ccaee82..6e4d98f13fc 100644 --- a/src/gallium/drivers/swr/rasterizer/common/os.h +++ b/src/gallium/drivers/swr/rasterizer/common/os.h @@ -234,8 +234,6 @@ void AlignedFree(void* p) pid_t gettid(void); #define GetCurrentThreadId gettid -#define CreateDirectory(name, pSecurity) mkdir(name, 0777) - #define InterlockedCompareExchange(Dest, Exchange, Comparand) __sync_val_compare_and_swap(Dest, Comparand, Exchange) #define InterlockedExchangeAdd(Addend, Value) __sync_fetch_and_add(Addend, Value) #define InterlockedDecrement(Append) __sync_sub_and_fetch(Append, 1) @@ -281,5 +279,6 @@ typedef MEGABYTE GIGABYTE[1024]; // Defined in os.cpp void SWR_API SetCurrentThreadName(const char* pThreadName); +void SWR_API CreateDirectoryPath(const std::string& path); #endif//__SWR_OS_H__ diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp index 5d8ad273d36..2009db09feb 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp @@ -159,9 +159,9 @@ JitManager::JitManager(uint32_t simdWidth, const char *arch, const char* core) #if defined(_WIN32) if (KNOB_DUMP_SHADER_IR) { - CreateDirectory(INTEL_OUTPUT_DIR, NULL); - CreateDirectory(SWR_OUTPUT_DIR, NULL); - CreateDirectory(JITTER_OUTPUT_DIR, NULL); + CreateDirectoryPath(INTEL_OUTPUT_DIR); + CreateDirectoryPath(SWR_OUTPUT_DIR); + CreateDirectoryPath(JITTER_OUTPUT_DIR); } #endif } @@ -204,7 +204,7 @@ void JitManager::DumpAsm(Function* pFunction, const char* fileName) const char* pBaseName = strrchr(procname, '\\'); std::stringstream outDir; outDir << JITTER_OUTPUT_DIR << pBaseName << "_" << pid << std::ends; - CreateDirectory(outDir.str().c_str(), NULL); + CreateDirectoryPath(outDir.str().c_str()); #endif std::error_code EC; @@ -242,7 +242,7 @@ void JitManager::DumpToFile(Function *f, const char *fileName) const char* pBaseName = strrchr(procname, '\\'); std::stringstream outDir; outDir << JITTER_OUTPUT_DIR << pBaseName << "_" << pid << std::ends; - CreateDirectory(outDir.str().c_str(), NULL); + CreateDirectoryPath(outDir.str().c_str()); #endif std::error_code EC; -- 2.30.2