diff options
| author | M.Shulhan <ms@kilabit.org> | 2009-03-30 16:45:54 +0700 |
|---|---|---|
| committer | M.Shulhan <ms@kilabit.org> | 2009-03-30 16:45:54 +0700 |
| commit | 459cd2d7715baea5a56090b3331f0b9b95e832c2 (patch) | |
| tree | 085a563c8231c8e8b8055b09c00887fb904c1558 /proc/vos_sort.c | |
| parent | 1661c4681059e0be014641bfae8aa5096a36fd8b (diff) | |
| download | vos-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.c | 43 |
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; } |
