fish-shell/src/wait_handle.cpp
ridiculousfish 82fd8fe9fb Refactor wait handles
In preparation for using wait handles in --on-process-exit events, factor
wait handles into their own wait handle store. Also switch them to
per-process instead of per-job, which is a simplification.
2021-05-17 15:25:21 -07:00

47 lines
1.3 KiB
C++

#include "config.h"
#include "wait_handle.h"
#include "flog.h"
wait_handle_store_t::wait_handle_store_t(size_t limit) : limit_(limit) {}
void wait_handle_store_t::add(wait_handle_ref_t wh) {
if (!wh || wh->pid <= 0) return;
pid_t pid = wh->pid;
remove_by_pid(wh->pid);
handles_.push_front(std::move(wh));
handle_map_[pid] = std::begin(handles_);
// Remove oldest until we reach our limit.
while (handles_.size() > limit_) {
handle_map_.erase(handles_.back()->pid);
handles_.pop_back();
}
}
void wait_handle_store_t::remove(const wait_handle_ref_t &wh) {
// Note: this differs from remove_by_pid because we verify that the handle is the same.
if (!wh) return;
auto iter = handle_map_.find(wh->pid);
if (iter != handle_map_.end() && *iter->second == wh) {
// Note this may deallocate the wait handle, leaving it dangling.
handles_.erase(iter->second);
handle_map_.erase(iter);
}
}
void wait_handle_store_t::remove_by_pid(pid_t pid) {
auto iter = handle_map_.find(pid);
if (iter != handle_map_.end()) {
handles_.erase(iter->second);
handle_map_.erase(iter);
}
}
wait_handle_ref_t wait_handle_store_t::get_by_pid(pid_t pid) const {
auto iter = handle_map_.find(pid);
if (iter == handle_map_.end()) return nullptr;
return *iter->second;
}