File: use_clock64_fns_armhf.patch

package info (click to toggle)
openjdk-11 11.0.28%2B6-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 781,124 kB
  • sloc: java: 5,208,481; xml: 1,192,267; cpp: 1,138,346; ansic: 461,925; javascript: 162,416; sh: 16,738; objc: 13,729; python: 4,757; asm: 3,570; makefile: 2,965; perl: 357; awk: 351; sed: 172; jsp: 24; csh: 3
file content (76 lines) | stat: -rw-r--r-- 3,849 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Description: Dynamically link with *64 versions of clock_* functions
  On 32-bit archs that implement a 64-bit time_t, clock_* functions
  linked via dlsym() should be the *64 versions of them. For example,
  on such archs, we should try to link with __clock_gettime64 first
  and fallback to linking with clock_gettime if the *64 version is
  not available.
Author: Pushkar Kulkarni <pushkar.kulkarni@canonical.com>
Forwarded: no

--- a/src/hotspot/os/posix/os_posix.cpp
+++ b/src/hotspot/os/posix/os_posix.cpp
@@ -1777,10 +1777,22 @@
 
   _clock_gettime = NULL;
 
-  int (*clock_getres_func)(clockid_t, struct timespec*) =
-    (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_getres");
-  int (*clock_gettime_func)(clockid_t, struct timespec*) =
-    (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_gettime");
+  int (*clock_getres_func)(clockid_t, struct timespec*) = NULL;
+  int (*clock_gettime_func)(clockid_t, struct timespec*) = NULL;
+
+  if (sizeof(long) != sizeof(time_t)) {
+    // typically, 32-bit archs with 64-bit time_t
+    clock_getres_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "__clock_getres64");
+    clock_gettime_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "__clock_gettime64");
+  }
+
+  // Fallback for archs with sizeof(long) == sizeof(time_t),
+  // Also for archs with sizeof(long) != sizeof(time_t), but no *64 clock functions
+  if (clock_getres_func == NULL || clock_gettime_func == NULL) {
+    clock_getres_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_getres");
+    clock_gettime_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_gettime");
+  }
+
   if (clock_getres_func != NULL && clock_gettime_func != NULL) {
     // We assume that if both clock_gettime and clock_getres support
     // CLOCK_MONOTONIC then the OS provides true high-res monotonic clock.
--- a/src/hotspot/os/linux/os_linux.cpp
+++ b/src/hotspot/os/linux/os_linux.cpp
@@ -1479,10 +1479,22 @@
   }
 
   if (handle) {
-    int (*clock_getres_func)(clockid_t, struct timespec*) =
-           (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_getres");
-    int (*clock_gettime_func)(clockid_t, struct timespec*) =
-           (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_gettime");
+    int (*clock_getres_func)(clockid_t, struct timespec*) = NULL;
+    int (*clock_gettime_func)(clockid_t, struct timespec*) = NULL;
+
+    if (sizeof(long) != sizeof(time_t)) {
+      // typically, 32-bit archs with 64-bit time_t
+      clock_getres_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "__clock_getres64");
+      clock_gettime_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "__clock_gettime64");
+    }
+
+    // Fallback for archs with sizeof(long) == sizeof(time_t),
+    // Also for archs with sizeof(long) != sizeof(time_t), but no *64 clock functions
+    if (clock_getres_func == NULL || clock_gettime_func == NULL) {
+      clock_getres_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_getres");
+      clock_gettime_func = (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_gettime");
+    }
+
     if (clock_getres_func && clock_gettime_func) {
       // See if monotonic clock is supported by the kernel. Note that some
       // early implementations simply return kernel jiffies (updated every
@@ -1511,7 +1523,7 @@
 
 #ifndef SYS_clock_getres
   #if defined(X86) || defined(PPC64) || defined(S390)
-    #define SYS_clock_getres AMD64_ONLY(229) IA32_ONLY(266) PPC64_ONLY(247) S390_ONLY(261)
+    #define SYS_clock_getres AMD64_ONLY(229) IA32_ONLY(sizeof(time_t) == 8 ? 406 : 266) PPC64_ONLY(247) S390_ONLY(261)
     #define sys_clock_getres(x,y)  ::syscall(SYS_clock_getres, x, y)
   #else
     #warning "SYS_clock_getres not defined for this platform, disabling fast_thread_cpu_time"