Re: [PATCH v3] Support for setitimer() on platforms lacking it

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH v3] Support for setitimer() on platforms lacking it

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:54:39

"Joachim Schmitz" [off-list ref] writes:
HP NonStop (currently) doesn't have setitimer(). The previous attempt of an
emulation (reverted by this commit) was not a real substitute for a recurring
itimer (as here we also don't have SA_RESTART, so can't re-arm the timer).
As setitimer() is only used in cases of perceived latency and it doesn't affect
correctness, it now gets disabled entirely, if NO_SETITIMER is set.
HP NonStop does provide struct itimerval, but other platforms may not, so this
is taken care of in this commit too, by setting NO_STRUCT_ITIMERVAL.

Signed-off-by: Joachim Schmitz <redacted>
The end-result looks simple and nice (thanks for NO_STRUCT_ITIMERVAL).

As we are not going to include the earlier failed attempt in our
longer-term history (i.e. 'master', that never rewinds), however,
I would prefer to see a replacement patch (as opposed to this one
that incrementally updates the previous failed attempt).  I could
squash this into the previous one myself though ;-)

Thanks.
quoted hunk
---
 Makefile          |  5 +++++
 compat/itimer.c   | 50 --------------------------------------------------
 git-compat-util.h | 11 +++++++++--
 3 files changed, 14 insertions(+), 52 deletions(-)
 delete mode 100644 compat/itimer.c
diff --git a/Makefile b/Makefile
index ac49320..7be555b 100644
--- a/Makefile
+++ b/Makefile
@@ -157,6 +157,11 @@ all::
 # Define NO_PREAD if you have a problem with pread() system call (e.g.
 # cygwin1.dll before v1.5.22).
 #
+# Define NO_SETITIMER if you don't have setitimer()
+#
+# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
+# This also implies NO_SETITIMER
+#
 # Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
 # thread-safe. (e.g. compat/pread.c or cygwin)
 #
diff --git a/compat/itimer.c b/compat/itimer.c
deleted file mode 100644
index 713f1ff..0000000
--- a/compat/itimer.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "../git-compat-util.h"
-
-static int git_getitimer(int which, struct itimerval *value)
-{
-	int ret = 0;
-
-	switch (which) {
-		case ITIMER_REAL:
-			value->it_value.tv_usec = 0;
-			value->it_value.tv_sec = alarm(0);
-			ret = 0; /* if alarm() fails, we get a SIGLIMIT */
-			break;
-		case ITIMER_VIRTUAL: /* FALLTHRU */
-		case ITIMER_PROF: errno = ENOTSUP; ret = -1; break;
-		default: errno = EINVAL; ret = -1;
-	}
-	return ret;
-}
-
-int git_setitimer(int which, const struct itimerval *value,
-				struct itimerval *ovalue)
-{
-	int ret = 0;
-
-	if (!value
-		|| value->it_value.tv_usec < 0
-		|| value->it_value.tv_usec > 1000000
-		|| value->it_value.tv_sec < 0) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	else if (ovalue)
-		if (!git_getitimer(which, ovalue))
-			return -1; /* errno set in git_getitimer() */
-
-	else
-	switch (which) {
-		case ITIMER_REAL:
-			alarm(value->it_value.tv_sec +
-				(value->it_value.tv_usec > 0) ? 1 : 0);
-			ret = 0; /* if alarm() fails, we get a SIGLIMIT */
-			break;
-		case ITIMER_VIRTUAL: /* FALLTHRU */
-		case ITIMER_PROF: errno = ENOTSUP; ret = -1; break;
-		default: errno = EINVAL; ret = -1;
-	}
-
-	return ret;
-}
diff --git a/git-compat-util.h b/git-compat-util.h
index 18089f0..4628d7a 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -162,9 +162,16 @@
 #define probe_utf8_pathname_composition(a,b)
 #endif
 
+#ifdef NO_STRUCT_ITIMERVAL
+struct itimerval {
+	struct timeval it_interval;
+	struct timeval it_value;
+}
+#define NO_SETITIMER
+#endif
+
 #ifdef NO_SETITIMER
-#define setitimer(a,b,c) git_setitimer((a),(b),(c))
-extern int git_setitimer(int, const struct itimerval *, struct itimerval *);
+#define setitimer(which,value,ovalue)
 #endif
 
 #ifdef MKDIR_WO_TRAILING_SLASH

RE: [PATCH v3] Support for setitimer() on platforms lacking it

From: Joachim Schmitz <hidden>
Date: 2016-06-15 22:54:39

From: Junio C Hamano [mailto:gitster@pobox.com]
Sent: Friday, September 07, 2012 6:41 PM
To: Joachim Schmitz
Cc: git@vger.kernel.org
Subject: Re: [PATCH v3] Support for setitimer() on platforms lacking it

"Joachim Schmitz" [off-list ref] writes:
quoted
HP NonStop (currently) doesn't have setitimer(). The previous attempt of an
emulation (reverted by this commit) was not a real substitute for a recurring
itimer (as here we also don't have SA_RESTART, so can't re-arm the timer).
As setitimer() is only used in cases of perceived latency and it doesn't affect
correctness, it now gets disabled entirely, if NO_SETITIMER is set.
HP NonStop does provide struct itimerval, but other platforms may not, so this
is taken care of in this commit too, by setting NO_STRUCT_ITIMERVAL.

Signed-off-by: Joachim Schmitz <redacted>
The end-result looks simple and nice (thanks for NO_STRUCT_ITIMERVAL).

As we are not going to include the earlier failed attempt in our
longer-term history (i.e. 'master', that never rewinds), however,
I would prefer to see a replacement patch (as opposed to this one
that incrementally updates the previous failed attempt).  I could
squash this into the previous one myself though ;-)
Yes, please ;-)

Bye, Jojo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help