ccls/src/platform_posix.cc

81 lines
1.8 KiB
C++
Raw Normal View History

2018-08-21 05:27:52 +00:00
// Copyright 2017-2018 ccls Authors
// SPDX-License-Identifier: Apache-2.0
#if defined(__unix__) || defined(__APPLE__)
2018-10-29 04:21:21 +00:00
#include "platform.hh"
2017-03-04 01:45:20 +00:00
2018-10-29 04:21:21 +00:00
#include "utils.hh"
2017-03-04 01:45:20 +00:00
#include <assert.h>
2017-09-22 01:14:57 +00:00
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
2017-04-18 17:21:53 +00:00
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <signal.h>
#include <sys/resource.h>
#include <sys/stat.h>
2018-08-09 17:08:14 +00:00
#include <sys/types.h> // required for stat.h
#include <sys/wait.h>
2018-08-09 17:08:14 +00:00
#include <unistd.h>
#ifdef __GLIBC__
2017-12-23 16:01:43 +00:00
#include <malloc.h>
2017-10-31 22:43:07 +00:00
#endif
2018-10-15 08:26:13 +00:00
#include <llvm/ADT/SmallString.h>
#include <llvm/Support/Path.h>
#include <atomic>
#include <condition_variable>
#include <mutex>
2018-10-15 08:26:13 +00:00
#include <string>
namespace ccls {
namespace pipeline {
void ThreadEnter();
}
2018-08-09 17:08:14 +00:00
std::string NormalizePath(const std::string &path) {
2018-10-15 08:26:13 +00:00
llvm::SmallString<256> P(path);
llvm::sys::path::remove_dots(P, true);
return {P.data(), P.size()};
2017-03-28 01:47:12 +00:00
}
2017-08-17 18:02:47 +00:00
void FreeUnusedMemory() {
#ifdef __GLIBC__
malloc_trim(4 * 1024 * 1024);
2017-10-31 22:43:07 +00:00
#endif
2017-08-17 18:02:47 +00:00
}
void TraceMe() {
// If the environment variable is defined, wait for a debugger.
2018-03-31 03:16:33 +00:00
// In gdb, you need to invoke `signal SIGCONT` if you want ccls to continue
// after detaching.
2018-08-09 17:08:14 +00:00
const char *traceme = getenv("CCLS_TRACEME");
if (traceme)
raise(traceme[0] == 's' ? SIGSTOP : SIGTSTP);
}
void SpawnThread(void *(*fn)(void *), void *arg) {
pthread_t thd;
pthread_attr_t attr;
struct rlimit rlim;
size_t stack_size = 4 * 1024 * 1024;
if (getrlimit(RLIMIT_STACK, &rlim) == 0 && rlim.rlim_cur != RLIM_INFINITY)
stack_size = rlim.rlim_cur;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setstacksize(&attr, stack_size);
pipeline::ThreadEnter();
pthread_create(&thd, &attr, fn, arg);
pthread_attr_destroy(&attr);
}
} // namespace ccls
2017-03-21 17:06:22 +00:00
#endif