Loading...
--- Libc/Libc-763.13/stdlib/FreeBSD/radixsort.c
+++ Libc/Libc-1583.40.7/stdlib/FreeBSD/radixsort.c
@@ -53,6 +53,7 @@
#include <stdlib.h>
#include <stddef.h>
#include <errno.h>
+#include <pthread.h>
typedef struct {
const u_char **sa;
@@ -60,10 +61,16 @@
} stack;
static inline void simplesort
-(const u_char **, int, int, const u_char *, u_int);
+(const u_char **, int, int, const u_char *, u_int) __attribute__((always_inline));
static void r_sort_a(const u_char **, int, int, const u_char *, u_int);
static void r_sort_b(const u_char **, const u_char **, int, int,
const u_char *, u_int);
+
+static int *r_sort_a_count;
+static int *r_sort_b_count;
+
+static void r_sort_count_allocate(void);
+static pthread_once_t r_sort_count_control = PTHREAD_ONCE_INIT;
#define THRESHOLD 20 /* Divert to simplesort(). */
#define SIZE 512 /* Default stack size. */
@@ -88,10 +95,7 @@
}
int
-radixsort(a, n, tab, endch)
- const u_char **a, *tab;
- int n;
- u_int endch;
+radixsort(const u_char **a, int n, const u_char *tab, u_int endch)
{
const u_char *tr;
int c;
@@ -103,10 +107,7 @@
}
int
-sradixsort(a, n, tab, endch)
- const u_char **a, *tab;
- int n;
- u_int endch;
+sradixsort(const u_char **a, int n, const u_char *tab, u_int endch)
{
const u_char *tr, **ta;
int c;
@@ -124,6 +125,12 @@
return (0);
}
+static void r_sort_count_allocate(void)
+{
+ r_sort_a_count = calloc(256, sizeof(int));
+ r_sort_b_count = calloc(256, sizeof(int));
+}
+
#define empty(s) (s >= sp)
#define pop(a, n, i) a = (--sp)->sa, n = sp->sn, i = sp->si
#define push(a, n, i) sp->sa = a, sp->sn = n, (sp++)->si = i
@@ -131,18 +138,20 @@
/* Unstable, in-place sort. */
static void
-r_sort_a(a, n, i, tr, endch)
- const u_char **a;
- int n, i;
- const u_char *tr;
- u_int endch;
-{
- static int count[256], nc, bmin;
+r_sort_a(const u_char **a, int n, int i, const u_char *tr, u_int endch)
+{
+ static int *count, nc, bmin;
int c;
const u_char **ak, *r;
stack s[SIZE], *sp, *sp0, *sp1, temp;
int *cp, bigc;
const u_char **an, *t, **aj, **top[256];
+
+ if (pthread_once(&r_sort_count_control, r_sort_count_allocate)) {
+ return;
+ }
+
+ count = r_sort_a_count;
/* Set up stack. */
sp = s;
@@ -233,18 +242,21 @@
/* Stable sort, requiring additional memory. */
static void
-r_sort_b(a, ta, n, i, tr, endch)
- const u_char **a, **ta;
- int n, i;
- const u_char *tr;
- u_int endch;
-{
- static int count[256], nc, bmin;
+r_sort_b(const u_char **a, const u_char **ta, int n, int i, const u_char *tr,
+ u_int endch)
+{
+ static int *count, nc, bmin;
int c;
const u_char **ak, **ai;
stack s[512], *sp, *sp0, *sp1, temp;
const u_char **top[256];
int *cp, bigc;
+
+ if (pthread_once(&r_sort_count_control, r_sort_count_allocate)) {
+ return;
+ }
+
+ count = r_sort_b_count;
sp = s;
push(a, n, i);
@@ -304,12 +316,9 @@
}
}
+/* insertion sort */
static inline void
-simplesort(a, n, b, tr, endch) /* insertion sort */
- const u_char **a;
- int n, b;
- const u_char *tr;
- u_int endch;
+simplesort(const u_char **a, int n, int b, const u_char *tr, u_int endch)
{
u_char ch;
const u_char **ak, **ai, *s, *t;