psort.3.patch   [plain text]


--- psort.3.orig	2009-05-20 15:59:00.000000000 -0700
+++ psort.3	2009-05-20 16:08:34.000000000 -0700
@@ -36,60 +36,20 @@
 .\"     @(#)qsort.3	8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: src/lib/libc/stdlib/qsort.3,v 1.15 2004/07/02 23:52:12 ru Exp $
 .\"
-.Dd September 30, 2003
-.Dt QSORT 3
-.Os
+.Dd Nov 25, 2008
+.Dt PSORT 3
+.Os "Mac OS X"
 .Sh NAME
-.Nm heapsort ,
+.Nm psort ,
 #ifdef UNIFDEF_BLOCKS
-.Nm heapsort_b ,
+.Nm psort_b ,
 #endif
-.Nm mergesort ,
-#ifdef UNIFDEF_BLOCKS
-.Nm mergesort_b ,
-#endif
-.Nm qsort ,
-#ifdef UNIFDEF_BLOCKS
-.Nm qsort_b ,
-#endif
-.Nm qsort_r
-.Nd sort functions
+.Nm psort_r
+.Nd parallel sort functions
 .Sh SYNOPSIS
 .In stdlib.h
-.Ft int
-.Fo heapsort
-.Fa "void *base"
-.Fa "size_t nel"
-.Fa "size_t width"
-.Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
-.Fc
-#ifdef UNIFDEF_BLOCKS
-.Ft int
-.Fo heapsort_b
-.Fa "void *base"
-.Fa "size_t nel"
-.Fa "size_t width"
-.Fa "int \*[lp]^compar\*[rp]\*[lp]const void *, const void *\*[rp]"
-.Fc
-#endif
-.Ft int
-.Fo mergesort
-.Fa "void *base"
-.Fa "size_t nel"
-.Fa "size_t width"
-.Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
-.Fc
-#ifdef UNIFDEF_BLOCKS
-.Ft int
-.Fo mergesort_b
-.Fa "void *base"
-.Fa "size_t nel"
-.Fa "size_t width"
-.Fa "int \*[lp]^compar\*[rp]\*[lp]const void *, const void *\*[rp]"
-.Fc
-#endif
 .Ft void
-.Fo qsort
+.Fo psort
 .Fa "void *base"
 .Fa "size_t nel"
 .Fa "size_t width"
@@ -97,7 +57,7 @@
 .Fc
 #ifdef UNIFDEF_BLOCKS
 .Ft void
-.Fo qsort_b
+.Fo psort_b
 .Fa "void *base"
 .Fa "size_t nel"
 .Fa "size_t width"
@@ -105,7 +65,7 @@
 .Fc
 #endif
 .Ft void
-.Fo qsort_r
+.Fo psort_r
 .Fa "void *base"
 .Fa "size_t nel"
 .Fa "size_t width"
@@ -114,255 +74,60 @@
 .Fc
 .Sh DESCRIPTION
 The
-.Fn qsort
-function is a modified partition-exchange sort, or quicksort.
-The
-.Fn heapsort
-function is a modified selection sort.
-The
-.Fn mergesort
-function is a modified merge sort with exponential search,
-intended for sorting data with pre-existing order.
-.Pp
-The
-.Fn qsort
-and
-.Fn heapsort
-functions sort an array of
-.Fa nel
-objects, the initial member of which is pointed to by
-.Fa base .
-The size of each object is specified by
-.Fa width .
-The
-.Fn mergesort
-function
-behaves similarly, but
-.Em requires
-that
-.Fa width
-be greater than or equal to
-.Dq "sizeof(void *) / 2" .
-.Pp
-The contents of the array
-.Fa base
-are sorted in ascending order according to
-a comparison function pointed to by
-.Fa compar ,
-which requires two arguments pointing to the objects being
-compared.
-.Pp
-The comparison function must return an integer less than, equal to, or
-greater than zero if the first argument is considered to be respectively
-less than, equal to, or greater than the second.
-.Pp
-The
-.Fn qsort_r
-function behaves identically to
-.Fn qsort ,
-except that it takes an additional argument,
-.Fa thunk ,
-which is passed unchanged as the first argument to function pointed to
-.Fa compar .
-This allows the comparison function to access additional
-data without using global variables, and thus
-.Fn qsort_r
-is suitable for use in functions which must be reentrant.
-.Pp
-The algorithms implemented by
-.Fn qsort ,
-.Fn qsort_r ,
-and
-.Fn heapsort
-are
-.Em not
-stable; that is, if two members compare as equal, their order in
-the sorted array is undefined.
-The
-.Fn mergesort
-algorithm is stable.
-.Pp
-The
-.Fn qsort
-and
-.Fn qsort_r
-functions are an implementation of C.A.R.
-Hoare's
-.Dq quicksort
-algorithm,
-a variant of partition-exchange sorting; in particular, see
-.An D.E. Knuth Ns 's
-.%T "Algorithm Q" .
-.Sy Quicksort
-takes O N lg N average time.
-This implementation uses median selection to avoid its
-O N**2 worst-case behavior.
-.Pp
-The
-.Fn heapsort
-function is an implementation of
-.An "J.W.J. William" Ns 's
-.Dq heapsort
-algorithm,
-a variant of selection sorting; in particular, see
-.An "D.E. Knuth" Ns 's
-.%T "Algorithm H" .
-.Sy Heapsort
-takes O N lg N worst-case time.
-Its
-.Em only
-advantage over
-.Fn qsort
-is that it uses almost no additional memory; while
-.Fn qsort
-does not allocate memory, it is implemented using recursion.
-.Pp
-The function
-.Fn mergesort
-requires additional memory of size
-.Fa nel *
-.Fa width
-bytes; it should be used only when space is not at a premium.
-The
-.Fn mergesort
-function
-is optimized for data with pre-existing order; its worst case
-time is O N lg N; its best case is O N.
-.Pp
-Normally,
-.Fn qsort
-is faster than
-.Fn mergesort ,
-which is faster than
-.Fn heapsort .
-Memory availability and pre-existing order in the data can make this
-untrue.
-#ifdef UNIFDEF_BLOCKS
-.Pp
-The
-.Fn heapsort_b ,
-.Fn mergesort_b ,
-and
-.Fn qsort_b
-routines are like the corresponding routines without the _b suffix, expect
-that the
-.Fa compar
-callback is a block pointer instead of a function pointer.
-#endif
-.Sh RETURN VALUES
-The
 #ifdef UNIFDEF_BLOCKS
-.Fn qsort ,
-.Fn qsort_b
+.Fn psort ,
+.Fn psort_b ,
 #else
-.Fn qsort
+.Fn psort
 #endif
 and
-.Fn qsort_r
-functions
-return no value.
-.Pp
-#ifdef UNIFDEF_BLOCKS
-.ds HEAPSORT_B heapsort_b
-.ds MERGESORT_B mergesort_b
-#endif
-.Rv -std heapsort \*[HEAPSORT_B] mergesort \*[MERGESORT_B]
-.Sh ERRORS
+.Fn psort_r
+functions are parallel sort routines that are drop-in compatible with the
+corresponding
+.Fn qsort
+function (see
+.Xr qsort 3
+for a description of the arguments).
+On multiprocessor machines, multiple threads may be created to simultaneously
+perform the sort calculations, resulting in an overall faster sort result.
+Overhead in managing the threads limits the maximum speed improvement to
+somewhat less that the number of processors available.
+For example, on a 4-processor machine, a typical sort on a large array might
+result in 3.2 times faster sorting than a regular
+.Fn qsort .
+.Sh RESTRICTIONS
+Because of the multi-threaded nature of the sort, the comparison function
+is expected to perform its own synchronization that might be required for
+data physically
+.Em outside
+the two objects passed to the comparison function.
+However, no synchronization is required for the two
+object themselves, unless some third party is also accessing those objects.
+.Pp
+Additional memory is temporary allocated to deal with the parallel nature
+of the computation.
+.Pp
+Because of the overhead of maintaining multiple threads, the
+.Fn psort
+family of routines may choose to just call
+.Xr qsort 3
+when there is no advantage to parallelizing (for example, when the number of
+objects in the array is too small, or only one processor is available).
+.Pp
+Like
+.Xr qsort 3 ,
+the sort is not stable.
+.Sh RETURN VALUES
 The
 #ifdef UNIFDEF_BLOCKS
-.Fn heapsort ,
-.Fn heapsort_b ,
-.Fn mergesort
-and
-.Fn mergesort_b
+.Fn psort ,
+.Fn psort_b
 #else
-.Fn heapsort
-and
-.Fn mergesort
-#endif
-functions succeed unless:
-.Bl -tag -width Er
-.It Bq Er EINVAL
-The
-.Fa width
-argument is zero, or,
-the
-.Fa width
-argument to
-.Fn mergesort
-#ifdef UNIFDEF_BLOCKS
-or
-.Fn mergesort_b
+.Fn psort
 #endif
-is less than
-.Dq "sizeof(void *) / 2" .
-.It Bq Er ENOMEM
-The
-#ifdef UNIFDEF_BLOCKS
-.Fn heapsort ,
-.Fn heapsort_b ,
-.Fn mergesort
-and
-.Fn mergesort_b
-#else
-.Fn heapsort
 and
-.Fn mergesort
-#endif
+.Fn psort_r
 functions
-were unable to allocate memory.
-.El
-.Sh COMPATIBILITY
-Previous versions of
-.Fn qsort
-did not permit the comparison routine itself to call
-.Fn qsort 3 .
-This is no longer true.
+return no value.
 .Sh SEE ALSO
-.Xr sort 1 ,
-.Xr radixsort 3
-.Rs
-.%A Hoare, C.A.R.
-.%D 1962
-.%T "Quicksort"
-.%J "The Computer Journal"
-.%V 5:1
-.%P pp. 10-15
-.Re
-.Rs
-.%A Williams, J.W.J
-.%D 1964
-.%T "Heapsort"
-.%J "Communications of the ACM"
-.%V 7:1
-.%P pp. 347-348
-.Re
-.Rs
-.%A Knuth, D.E.
-.%D 1968
-.%B "The Art of Computer Programming"
-.%V Vol. 3
-.%T "Sorting and Searching"
-.%P pp. 114-123, 145-149
-.Re
-.Rs
-.%A McIlroy, P.M.
-.%T "Optimistic Sorting and Information Theoretic Complexity"
-.%J "Fourth Annual ACM-SIAM Symposium on Discrete Algorithms"
-.%V January 1992
-.Re
-.Rs
-.%A Bentley, J.L.
-.%A McIlroy, M.D.
-.%T "Engineering a Sort Function"
-.%J "Software--Practice and Experience"
-.%V Vol. 23(11)
-.%P pp. 1249-1265
-.%D November\ 1993
-.Re
-.Sh STANDARDS
-The
-.Fn qsort
-function
-conforms to
-.St -isoC .
+.Xr qsort 3