[PATCH] __kernel_osreldate()
This libc patch makes __kernel_osreldate() available to the rest of
libc, and replaces some of the KERN_OSRELDATE sysctl checks with calls
to this function. This saves some code size and a few syscalls in
runtime.
Afterwards AT_OSRELDATE could be used to initialize __osreldate on 9.x
kernels, saving the initial sysctl query as well.
--
Robert Millan
Index: clone.c
===================================================================
--- clone.c (revision 3595)
+++ clone.c (working copy)
@@ -29,24 +29,24 @@
#include <sys/sysctl.h>
-static inline int
+int __osreldate;
+
+int
__kernel_osreldate(void)
{
- static int osreldate;
-
int mib[2];
size_t size;
char *temp;
- if (osreldate == 0)
+ if (__osreldate == 0)
{
mib[0] = CTL_KERN;
mib[1] = KERN_OSRELDATE;
- size = sizeof osreldate;
- if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1)
+ size = sizeof __osreldate;
+ if (__sysctl(mib, 2, &__osreldate, &size, NULL, 0) == -1)
return (-1);
}
- return (osreldate);
+ return (__osreldate);
}
/* __start_thread (flags, child_stack, fn, arg)
Index: dl-sysdep.c
===================================================================
--- dl-sysdep.c (revision 3598)
+++ dl-sysdep.c (working copy)
@@ -254,13 +254,9 @@
attribute_hidden
_dl_discover_osversion (void)
{
- int request[2] = { CTL_KERN, KERN_OSRELDATE };
- size_t len;
int version;
- len = sizeof(version);
- if (__sysctl (request, 2, &version, &len, NULL, 0) < 0)
- return -1;
+ version = __kernel_osreldate ();
/*
* scheme is: <major><two digit minor>Rxx
Index: getosreldate.c
===================================================================
--- getosreldate.c (revision 3595)
+++ getosreldate.c (working copy)
@@ -47,11 +47,7 @@
return (osreldate);
}
- mib[0] = CTL_KERN;
- mib[1] = KERN_OSRELDATE;
- size = sizeof osreldate;
- if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1)
- return (-1);
+ osreldate = __osreldate;
}
return (osreldate);
}
Index: testrtsig.h
===================================================================
--- testrtsig.h (revision 3595)
+++ testrtsig.h (working copy)
@@ -29,16 +29,8 @@
#if __ASSUME_REALTIME_SIGNALS
return 1;
#else
-
- int request[2] = { CTL_KERN, KERN_OSRELDATE};
- size_t len;
- int val;
-
- len = sizeof (val);
- if (__sysctl (request, 2, &val, &len, NULL, 0) < 0)
+ if (__kernel_osreldate () < 700050) /* FreeBSD 7.0 is 700055 */
return 0;
- if ( val < 700050) /* FreeBSD 7.0 is 700055 */
- return 0;
return 1;
#endif
}
Reply to: