RE: [PATCH v3] Support for setitimer() on platforms lacking it
From: Joachim Schmitz [mailto:j...@schmitz-digital.de] Sent: Friday, September 07, 2012 11:55 AM To: 'Junio C Hamano' Cc: 'git@vger.kernel.org' Subject: RE: [PATCH v3] Support for setitimer() on platforms lacking it 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 j...@schmitz-digital.de --- 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) # Here too (just like in my MKDIR_WO_TRAILING_SLASH patch) it is missing the part that adds ifdef NO_STRUCT_ITIMERVAL COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL NO_SETITIMER=YesPlease endif ifdef NO_SETITIMER COMPAT_CFLAGS += -DNO_SETITIMER endif diff --git a/compat/itimer.c b/compat/itimer.c deleted file mode 100644 index 713f1ff..000 --- 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 100 - || 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 The above line gets obsolete with further up mentioned change in Makefile +#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 -- 1.7.12 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3] Support for setitimer() on platforms lacking it
Joachim Schmitz j...@schmitz-digital.de 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 j...@schmitz-digital.de 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. --- 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..000 --- 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 100 - || 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 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v3] Support for setitimer() on platforms lacking it
From: Junio C Hamano [mailto:gits...@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 j...@schmitz-digital.de 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 j...@schmitz-digital.de 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 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html