Subject: Re: progress.c does not compile under Mac OS X

From: Jonas 'Sortie' Termansen <[email-masked]>
Date: Sun, 31 Aug 2014 01:12:31 +0200

Oh,

I'm a bit confused here - lots of things happening. Submitting patches to
projects is usually fairly simple; it's excitingly fresh to get a bunch of
replies, having the patch set revised, more replies, then a further revised
patch set gets merged to a development branch, and then I get suddenly get
emails about breaking the build on OS X. Let's see if I can figure this out. :-)

My original patch had a minor bug where it forgot to compatibility-wrap the
CLOCK_MONOTONIC constant. Surprisingly, it turns out even in 2014 OS X doesn't
have the clock_gettime interface. What a silly operating system.

Jacob Keller revised my patch set and added compatibility macros that emulate
timer_foo using setitimer. Turns out, it had a few typos of its own.

The revised patch set got slightly changed and was merged to the pu branch,
which is where you are having build trouble now.

Alright, so to recover, first appropriately add this to git-compat-util.h:

+#ifndef CLOCK_MOTOTONIC
+#define CLOCK_MONOTONIC 1 /* dummy */
+#define

Secondly, there is a typo where an underscore is used instead of a period.

-       _ivalue_it_value.tv_usec = value.it_value.tv_nsec / 1000L;              \
+       _ivalue.it_value.tv_usec = value.it_value.tv_nsec / 1000L;              \

Third, there needs to be an end brace before the while:

-while (0)
+} while (0)

That should fix the immediate breakage, I believe.

Looking closer, there are a bunch of additional issues here:

+#define timer_create(clockid, sevp, timerp) ((void) (clockid), (void) (sevp), (void) (timerp), errno = ENOSYS, -1)
+#define timer_create(clockid, sevp, timerp) ((void) (clockid), (void) (sevp), (void) (timerp), 0)

This emulates a timer_create that always fails. That's not what we are trying to
do, we want to emulate one that always works. It should return 0 instead of
setting errno to ENOSYS and returning -1. (My original patch set made the
replacement timer_create this this way, but at that time I was not trying to
emulate the interface, just stub it.)

Finally patch set also fails to break with platforms with a broken timer_settime
but a working setitimer. If that is something we want to support? Might as well.

On 08/30/2014 10:37 PM, Torsten Bögershausen wrote:
> And then we have the question why we do not check the return value of
> timer_create() in progress.c#66:

It's because the old code didn't check the result value. Secondly it's because
this code is non-essential, if it fails, there is really no choice but to carry
on anyways. I admit it's probably not a good idea to make timer_settime time
with an uninitialized timer id. The likelihood is low though as git only needs
one timer - but I agree it's prudent to check the error codes.

On 08/30/2014 10:37 PM, Torsten Bögershausen wrote:
> It feels as if the macros in git-compat-util.h could be converted into real
> functions, in compat/timer_settime.c (or so) so that we can test-compile under
> Linux)

This is my preferred route as well.

I hope that sorts things out. I'll be submitting a full V2 of my patch set
shortly that should work reliably on all systems. For now, you can fix the build
by applying the above fixes, or perhaps revert the commits as they are
troublesome. :-)

Jonas