Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 May 2012 21:28:37 +0400
From:      Dmitry Marakasov <amdmi3@amdmi3.ru>
To:        bug-followup@FreeBSD.org
Cc:        multimedia@FreeBSD.org
Subject:   Re: ports/167971: [PATCH] audio/jack: ALSA driver is broken
Message-ID:  <20120516172837.GD15922@hades.panopticon>
In-Reply-To: <20120516160955.1668170D@hades.panopticon>
References:  <20120516160955.1668170D@hades.panopticon>

next in thread | previous in thread | raw e-mail | index | archive | help
* Dmitry Marakasov (amdmi3@amdmi3.ru) wrote:
> Since the second argument of clock_nanosleep (flags) is 0, ts still specifies a relative time, so theoretically the call may be replaced with simple nanosleep(&ts, NULL). I'm, however, unaware of differences between CLOCK_MONOTONIC and other clock types, as well as which of them is used by FreeBSD's nanosleep(), so it may have implications.

NB: the same fix is used in multimedia/gavl
file:///usr/ports/multimedia/gavl/files/patch-gavl-time.c

and, judging from Linux man it should be safe:

http://linux.die.net/man/2/nanosleep:
---
POSIX.1 specifies that nanosleep() should measure time against the
CLOCK_REALTIME clock. However, Linux measures the time using the
CLOCK_MONOTONIC clock. This probably does not matter, since the POSIX.1
specification for clock_settime(2) says that discontinuous changes in
CLOCK_REALTIME should not affect nanosleep()
---

Thus, if FreeBSD nanosleep conforms to POSIX.1, it shouldn't matter for
FreeBSD as well, so clock_nanosleep(CLOCK_MONOTONIC, 0, ...) ->
nanosleep(...) replacement is safe.

Thus, the PR is fixed by this patch
(http://people.freebsd.org/~amdmi3/patch-drivers-alsa-midi-alsa_rawmidi.c):

--- ./drivers/alsa-midi/alsa_rawmidi.c.orig	2008-05-29 16:26:07.000000000 +0400
+++ ./drivers/alsa-midi/alsa_rawmidi.c	2012-05-16 20:10:24.645166068 +0400
@@ -853,7 +853,7 @@
 			struct timespec ts;
 			ts.tv_sec = 0;
 			ts.tv_nsec = wait_nanosleep;
-			clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
+			nanosleep(&ts, NULL);
 		}
 		int res = poll((struct pollfd*)&pfds, npfds, poll_timeout);
 		//debug_log("midi_thread(%s): poll exit: %d", str->name, res);

-- 
Dmitry Marakasov   .   55B5 0596 FF1E 8D84 5F56  9510 D35A 80DD F9D2 F77D
amdmi3@amdmi3.ru  ..:  jabber: amdmi3@jabber.ru    http://www.amdmi3.ru



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120516172837.GD15922>