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