(For alsa-de...@alsa-project.org I’ve attached the diffs this
eMail thread has been about, with hope you will apply them in
the next upstream release.)


Elimar Riesebieter dixit:

>it seems that you are an exclusive user of the x32 port ;-) Please

If you actually read that thread you’d know I’m not. (I wrote some
eMails to it, too.)

>Does it really make sense to maintain code for a handful of users?

It’s nothing architecture-specific if I recall, so it will reduce
the chance of problems for all users.

Lemme dissect the patch…

0009-fix-format-strings.patch: fixes, basically, this…

        printf("%ld", some_long_long_value);

… which is always an error, on platforms where time_t is larger
than long (which is currently all *64ilp32 platforms (there’s
x32, amd64ilp32, and a third one I forgot, already in existence),
but *will* encompass all ILP32 architectures as we get closer to
the year 2038).

0010-fix-testcase-typo.patch: not actually x32-related, but
noticed during porting.

0011-distinguish-x32-from-amd64.patch: this is the most important
one, and it’s a frigging oneliner:

-#elif defined(__x86_64__)
+#elif defined(__x86_64__) && !defined(__ILP32__)

This one literally only affects x32, indeed (so what I said above
was proven misremembered) but it’s obviously non-harmful to anything
else and easy to carry and forward.

So I’d wish you’d do that as it’s your duty as maintainer of a Debian
package, but alas… I’ll Cc the eMail address you told me and hope
that someone picks it up.

Blessed yuletide,
//mirabilos
-- 
“It is inappropriate to require that a time represented as
 seconds since the Epoch precisely represent the number of
 seconds between the referenced time and the Epoch.”
        -- IEEE Std 1003.1b-1993 (POSIX) Section B.2.2.2
# DP: fix long vs. long long confusion when there is a 64-bit time_t
# DP: on a 32-bit long system, such as all newer 32-bit architectures

--- a/src/pcm/pcm.c
+++ b/src/pcm/pcm.c
@@ -2257,11 +2257,11 @@ int snd_pcm_status_dump(snd_pcm_status_t
 {
        assert(status);
        snd_output_printf(out, "  state       : %s\n", 
snd_pcm_state_name((snd_pcm_state_t) status->state));
-       snd_output_printf(out, "  trigger_time: %ld.%06ld\n",
-                         status->trigger_tstamp.tv_sec,
-                         status->trigger_tstamp.tv_nsec / 1000);
-       snd_output_printf(out, "  tstamp      : %ld.%06ld\n",
-               status->tstamp.tv_sec, status->tstamp.tv_nsec / 1000);
+       snd_output_printf(out, "  trigger_time: %lld.%06ld\n",
+                         (long long)status->trigger_tstamp.tv_sec,
+                         (long)status->trigger_tstamp.tv_nsec / 1000L);
+       snd_output_printf(out, "  tstamp      : %lld.%06ld\n",
+               (long long)status->tstamp.tv_sec, (long)status->tstamp.tv_nsec 
/ 1000L);
        snd_output_printf(out, "  delay       : %ld\n", (long)status->delay);
        snd_output_printf(out, "  avail       : %ld\n", (long)status->avail);
        snd_output_printf(out, "  avail_max   : %ld\n", 
(long)status->avail_max);
--- a/test/latency.c
+++ b/test/latency.c
@@ -325,12 +325,12 @@ void setscheduler(void)
        printf("!!!Scheduler set to Round Robin with priority %i FAILED!!!\n", 
sched_param.sched_priority);
 }
 
-long timediff(snd_timestamp_t t1, snd_timestamp_t t2)
+long long timediff(snd_timestamp_t t1, snd_timestamp_t t2)
 {
-       signed long l;
+       signed long long l;
 
        t1.tv_sec -= t2.tv_sec;
-       l = (signed long) t1.tv_usec - (signed long) t2.tv_usec;
+       l = (signed long long) t1.tv_usec - (signed long long) t2.tv_usec;
        if (l < 0) {
                t1.tv_sec--;
                l = 1000000 + l;
@@ -682,10 +682,10 @@ int main(int argc, char *argv[])
                snd_pcm_nonblock(phandle, !block ? 1 : 0);
                if (ok) {
 #if 1
-                       printf("Playback time = %li.%i, Record time = %li.%i, 
diff = %li\n",
-                              p_tstamp.tv_sec,
+                       printf("Playback time = %lli.%i, Record time = %lli.%i, 
diff = %lli\n",
+                              (long long)p_tstamp.tv_sec,
                               (int)p_tstamp.tv_usec,
-                              c_tstamp.tv_sec,
+                              (long long)c_tstamp.tv_sec,
                               (int)c_tstamp.tv_usec,
                               timediff(p_tstamp, c_tstamp));
 #endif
--- a/test/queue_timer.c
+++ b/test/queue_timer.c
@@ -99,11 +99,11 @@ main(int argc ATTRIBUTE_UNUSED, char **a
        normalize(&diffdiff);
        prevdiff = diff;
 
-       fprintf(stderr, " real time: %12ld sec %8ld usec\nqueue time: %12ld sec 
%8ld usec\n      diff: %12ld sec %8ld usec\n  diffdiff: %12ld sec %8ld usec\n",
-               tv.tv_sec, tv.tv_usec,
-               (long)rtime->tv_sec, (long)rtime->tv_nsec / 1000,
-               diff.tv_sec, diff.tv_usec,
-               (long)diffdiff.tv_sec, (long)diffdiff.tv_usec);
+       fprintf(stderr, " real time: %12lld sec %8ld usec\nqueue time: %12lld 
sec %8ld usec\n      diff: %12lld sec %8ld usec\n  diffdiff: %12lld sec %8ld 
usec\n",
+               (long long)tv.tv_sec, (long)tv.tv_usec,
+               (long long)rtime->tv_sec, (long)rtime->tv_nsec / 1000,
+               (long long)diff.tv_sec, (long)diff.tv_usec,
+               (long long)diffdiff.tv_sec, (long)diffdiff.tv_usec);
 
        if (diffdiff.tv_usec >  5000 ||
            diffdiff.tv_usec < -5000) {
# DP: fix an obvious typo

--- a/test/latency.c
+++ b/test/latency.c
@@ -673,7 +673,7 @@ int main(int argc, char *argv[])
                printf("Capture:\n");
                showstat(chandle, frames_in);
                showinmax(in_max);
-               if (p_tstamp.tv_sec == p_tstamp.tv_sec &&
+               if (p_tstamp.tv_sec == c_tstamp.tv_sec &&
                    p_tstamp.tv_usec == c_tstamp.tv_usec)
                        printf("Hardware sync\n");
                snd_pcm_drop(chandle);
# DP: fix segmentation fault coming from this using amd64 assembly code
# DP: on x32 systems

--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -142,7 +142,7 @@ static void dmix_server_free(snd_pcm_dir
 #include "pcm_dmix_generic.c"
 #if defined(__i386__)
 #include "pcm_dmix_i386.c"
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) && !defined(__ILP32__)
 #include "pcm_dmix_x86_64.c"
 #else
 #ifndef DOC_HIDDEN

Reply via email to