mirror of
https://github.com/systemd/systemd
synced 2024-10-15 04:24:19 +00:00
resolved: flush caches on memory pressure and support SIGRTMIN+18
This commit is contained in:
parent
9b2c161481
commit
bb3517181b
|
@ -543,6 +543,30 @@ static int manager_sigrtmin1(sd_event_source *s, const struct signalfd_siginfo *
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int manager_memory_pressure(sd_event_source *s, void *userdata) {
|
||||
Manager *m = ASSERT_PTR(userdata);
|
||||
|
||||
log_info("Under memory pressure, flushing caches.");
|
||||
|
||||
manager_flush_caches(m, LOG_INFO);
|
||||
sd_event_trim_memory();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int manager_memory_pressure_listen(Manager *m) {
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
|
||||
r = sd_event_add_memory_pressure(m->event, NULL, manager_memory_pressure, m);
|
||||
if (r < 0)
|
||||
log_full_errno(ERRNO_IS_NOT_SUPPORTED(r) || ERRNO_IS_PRIVILEGE(r) || (r == -EHOSTDOWN )? LOG_DEBUG : LOG_NOTICE, r,
|
||||
"Failed to install memory pressure event source, ignoring: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int manager_new(Manager **ret) {
|
||||
_cleanup_(manager_freep) Manager *m = NULL;
|
||||
int r;
|
||||
|
@ -572,6 +596,9 @@ int manager_new(Manager **ret) {
|
|||
.need_builtin_fallbacks = true,
|
||||
.etc_hosts_last = USEC_INFINITY,
|
||||
.read_etc_hosts = true,
|
||||
|
||||
.sigrtmin18_info.memory_pressure_handler = manager_memory_pressure,
|
||||
.sigrtmin18_info.memory_pressure_userdata = m,
|
||||
};
|
||||
|
||||
r = dns_trust_anchor_load(&m->trust_anchor);
|
||||
|
@ -621,6 +648,10 @@ int manager_new(Manager **ret) {
|
|||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = manager_memory_pressure_listen(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = manager_connect_bus(m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
@ -628,6 +659,7 @@ int manager_new(Manager **ret) {
|
|||
(void) sd_event_add_signal(m->event, &m->sigusr1_event_source, SIGUSR1, manager_sigusr1, m);
|
||||
(void) sd_event_add_signal(m->event, &m->sigusr2_event_source, SIGUSR2, manager_sigusr2, m);
|
||||
(void) sd_event_add_signal(m->event, &m->sigrtmin1_event_source, SIGRTMIN+1, manager_sigrtmin1, m);
|
||||
(void) sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, &m->sigrtmin18_info);
|
||||
|
||||
manager_cleanup_saved_user(m);
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "sd-netlink.h"
|
||||
#include "sd-network.h"
|
||||
|
||||
#include "common-signal.h"
|
||||
#include "hashmap.h"
|
||||
#include "list.h"
|
||||
#include "ordered-set.h"
|
||||
|
@ -156,6 +157,8 @@ struct Manager {
|
|||
LIST_HEAD(SocketGraveyard, socket_graveyard);
|
||||
SocketGraveyard *socket_graveyard_oldest;
|
||||
size_t n_socket_graveyard;
|
||||
|
||||
struct sigrtmin18_info sigrtmin18_info;
|
||||
};
|
||||
|
||||
/* Manager */
|
||||
|
|
|
@ -67,7 +67,7 @@ static int run(int argc, char *argv[]) {
|
|||
return log_error_errno(r, "Failed to drop privileges: %m");
|
||||
}
|
||||
|
||||
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0);
|
||||
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18, -1) >= 0);
|
||||
|
||||
r = manager_new(&m);
|
||||
if (r < 0)
|
||||
|
|
Loading…
Reference in a new issue