Github messages for voidlinux
 help / color / mirror / Atom feed
* [PR PATCH] imv: add patch for behavior under musl.
@ 2020-10-21 23:58 ericonr
  2020-10-22  0:35 ` [PR PATCH] [Closed]: " ericonr
  0 siblings, 1 reply; 2+ messages in thread
From: ericonr @ 2020-10-21 23:58 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 319 bytes --]

There is a new pull request by ericonr against master on the void-packages repository

https://github.com/ericonr/void-packages im
https://github.com/void-linux/void-packages/pull/25778

imv: add patch for behavior under musl.


A patch file from https://github.com/void-linux/void-packages/pull/25778.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-im-25778.patch --]
[-- Type: text/x-diff, Size: 5082 bytes --]

From d66d0f80a79ebf34ebdef0e5d2b33b25f46eaa7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=89rico=20Rolim?= <erico.erc@gmail.com>
Date: Wed, 21 Oct 2020 19:35:51 -0300
Subject: [PATCH] imv: add patch for behavior under musl.

---
 srcpkgs/imv/patches/musl.patch | 126 +++++++++++++++++++++++++++++++++
 srcpkgs/imv/template           |   2 +-
 2 files changed, 127 insertions(+), 1 deletion(-)
 create mode 100644 srcpkgs/imv/patches/musl.patch

diff --git a/srcpkgs/imv/patches/musl.patch b/srcpkgs/imv/patches/musl.patch
new file mode 100644
index 00000000000..548b489082f
--- /dev/null
+++ b/srcpkgs/imv/patches/musl.patch
@@ -0,0 +1,126 @@
+From b6d4c5ddc594f720f4be3276c6196e7cd76fb121 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=89rico=20Rolim?= <erico.erc@gmail.com>
+Date: Wed, 21 Oct 2020 18:52:51 -0300
+Subject: [PATCH] imv: don't rely on glibc's lack of FILE sync on exit.
+
+This issue was spotted on musl, where killing imv with the Q shortcut
+while it was waiting for image paths in stdin led to the application
+hanging until stdin received an EOF manually with ^D, since the stdin
+stream was locked by the fgets() function.
+
+Switching to pipes and a helper thread allows us to use read() for
+reading from STDIN_FILENO while still taking advantage of the fgets()
+logic for handling newlines and buffer size. read() is a thread
+cancellation point (fgets() is only an optional one), which makes it
+possible to cancel the helper thread cleanly and force the thread using
+fgets() to exit when the write-end of the pipe it's reading from is
+closed.
+---
+ src/imv.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 55 insertions(+), 2 deletions(-)
+
+diff --git a/src/imv.c b/src/imv.c
+index 100fac3..b1e287b 100644
+--- src/imv.c
++++ src/imv.c
+@@ -129,6 +129,9 @@ struct imv {
+   /* read paths from stdin, as opposed to image data */
+   bool paths_from_stdin;
+ 
++  /* FILE to use when reading paths from stdin */
++  FILE *stdin_pipe;
++
+   /* scale up / down images to match window, or actual size */
+   enum scaling_mode scaling_mode;
+ 
+@@ -658,6 +661,10 @@ void imv_free(struct imv *imv)
+ 
+   list_free(imv->startup_commands);
+ 
++  if (imv->stdin_pipe) {
++    fclose(imv->stdin_pipe);
++  }
++
+   free(imv);
+ }
+ 
+@@ -736,6 +743,24 @@ static bool parse_initial_pan(struct imv *imv, const char *pan_params)
+   return true;
+ }
+ 
++static void *pipe_stdin(void *data)
++{
++  int *fd = data;
++  while (1) {
++    char buf[PIPE_BUF];
++    ssize_t err = read(STDIN_FILENO, buf, PIPE_BUF);
++    if (err > 0) {
++      /* writes up to PIPE_BUF are atomic */
++      write(*fd, buf, err);
++    } else if (err == 0 || errno != EINTR) {
++      /* break if EOF or actual read error */
++      break;
++    }
++  }
++
++  return NULL;
++}
++
+ static void *load_paths_from_stdin(void *data)
+ {
+   struct imv *imv = data;
+@@ -743,7 +768,7 @@ static void *load_paths_from_stdin(void *data)
+   imv_log(IMV_INFO, "Reading paths from stdin...");
+ 
+   char buf[PATH_MAX];
+-  while (fgets(buf, sizeof(buf), stdin) != NULL) {
++  while (fgets(buf, sizeof(buf), imv->stdin_pipe) != NULL) {
+     size_t len = strlen(buf);
+     if (buf[len-1] == '\n') {
+       buf[--len] = 0;
+@@ -892,9 +917,27 @@ int imv_run(struct imv *imv)
+ 
+   /* if loading paths from stdin, kick off a thread to do that - we'll receive
+    * events back via internal events */
++  int *stdin_pipe_fds = NULL;
++  pthread_t pipe_stdin_thread;
+   if (imv->paths_from_stdin) {
++    /* this array is allocated on the heap because it's passed to pthread_create */
++    stdin_pipe_fds = calloc(2, sizeof *stdin_pipe_fds);
++
++    if (pipe(stdin_pipe_fds)) {
++      /* if pipe creation fails, we should exit */
++      free(stdin_pipe_fds);
++      return 1;
++    }
++
++    imv->stdin_pipe = fdopen(stdin_pipe_fds[0], "re");
++
+     pthread_t thread;
+-    pthread_create(&thread, NULL, load_paths_from_stdin, imv);
++    if (pthread_create(&thread, NULL, load_paths_from_stdin, imv)
++        || pthread_create(&pipe_stdin_thread, NULL, pipe_stdin, stdin_pipe_fds + 1)) {
++      return 1;
++    }
++
++    /* we don't need to join this thread */
+     pthread_detach(thread);
+   }
+ 
+@@ -1100,6 +1143,16 @@ int imv_run(struct imv *imv)
+       puts(imv_navigator_at(imv->navigator, i));
+   }
+ 
++  if (imv->paths_from_stdin) {
++    /* stop the thread before closing the pipe */
++    pthread_cancel(pipe_stdin_thread);
++    pthread_join(pipe_stdin_thread, NULL);
++
++    /* will cause the thread running load_paths_from_stdin() to exit */
++    close(stdin_pipe_fds[1]);
++    free(stdin_pipe_fds);
++  }
++
+   return 0;
+ }
+ 
diff --git a/srcpkgs/imv/template b/srcpkgs/imv/template
index ab5c45cd3a2..e7f1bbd99ef 100644
--- a/srcpkgs/imv/template
+++ b/srcpkgs/imv/template
@@ -1,7 +1,7 @@
 # Template file for 'imv'
 pkgname=imv
 version=4.1.0
-revision=2
+revision=3
 build_style=gnu-makefile
 hostmakedepends="asciidoc pkg-config"
 makedepends="cmocka-devel freeimage-devel glu-devel librsvg-devel libxkbcommon-devel

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PR PATCH] [Closed]: imv: add patch for behavior under musl.
  2020-10-21 23:58 [PR PATCH] imv: add patch for behavior under musl ericonr
@ 2020-10-22  0:35 ` ericonr
  0 siblings, 0 replies; 2+ messages in thread
From: ericonr @ 2020-10-22  0:35 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 173 bytes --]

There's a closed pull request on the void-packages repository

imv: add patch for behavior under musl.
https://github.com/void-linux/void-packages/pull/25778

Description:


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-10-22  0:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-21 23:58 [PR PATCH] imv: add patch for behavior under musl ericonr
2020-10-22  0:35 ` [PR PATCH] [Closed]: " ericonr

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).