summaryrefslogtreecommitdiffstats
path: root/usr.bin/sort/file.c
diff options
context:
space:
mode:
authorgabor <gabor@FreeBSD.org>2012-05-25 09:30:16 +0000
committergabor <gabor@FreeBSD.org>2012-05-25 09:30:16 +0000
commit02feec4a4507f678cfd5036cbb906dcc9908b6ba (patch)
treee9eb2b40eabd4689dc4eb5b909ee80cfe21a2b0d /usr.bin/sort/file.c
parent95907ed567f199388c4cd044d314ce8dde553626 (diff)
downloadFreeBSD-src-02feec4a4507f678cfd5036cbb906dcc9908b6ba.zip
FreeBSD-src-02feec4a4507f678cfd5036cbb906dcc9908b6ba.tar.gz
- Only use multi-threading for large files
- Do not use mmap() by default; it can be enabled by --mmap - Add some minor optimizations for -u - Update manual page according to the changes Submitted by: Oleg Moskalenko <oleg.moskalenko@citrix.com>
Diffstat (limited to 'usr.bin/sort/file.c')
-rw-r--r--usr.bin/sort/file.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/usr.bin/sort/file.c b/usr.bin/sort/file.c
index 9afa4b2..68c3f54 100644
--- a/usr.bin/sort/file.c
+++ b/usr.bin/sort/file.c
@@ -53,6 +53,8 @@ __FBSDID("$FreeBSD$");
unsigned long long free_memory = 1000000;
unsigned long long available_free_memory = 1000000;
+bool use_mmap;
+
const char *tmpdir = "/var/tmp";
const char *compress_program;
@@ -404,23 +406,21 @@ sort_list_dump(struct sort_list *l, const char *fn)
err(2, NULL);
if (l->list) {
- struct sort_list_item *last_printed_item;
size_t i;
-
- last_printed_item = NULL;
-
- for (i = 0; i < l->count; i++) {
- struct sort_list_item *item;
-
- item = l->list[i];
-
- if (!(sort_opts_vals.uflag) ||
- (last_printed_item == NULL) ||
- list_coll(&last_printed_item, &item)) {
- bwsfwrite(item->str, f,
+ if (!(sort_opts_vals.uflag)) {
+ for (i = 0; i < l->count; ++i)
+ bwsfwrite(l->list[i]->str, f,
sort_opts_vals.zflag);
- if (sort_opts_vals.uflag)
+ } else {
+ struct sort_list_item *last_printed_item = NULL;
+ struct sort_list_item *item;
+ for (i = 0; i < l->count; ++i) {
+ item = l->list[i];
+ if ((last_printed_item == NULL) ||
+ list_coll(&last_printed_item, &item)) {
+ bwsfwrite(item->str, f, sort_opts_vals.zflag);
last_printed_item = item;
+ }
}
}
}
@@ -657,7 +657,7 @@ file_reader_init(const char *fsrc)
ret->fname = sort_strdup(fsrc);
- if (strcmp(fsrc, "-") && (compress_program == NULL)) {
+ if (strcmp(fsrc, "-") && (compress_program == NULL) && use_mmap) {
do {
struct stat stat_buf;
@@ -1539,7 +1539,9 @@ mt_sort(struct sort_list *list,
const char* fn)
{
#if defined(SORT_THREADS)
- if (nthreads < 2 || list->count < nthreads) {
+ if (nthreads < 2 || list->count < MT_SORT_THRESHOLD) {
+ size_t nthreads_save = nthreads;
+ nthreads = 1;
#endif
/* if single thread or small data, do simple sort */
sort_func(list->list, list->count,
@@ -1547,6 +1549,7 @@ mt_sort(struct sort_list *list,
(int(*)(const void *, const void *)) list_coll);
sort_list_dump(list, fn);
#if defined(SORT_THREADS)
+ nthreads = nthreads_save;
} else {
/* multi-threaded sort */
struct sort_list **parts;
@@ -1590,7 +1593,18 @@ mt_sort(struct sort_list *list,
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_DETACHED);
- pthread_create(&pth, &attr, mt_sort_thread, parts[i]);
+ for (;;) {
+ int res = pthread_create(&pth, &attr,
+ mt_sort_thread, parts[i]);
+
+ if (res >= 0)
+ break;
+ if (errno == EAGAIN) {
+ pthread_yield();
+ continue;
+ }
+ err(2, NULL);
+ }
pthread_attr_destroy(&attr);
}
OpenPOWER on IntegriCloud