****************************************************************************/
#include "common/os.h"
+#include <vector>
+#include <sstream>
-#if defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__)
+#if defined(_WIN32)
+#include <shlobj.h>
+#endif // Windows
+
+#if defined(__APPLE__) || defined(FORCE_LINUX) || defined(__linux__) || defined(__gnu_linux__)
#include <pthread.h>
#endif // Linux
pthread_setname_np(pthread_self(), pThreadName);
#endif // Linux
}
+
+static void SplitString(std::vector<std::string>& 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<std::string> 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
+}
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)
// Defined in os.cpp
void SWR_API SetCurrentThreadName(const char* pThreadName);
+void SWR_API CreateDirectoryPath(const std::string& path);
#endif//__SWR_OS_H__
#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
}
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;
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;