aboutsummaryrefslogtreecommitdiff
path: root/proc/vos_sort.c
diff options
context:
space:
mode:
authorM.Shulhan <ms@kilabit.org>2009-03-30 16:45:54 +0700
committerM.Shulhan <ms@kilabit.org>2009-03-30 16:45:54 +0700
commit459cd2d7715baea5a56090b3331f0b9b95e832c2 (patch)
tree085a563c8231c8e8b8055b09c00887fb904c1558 /proc/vos_sort.c
parent1661c4681059e0be014641bfae8aa5096a36fd8b (diff)
downloadvos-459cd2d7715baea5a56090b3331f0b9b95e832c2.tar.xz
vos:
- add set PROCESS_TEMPORARY_DIRECTORY; for setting temporary directories used by sort process. - fix command-line parsing argument.
Diffstat (limited to 'proc/vos_sort.c')
-rw-r--r--proc/vos_sort.c43
1 files changed, 35 insertions, 8 deletions
diff --git a/proc/vos_sort.c b/proc/vos_sort.c
index 70b5078..6e2029c 100644
--- a/proc/vos_sort.c
+++ b/proc/vos_sort.c
@@ -120,19 +120,44 @@ static struct Record * sort(struct Record *rows, unsigned long n_row)
static int sort_write(struct ProcSort *psort, struct Record *rows)
{
- int s = 0;
- char *tmp = 0;
- struct File *Fout = 0;
+ int s = 0;
+ char *rndm_name = 0;
+ struct String *tmp = 0;
+ struct File *Fout = 0;
+
+ str_create(&tmp);
do {
- s = str_raw_randomize(VOS_SORT_TMP_FORMAT, &tmp);
+ /* get a path to temporary directory */
+ if (_vos.proc_max > 1) {
+ do {
+ s = pthread_mutex_trylock(&_vos.proc_tmp_dir_lock);
+ } while (s);
+ }
+
+ str_append(tmp, _vos.p_proc_tmp_dir->str);
+
+ _vos.p_proc_tmp_dir = _vos.p_proc_tmp_dir->next;
+ if (! _vos.p_proc_tmp_dir)
+ _vos.p_proc_tmp_dir = _vos.proc_tmp_dir;
+
+ if (_vos.proc_max > 1) {
+ pthread_mutex_unlock(&_vos.proc_tmp_dir_lock);
+ }
+
+ /* get random file name */
+ s = str_raw_randomize(VOS_SORT_TMP_FORMAT, &rndm_name);
if (s)
- return s;
+ goto err;
- s = file_open(&Fout, tmp, FOPEN_WO);
+ str_append(tmp, rndm_name);
+
+ s = file_open(&Fout, tmp->buf, FOPEN_WO);
if (s == 0)
- ll_add(&psort->lsout, psort->tid, tmp);
- free(tmp);
+ ll_add(&psort->lsout, psort->tid, tmp->buf);
+
+ str_prune(tmp);
+ free(rndm_name);
} while (s == E_FILE_EXIST);
s = record_write(rows, Fout, psort->sort->out->fields);
@@ -140,6 +165,8 @@ static int sort_write(struct ProcSort *psort, struct Record *rows)
file_write(Fout);
file_close(&Fout);
+err:
+ str_destroy(&tmp);
return s;
}