23bool areFdsValid(
int ReadFD,
int WriteFD) {
24 if (ReadFD == -1 || WriteFD == -1)
27 return ::fcntl(ReadFD, F_GETFD) != -1 && ::fcntl(WriteFD, F_GETFD) != -1;
37JobserverClientImpl::JobserverClientImpl(
const JobserverConfig &Config) {
38 switch (Config.TheMode) {
39 case JobserverConfig::PosixPipe: {
41 int NewReadFD = ::dup(Config.PipeFDs.Read);
44 int NewWriteFD = ::dup(Config.PipeFDs.Write);
50 if (::fcntl(NewReadFD, F_SETFD, FD_CLOEXEC) == -1 ||
51 ::fcntl(NewWriteFD, F_SETFD, FD_CLOEXEC) == -1) {
57 int flags = ::fcntl(NewReadFD, F_GETFL, 0);
58 if (flags == -1 || ::fcntl(NewReadFD, F_SETFL, flags | O_NONBLOCK) == -1) {
67 case JobserverConfig::PosixFifo:
69 ReadFD = ::open(Config.Path.c_str(), O_RDONLY | O_NONBLOCK | O_CLOEXEC);
76 FifoPath = Config.Path;
87 SmallVector<JobSlot, 8> Slots;
89 auto S = tryAcquire();
92 Slots.push_back(std::move(S));
94 NumJobs = Slots.size();
95 assert(NumJobs >= 1 &&
"Invalid number of jobs");
101JobserverClientImpl::~JobserverClientImpl() {
114JobSlot JobserverClientImpl::tryAcquire() {
119 if (HasImplicitSlot.exchange(
false, std::memory_order_acquire)) {
121 return JobSlot::createImplicit();
126 LLVM_DEBUG(
dbgs() <<
"Attempting to read token from FD " << ReadFD <<
".\n");
129 Ret = ::read(ReadFD, &Token, 1);
130 }
while (Ret < 0 && errno == EINTR);
133 LLVM_DEBUG(
dbgs() <<
"Acquired explicit token '" << Token <<
"'.\n");
134 return JobSlot::createExplicit(
static_cast<uint8_t>(Token));
137 LLVM_DEBUG(
dbgs() <<
"Failed to acquire job slot, read returned " << Ret
147void JobserverClientImpl::release(JobSlot Slot) {
152 if (
Slot.isImplicit()) {
154 [[maybe_unused]]
bool was_already_released =
155 HasImplicitSlot.exchange(
true, std::memory_order_release);
156 assert(!was_already_released &&
"Implicit slot released twice");
161 LLVM_DEBUG(
dbgs() <<
"Releasing explicit token '" << (
char)Token <<
"' to FD "
162 << WriteFD <<
".\n");
167 LLVM_DEBUG(
dbgs() <<
"WriteFD is invalid, opening FIFO: " << FifoPath
169 WriteFD = ::open(FifoPath.c_str(), O_WRONLY | O_CLOEXEC);
174 LLVM_DEBUG(
dbgs() <<
"Opened FIFO as new WriteFD: " << WriteFD <<
"\n");
180 Written =
::write(WriteFD, &Token, 1);
181 }
while (Written < 0 && errno == EINTR);
184 LLVM_DEBUG(
dbgs() <<
"Failed to write token to pipe, write returned "
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void write(bool isBE, void *P, T V)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.