[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: