SHA256
1
0
forked from pool/systemd
systemd/0001-core-close-socket-fds-asynchronously.patch
Stephan Kulow 0e288fc9c5 Accepting request 239780 from Base:System
- Add upstream patch
  0001-machine-don-t-return-uninitialized-variable.patch
- Port and add upstream patch
  0002-vconsole-setup-run-setfont-before-loadkeys.patch

- Rename
  0001-udev-net_setup_link-add-a-bit-more-logging.patch
  to
  1048-udev-net_setup_link-add-a-bit-more-logging.patch 

- Port and add upstream patches
  0001-udev-net_setup_link-add-a-bit-more-logging.patch
  0003-namespace-make-sure-tmp-var-tmp-and-dev-are-writable.patch
  0002-namespace-fix-uninitialized-memory-access.patch

- Add upstream patches
  0001-architecture-Add-tilegx.patch
  0002-architecture-Add-cris.patch
  0003-arch-add-crisv32-to-uname-check.patch
  0004-architecture-remove-cris-from-uname-list.patch

- Add upstream patches
  0006-hwdb-update.patch
  0007-hwdb-Update-database-of-Bluetooth-company-identifier.patch

- Add upstream patches
  0001-parse_uid-return-ENXIO-for-1-uids.patch
  0002-util-when-unescaping-strings-don-t-allow-smuggling-i.patch
  0003-localed-consider-an-unset-model-as-a-wildcard.patch
  0004-sd-bus-when-an-event-loop-terminates-explicitly-clos.patch

OBS-URL: https://build.opensuse.org/request/show/239780
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=191
2014-07-12 15:14:24 +00:00

77 lines
2.3 KiB
Diff

Based on 574634bcacb01efe15ca2742effd461a5b7afb5f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Date: Tue, 13 May 2014 23:22:13 +0200
Subject: [PATCH] core: close socket fds asynchronously
http://lists.freedesktop.org/archives/systemd-devel/2014-April/018928.html
---
src/core/async.c | 24 ++++++++++++++++++++++++
src/core/service.c | 5 +++--
2 files changed, 27 insertions(+), 2 deletions(-)
--- src/core/service.c
+++ src/core/service.c 2014-05-16 11:41:50.150735247 +0000
@@ -25,6 +25,7 @@
#include <unistd.h>
#include <sys/reboot.h>
+#include "async.h"
#include "manager.h"
#include "unit.h"
#include "service.h"
@@ -240,7 +241,7 @@ static void service_close_socket_fd(Serv
if (s->socket_fd < 0)
return;
- close_nointr_nofail(s->socket_fd);
+ asynchronous_close(s->socket_fd);
s->socket_fd = -1;
}
@@ -2767,7 +2768,7 @@ static int service_deserialize_item(Unit
else {
if (s->socket_fd >= 0)
- close_nointr_nofail(s->socket_fd);
+ asynchronous_close(s->socket_fd);
s->socket_fd = fdset_remove(fds, fd);
}
} else if (streq(key, "main-exec-status-pid")) {
--- src/core/async.c
+++ src/core/async.c 2014-05-07 09:40:35.000000000 +0000
@@ -24,6 +24,7 @@
#include "async.h"
#include "log.h"
+#include "util.h"
int asynchronous_job(void* (*func)(void *p), void *arg) {
pthread_attr_t a;
@@ -70,3 +71,26 @@ int asynchronous_sync(void) {
return asynchronous_job(sync_thread, NULL);
}
+
+static void *close_thread(void *p) {
+ int fd = PTR_TO_INT(p);
+ if (fd >= 0)
+ close_nointr_nofail(fd);
+ return NULL;
+}
+
+int asynchronous_close(int fd) {
+ int r;
+
+ /* This is supposed to behave similar to safe_close(), but
+ * actually invoke close() asynchronously, so that it will
+ * never block. Ideally the kernel would have an API for this,
+ * but it doesn't, so we work around it, and hide this as a
+ * far away as we can. */
+
+ r = asynchronous_job(close_thread, INT_TO_PTR(fd));
+ if (r < 0 && fd >= 0)
+ close_nointr_nofail(fd);
+
+ return -1;
+}