On 02/19/2011 07:42 PM, Bernhard Reutner-Fischer wrote:

> Missing signed-off-by. Other than that the Makefile part will not
> apply anymore, I think.

Ow. I made a complete mess of these patch submissions; I forgot about
the switch to git and worked in an old svn repository. Sorry :-(

Here's a new version of the two patches. The __libc_ffs functions are
now declared in string.h. I've had another look at the clock_nanosleep
implementation and saw no reason for the use of __libc_clock_nanosleep,
so I've changed the implementation to look like e.g. capget (define the
syscall if it's available, otherwise provide a function that sets errno
to ENOSYS). Nathan, any input on why you chose to do it that way?

Ok to check in this version?
Signed-off-by: Bernd Schmidt <[email protected]>


Bernd
diff --git a/include/string.h b/include/string.h
index ca22055..66f64e7 100644
--- a/include/string.h
+++ b/include/string.h
@@ -374,11 +374,10 @@ extern char *rindex (__const char *__s, int __c)
 /* Return the position of the first bit set in I, or 0 if none are set.
    The least-significant bit is position 1, the most-significant 32.  */
 extern int ffs (int __i) __THROW __attribute__ ((__const__));
-libc_hidden_proto(ffs)
 
 /* The following two functions are non-standard but necessary for non-32 bit
    platforms.  */
-# if 0 /*#ifdef __USE_GNU*/
+#ifdef __USE_GNU
 extern int ffsl (long int __l) __THROW __attribute__ ((__const__));
 #  ifdef __GNUC__
 __extension__ extern int ffsll (long long int __ll)
@@ -386,6 +385,13 @@ __extension__ extern int ffsll (long long int __ll)
 #  endif
 # endif
 
+#ifdef _LIBC
+extern __typeof(ffs) __libc_ffs;
+libc_hidden_proto(__libc_ffs);
+extern __typeof(ffsll) __libc_ffsll;
+libc_hidden_proto(__libc_ffsll)
+#endif
+
 /* Compare S1 and S2, ignoring case.  */
 extern int strcasecmp (__const char *__s1, __const char *__s2)
      __THROW __attribute_pure__ __nonnull ((1, 2));
diff --git a/libc/inet/rpc/svc.c b/libc/inet/rpc/svc.c
index 0f5300c..03b4062 100644
--- a/libc/inet/rpc/svc.c
+++ b/libc/inet/rpc/svc.c
@@ -452,7 +452,7 @@ svc_getreqset (fd_set *readfds)
   setsize = _rpc_dtablesize ();
   maskp = (u_int32_t *) readfds->fds_bits;
   for (sock = 0; sock < setsize; sock += 32)
-    for (mask = *maskp++; (bit = ffs (mask)); mask ^= (1 << (bit - 1)))
+    for (mask = *maskp++; (bit = __libc_ffs (mask)); mask ^= (1 << (bit - 1)))
       svc_getreq_common (sock + bit - 1);
 }
 libc_hidden_def(svc_getreqset)
diff --git a/libc/string/ffs.c b/libc/string/ffs.c
index 22efe4a..4a5336d 100644
--- a/libc/string/ffs.c
+++ b/libc/string/ffs.c
@@ -5,12 +5,12 @@
  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  */
 
-/* ffsl,ffsll */
-
+#include <limits.h>
+#define ffsl __something_else
 #include "_string.h"
-
-
-int ffs(int i)
+#undef ffsl
+  
+int __libc_ffs(int i)
 {
 #if 1
        /* inlined binary search method */
@@ -51,4 +51,8 @@ int ffs(int i)
        return n;
 #endif
 }
-libc_hidden_def(ffs)
+libc_hidden_def(__libc_ffs)
+weak_alias(__libc_ffs,ffs)
+#if ULONG_MAX == UINT_MAX
+weak_alias (__libc_ffs, ffsl)
+#endif
diff --git a/libc/string/ffsll.c b/libc/string/ffsll.c
new file mode 100644
index 0000000..29e9ba9
--- /dev/null
+++ b/libc/string/ffsll.c
@@ -0,0 +1,40 @@
+/* Copyright (C) 1991, 1992, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Torbjorn Granlund ([email protected]).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <limits.h>
+#define ffsl __something_else
+#include "_string.h"
+#undef ffsl
+
+/* Find the first bit set in I.  */
+int __libc_ffsll (long long int i)
+{
+  unsigned long long int x = i & -i;
+
+  if (x <= 0xffffffff)
+    return __libc_ffs (i);
+  else
+    return 32 + __libc_ffs (i >> 32);
+}
+libc_hidden_def(__libc_ffsll)
+
+weak_alias (__libc_ffsll, ffsll)
+#if ULONG_MAX != UINT_MAX
+weak_alias (__libc_ffsll, ffsl)
+#endif
diff --git a/libc/sysdeps/linux/common/Makefile.in 
b/libc/sysdeps/linux/common/Makefile.in
index a6d22e5..1724a83 100644
--- a/libc/sysdeps/linux/common/Makefile.in
+++ b/libc/sysdeps/linux/common/Makefile.in
@@ -45,7 +45,7 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_getres.c clock_gettime.c 
clock_settime.c \
        sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \
        sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c
 # 
clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait
-CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c
+CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c 
clock_nanosleep.c
 CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c
 CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c
 CSRC-$(UCLIBC_HAS_XATTR) += xattr.c
diff --git a/libc/sysdeps/linux/common/clock_nanosleep.c 
b/libc/sysdeps/linux/common/clock_nanosleep.c
new file mode 100644
index 0000000..6897439
--- /dev/null
+++ b/libc/sysdeps/linux/common/clock_nanosleep.c
@@ -0,0 +1,27 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * clock_nanosleep() for uClibc
+ *
+ * Copyright (C) 2010 Nathan Sidwell <[email protected]>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#include <sys/syscall.h>
+#include <time.h>
+
+#ifdef __NR_clock_nanosleep
+
+_syscall4(int, clock_nanosleep,
+         clockid_t, clock_id, int, flags,
+         const struct timespec *, req, struct timespec *, rem)
+#else
+int clock_nanosleep (clockid_t __clock_id, int __flags,
+                    __const struct timespec *__req,
+                    struct timespec *__rem)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+
+#endif
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to