Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Oleksii Turkot
CrystFEL
Commits
9e484b8e
Commit
9e484b8e
authored
May 25, 2012
by
Thomas White
Browse files
WIP on tidy-up
parent
412a3212
Changes
5
Hide whitespace changes
Inline
Side-by-side
libcrystfel/src/cell.c
View file @
9e484b8e
...
...
@@ -690,7 +690,7 @@ static int same_vector(struct cvec a, struct cvec b)
/* Attempt to make 'cell' fit into 'template' somehow */
UnitCell
*
match_cell
(
UnitCell
*
cell
,
UnitCell
*
template
,
int
verbose
,
float
*
tols
,
int
reduce
)
const
float
*
tols
,
int
reduce
)
{
signed
int
n1l
,
n2l
,
n3l
;
double
asx
,
asy
,
asz
;
...
...
libcrystfel/src/cell.h
View file @
9e484b8e
...
...
@@ -118,7 +118,7 @@ extern UnitCell *rotate_cell(UnitCell *in, double omega, double phi,
extern
void
cell_print
(
UnitCell
*
cell
);
extern
UnitCell
*
match_cell
(
UnitCell
*
cell
,
UnitCell
*
tempcell
,
int
verbose
,
float
*
ltl
,
int
reduce
);
const
float
*
ltl
,
int
reduce
);
extern
UnitCell
*
match_cell_ab
(
UnitCell
*
cell
,
UnitCell
*
tempcell
);
...
...
libcrystfel/src/index.c
View file @
9e484b8e
...
...
@@ -157,7 +157,7 @@ void map_all_peaks(struct image *image)
void
index_pattern
(
struct
image
*
image
,
UnitCell
*
cell
,
IndexingMethod
*
indm
,
int
cellr
,
int
verbose
,
IndexingPrivate
**
ipriv
,
int
config_insane
,
float
*
ltl
)
int
config_insane
,
const
float
*
ltl
)
{
int
i
;
int
n
=
0
;
...
...
libcrystfel/src/index.h
View file @
9e484b8e
...
...
@@ -74,7 +74,8 @@ extern void map_all_peaks(struct image *image);
extern
void
index_pattern
(
struct
image
*
image
,
UnitCell
*
cell
,
IndexingMethod
*
indm
,
int
cellr
,
int
verbose
,
IndexingPrivate
**
priv
,
int
config_insane
,
float
*
ltl
);
IndexingPrivate
**
priv
,
int
config_insane
,
const
float
*
ltl
);
extern
void
cleanup_indexing
(
IndexingPrivate
**
priv
);
...
...
src/indexamajig.c
View file @
9e484b8e
...
...
@@ -70,10 +70,6 @@
/* Write statistics at APPROXIMATELY this interval */
#define STATS_EVERY_N_SECONDS (5)
#define LINE_LENGTH 1024
#define BUFFER PIPE_BUF
enum
{
PEAK_ZAEF
,
PEAK_HDF5
,
...
...
@@ -228,72 +224,73 @@ static void show_help(const char *s)
static
char
*
get_pattern
(
FILE
*
fh
)
{
char
*
rval
;
char
line
[
LINE_LENGTH
];
rval
=
fgets
(
line
,
LINE_LENGTH
-
1
,
fh
);
char
*
line
;
line
=
malloc
(
1024
);
if
(
line
==
NULL
)
{
ERROR
(
"Couldn't allocate memory for filename
\n
"
);
return
NULL
;
}
rval
=
fgets
(
line
,
1023
,
fh
);
if
(
ferror
(
fh
)
)
{
ERROR
(
"Failed to get next filename from list.
\n
"
);
rval
=
NULL
;
}
return
rval
;
}
static
void
process_image
(
void
*
qp
,
void
*
pp
,
int
cookie
)
static
void
process_image
(
const
struct
index_args
*
iargs
,
struct
pattern_args
*
pargs
,
int
cookie
)
{
struct
index_args
*
pargs
=
pp
;
struct
queue_args
*
qargs
=
qp
;
float
*
data_for_measurement
;
size_t
data_size
;
UnitCell
*
cell
=
q
args
->
static_args
.
cell
;
int
config_cmfilter
=
q
args
->
static_args
.
config_cmfilter
;
int
config_noisefilter
=
q
args
->
static_args
.
config_noisefilter
;
int
config_verbose
=
q
args
->
static_args
.
config_verbose
;
IndexingMethod
*
indm
=
q
args
->
static_args
.
indm
;
struct
beam_params
*
beam
=
q
args
->
static_args
.
beam
;
UnitCell
*
cell
=
i
args
->
cell
;
int
config_cmfilter
=
i
args
->
config_cmfilter
;
int
config_noisefilter
=
i
args
->
config_noisefilter
;
int
config_verbose
=
i
args
->
config_verbose
;
IndexingMethod
*
indm
=
i
args
->
indm
;
struct
beam_params
*
beam
=
i
args
->
beam
;
int
r
,
check
;
struct
hdfile
*
hdfile
;
char
*
outfile
=
qargs
->
static_args
.
outfile
;
char
*
outfile
=
iargs
->
outfile
;
struct
image
image
;
char
*
outfilename
;
int
fd
;
FILE
*
fh
;
struct
flock
fl
=
{
F_WRLCK
,
SEEK_SET
,
0
,
0
,
0
};
image
.
features
=
NULL
;
image
.
data
=
NULL
;
image
.
flags
=
NULL
;
image
.
indexed_cell
=
NULL
;
image
.
det
=
copy_geom
(
q
args
->
static_args
.
det
);
image
.
copyme
=
q
args
->
static_args
.
copyme
;
image
.
det
=
copy_geom
(
i
args
->
det
);
image
.
copyme
=
i
args
->
copyme
;
image
.
beam
=
beam
;
image
.
id
=
cookie
;
// MUST SET ID FOR MOSFLM TO WORK PROPERLY
image
.
id
=
cookie
;
image
.
filename
=
pargs
->
filename
;
if
(
beam
==
NULL
)
{
ERROR
(
"Warning: no beam parameters file.
\n
"
);
ERROR
(
"I'm going to assume 1 ADU per photon, which is almost"
);
ERROR
(
" certainly wrong. Peak sigmas will be incorrect.
\n
"
);
}
hdfile
=
hdfile_open
(
image
.
filename
);
if
(
hdfile
==
NULL
)
return
;
char
*
filename
=
NULL
;
char
*
imagename
=
pargs
->
filename
;
chomp
(
imagename
);
filename
=
malloc
(
strlen
(
qargs
->
prefix
)
+
strlen
(
imagename
)
+
1
);
snprintf
(
filename
,
LINE_LENGTH
-
1
,
"%s%s"
,
qargs
->
prefix
,
imagename
);
image
.
filename
=
filename
;
hdfile
=
hdfile_open
(
filename
);
if
(
hdfile
==
NULL
)
return
;
r
=
hdfile_set_first_image
(
hdfile
,
"/"
);
// Need this to read hdf5 files
if
(
r
)
{
r
=
hdfile_set_first_image
(
hdfile
,
"/"
);
if
(
r
)
{
ERROR
(
"Couldn't select first path
\n
"
);
hdfile_close
(
hdfile
);
return
;
}
check
=
hdf5_read
(
hdfile
,
&
image
,
1
);
if
(
check
==
1
)
{
if
(
check
)
{
hdfile_close
(
hdfile
);
return
;
}
if
((
image
.
width
!=
image
.
det
->
max_fs
+
1
)
||
(
image
.
height
!=
image
.
det
->
max_ss
+
1
))
{
if
(
(
image
.
width
!=
image
.
det
->
max_fs
+
1
)
||
(
image
.
height
!=
image
.
det
->
max_ss
+
1
))
{
ERROR
(
"Image size doesn't match geometry size"
" - rejecting image.
\n
"
);
ERROR
(
"Image size: %i,%i. Geometry size: %i,%i
\n
"
,
...
...
@@ -304,8 +301,8 @@ static void process_image(void *qp, void *pp, int cookie)
return
;
}
if
(
image
.
lambda
<
0
.
0
)
{
if
(
beam
!=
NULL
)
{
if
(
image
.
lambda
<
0
.
0
)
{
if
(
beam
!=
NULL
)
{
ERROR
(
"Using nominal photon energy of %.2f eV
\n
"
,
beam
->
photon_energy
);
image
.
lambda
=
ph_en_to_lambda
(
...
...
@@ -320,37 +317,40 @@ static void process_image(void *qp, void *pp, int cookie)
}
fill_in_values
(
image
.
det
,
hdfile
);
if
(
config_cmfilter
)
{
if
(
config_cmfilter
)
{
filter_cm
(
&
image
);
}
/
/
Take snapshot of image after CM subtraction but before
//
the aggressive noise filter.
data_size
=
image
.
width
*
image
.
height
*
sizeof
(
float
);
/
*
Take snapshot of image after CM subtraction but before
*
the aggressive noise filter.
*/
data_size
=
image
.
width
*
image
.
height
*
sizeof
(
float
);
data_for_measurement
=
malloc
(
data_size
);
if
(
config_noisefilter
)
{
if
(
config_noisefilter
)
{
filter_noise
(
&
image
,
data_for_measurement
);
}
else
{
memcpy
(
data_for_measurement
,
image
.
data
,
data_size
);
}
switch
(
qargs
->
static_args
.
peaks
)
{
switch
(
iargs
->
peaks
)
{
case
PEAK_HDF5
:
// Get peaks from HDF5
if
(
get_peaks
(
&
image
,
hdfile
,
qargs
->
static_args
.
hdf5_peak_path
))
{
ERROR
(
"Failed to get peaks from HDF5 file.
\n
"
);
}
break
;
if
(
get_peaks
(
&
image
,
hdfile
,
iargs
->
hdf5_peak_path
))
{
ERROR
(
"Failed to get peaks from HDF5 file.
\n
"
);
}
break
;
case
PEAK_ZAEF
:
search_peaks
(
&
image
,
qargs
->
static_args
.
threshold
,
qargs
->
static_args
.
min_gradient
,
qargs
->
static_args
.
min_snr
,
qargs
->
static_args
.
ir_inn
,
qargs
->
static_args
.
ir_mid
,
qargs
->
static_args
.
ir_out
);
break
;
search_peaks
(
&
image
,
iargs
->
threshold
,
iargs
->
min_gradient
,
iargs
->
min_snr
,
iargs
->
ir_inn
,
iargs
->
ir_mid
,
iargs
->
ir_out
);
break
;
}
/* Get rid of noise-filtered version at this point
...
...
@@ -364,37 +364,32 @@ static void process_image(void *qp, void *pp, int cookie)
image
.
profile_radius
=
0.0001e9
;
/* RUN INDEXING HERE */
index_pattern
(
&
image
,
cell
,
indm
,
q
args
->
static_args
.
cellr
,
config_verbose
,
q
args
->
static_args
.
ipriv
,
qargs
->
static_args
.
config_insane
,
q
args
->
static_args
.
tols
);
index_pattern
(
&
image
,
cell
,
indm
,
i
args
->
cellr
,
config_verbose
,
i
args
->
ipriv
,
iargs
->
config_insane
,
i
args
->
tols
);
if
(
image
.
indexed_cell
!=
NULL
)
{
if
(
image
.
indexed_cell
!=
NULL
)
{
pargs
->
indexable
=
1
;
image
.
reflections
=
find_intersections
(
&
image
,
image
.
indexed_cell
);
if
(
image
.
reflections
!=
NULL
)
{
integrate_reflections
(
&
image
,
q
args
->
static_args
.
config_closer
,
q
args
->
static_args
.
config_bgsub
,
q
args
->
static_args
.
min_int_snr
,
q
args
->
static_args
.
ir_inn
,
q
args
->
static_args
.
ir_mid
,
q
args
->
static_args
.
ir_out
);
i
args
->
config_closer
,
i
args
->
config_bgsub
,
i
args
->
min_int_snr
,
i
args
->
ir_inn
,
i
args
->
ir_mid
,
i
args
->
ir_out
);
}
}
else
{
image
.
reflections
=
NULL
;
}
/* Write Lock */
struct
flock
fl
=
{
F_WRLCK
,
SEEK_SET
,
0
,
0
,
0
};
int
fd
;
fl
.
l_pid
=
getpid
();
char
*
outfilename
=
NULL
;
chomp
(
outfile
);
outfilename
=
malloc
(
strlen
(
outfile
)
+
1
);
snprintf
(
outfilename
,
LINE_LENGTH
-
1
,
"%s"
,
outfile
);
if
((
fd
=
open
(
outfilename
,
O_WRONLY
))
==
-
1
)
{
fd
=
open
(
outfile
,
O_WRONLY
);
if
(
fd
==
-
1
)
{
ERROR
(
"Error on opening
\n
"
);
exit
(
1
);
}
...
...
@@ -404,25 +399,21 @@ static void process_image(void *qp, void *pp, int cookie)
}
/* LOCKED! Write chunk */
FILE
*
fh
;
fh
=
fopen
(
outfilename
,
"a"
);
if
(
fh
==
NULL
)
{
ERROR
(
"Error inside lock
\n
"
);
}
write_chunk
(
fh
,
&
image
,
hdfile
,
q
args
->
static_args
.
stream_flags
);
write_chunk
(
fh
,
&
image
,
hdfile
,
i
args
->
stream_flags
);
fclose
(
fh
);
/* Unlock stream for other processes */
fl
.
l_type
=
F_UNLCK
;
/* set to unlock same region */
if
(
fcntl
(
fd
,
F_SETLK
,
&
fl
)
==
-
1
)
{
if
(
fcntl
(
fd
,
F_SETLK
,
&
fl
)
==
-
1
)
{
ERROR
(
"fcntl"
);
exit
(
1
);
}
close
(
fd
);
qargs
->
n_indexable
+=
pargs
->
indexable
;
qargs
->
n_processed
++
;
/* Only free cell if found */
cell_free
(
image
.
indexed_cell
);
...
...
@@ -436,25 +427,42 @@ static void process_image(void *qp, void *pp, int cookie)
static
void
run_work
(
const
struct
index_args
*
iargs
,
int
filename_pipe
,
int
results_pipe
)
int
filename_pipe
,
int
results_pipe
,
int
cookie
)
{
int
allDone
=
0
;
while
(
!
allDone
)
{
/* read from pipe and return number of bytes read */
if
((
buff_count
=
read
(
fd_pipeOut
[
batchNum
-
1
][
0
],
&
buffR
,
BUFFER
))
<
0
)
{
ERROR
(
"read1"
);
}
else
if
(
buff_count
>
0
)
{
/* process image */
pargs
.
filename
=
buffR
;
struct
pattern_args
pargs
;
int
r
,
w
;
char
buf
[
1024
];
r
=
read
(
filename_pipe
,
buf
,
1024
);
if
(
r
<
0
)
{
ERROR
(
"read() failed!
\n
"
);
}
else
if
(
r
>
0
)
{
int
c
;
/* Process image */
pargs
.
filename
=
buf
;
pargs
.
indexable
=
0
;
process_image
(
&
qargs
,
&
pargs
,
batchNum
);
/* request another image */
buff_count
=
sprintf
(
buffW
,
"%d
\n
"
,
pargs
.
indexable
);
if
(
write
(
fd_pipeIn
[
batchNum
-
1
][
1
],
buffW
,
buff_count
)
<
0
)
STATUS
(
"Got filename: '%s'
\n
"
,
buf
);
process_image
(
iargs
,
&
pargs
,
cookie
);
/* Request another image */
c
=
sprintf
(
buf
,
"%i
\n
"
,
pargs
.
indexable
);
w
=
write
(
results_pipe
,
buf
,
c
);
if
(
w
<
0
)
{
ERROR
(
"write P0"
);
}
else
if
(
buff_count
==
0
)
{
}
}
else
{
allDone
=
1
;
}
...
...
@@ -553,14 +561,12 @@ int main(int argc, char *argv[])
int
peaks
;
int
n_proc
=
1
;
char
*
prepare_line
;
char
prepare_filename
[
LINE_LENGTH
];
struct
queue_args
qargs
;
struct
index_args
pargs
;
char
prepare_filename
[
1024
];
struct
index_args
iargs
;
struct
beam_params
*
beam
=
NULL
;
char
*
element
=
NULL
;
double
nominal_photon_energy
;
int
stream_flags
=
STREAM_INTEGRATED
;
char
*
endptr
;
char
*
hdf5_peak_path
=
NULL
;
struct
copy_hdf5_field
*
copyme
;
char
*
intrad
=
NULL
;
...
...
@@ -573,6 +579,9 @@ int main(int argc, char *argv[])
pid_t
*
pids
;
int
*
filename_pipes
;
int
*
result_pipes
;
fd_set
fds
;
int
i
;
int
allDone
,
nFinished
;
copyme
=
new_copy_hdf5_field_list
();
if
(
copyme
==
NULL
)
{
...
...
@@ -793,7 +802,7 @@ int main(int argc, char *argv[])
}
}
if
(
n
P
roc
esses
==
0
)
{
if
(
n
_p
roc
==
0
)
{
ERROR
(
"Invalid number of processes.
\n
"
);
return
1
;
}
...
...
@@ -900,18 +909,15 @@ int main(int argc, char *argv[])
}
else
{
STATUS
(
"No beam parameters file was given, so I'm taking the"
" nominal photon energy to be 2 keV.
\n
"
);
ERROR
(
"I'm also going to assume 1 ADU per photon, which is"
);
ERROR
(
" almost certainly wrong. Peak sigmas will be"
" incorrect.
\n
"
);
nominal_photon_energy
=
2000
.
0
;
}
if
(
beam
==
NULL
)
{
ERROR
(
"Warning: no beam parameters file.
\n
"
);
ERROR
(
"I'm going to assume 1 ADU per photon, which is almost"
);
ERROR
(
" certainly wrong. Peak sigmas will be incorrect.
\n
"
);
}
/* Get first filename and use it to set up the indexing */
prepare_line
=
malloc
(
LINE_LENGTH
*
sizeof
(
char
)
);
rval
=
fgets
(
prepare_line
,
LINE_LENGTH
-
1
,
fh
);
prepare_line
=
malloc
(
1024
);
rval
=
fgets
(
prepare_line
,
1023
,
fh
);
if
(
rval
==
NULL
)
{
ERROR
(
"Failed to get filename to prepare indexing.
\n
"
);
return
1
;
...
...
@@ -923,7 +929,7 @@ int main(int argc, char *argv[])
free
(
prepare_line
);
prepare_line
=
tmp
;
}
snprintf
(
prepare_filename
,
LINE_LENGTH
-
1
,
"%s%s"
,
prefix
,
prepare_line
);
snprintf
(
prepare_filename
,
1023
,
"%s%s"
,
prefix
,
prepare_line
);
rewind
(
fh
);
/* Prepare the indexer */
...
...
@@ -979,6 +985,20 @@ int main(int argc, char *argv[])
n_processed_last_stats
=
0
;
t_last_stats
=
get_monotonic_seconds
();
FD_ZERO
(
&
fds
);
filename_pipes
=
calloc
(
n_proc
,
sizeof
(
int
));
result_pipes
=
calloc
(
n_proc
,
sizeof
(
int
));
if
(
(
filename_pipes
==
NULL
)
||
(
result_pipes
==
NULL
)
)
{
ERROR
(
"Couldn't allocate memory for pipes.
\n
"
);
return
1
;
}
pids
=
calloc
(
n_proc
,
sizeof
(
pid_t
));
if
(
pids
==
NULL
)
{
ERROR
(
"Couldn't allocate memory for PIDs.
\n
"
);
return
1
;
}
/* Fork the right number of times */
for
(
i
=
0
;
i
<
n_proc
;
i
++
)
{
...
...
@@ -991,7 +1011,7 @@ int main(int argc, char *argv[])
return
1
;
}
if
(
pipe
(
result
s
_pipe
)
==
-
1
)
{
if
(
pipe
(
result_pipe
)
==
-
1
)
{
ERROR
(
"pipe() failed!
\n
"
);
return
1
;
}
...
...
@@ -1007,80 +1027,116 @@ int main(int argc, char *argv[])
* pipe, and the 'write' end of the result pipe. */
close
(
filename_pipe
[
1
]);
close
(
result_pipe
[
0
]);
run_work
(
&
iargs
,
filename_pipe
[
0
],
result_pipe
[
1
]);
run_work
(
&
iargs
,
filename_pipe
[
0
],
result_pipe
[
1
]
,
i
);
exit
(
0
);
}
/* Parent process gets the 'write' end of the filename pipe
* and the 'read' end of the result pipe. */
pid
[
i
]
=
p
;
pid
s
[
i
]
=
p
;
close
(
filename_pipe
[
0
]);
close
(
result_pipe
[
1
]);
filename_pipes
[
i
]
=
filename_pipe
[
1
];
result_pipes
[
i
]
=
result_pipe
[
0
];
FD_SET
(
result_pipes
[
i
],
&
fds
);
}
/* Send first image to all children */
char
*
nextImage
=
NULL
;
for
(
i
=
0
;
i
<
nProcesses
;
i
++
)
{
for
(
i
=
0
;
i
<
n_proc
;
i
++
)
{
char
*
nextImage
;
nextImage
=
get_pattern
(
fh
);
buff_count
=
sprintf
(
buffW
,
"%s"
,
nextImage
);
write
(
fd_pipeOut
[
i
][
1
],
buffW
,
buff_count
);
write
(
filename_pipes
[
i
],
nextImage
,
strlen
(
nextImage
));
write
(
filename_pipes
[
i
],
"
\n
"
,
1
);
}
int
nFinished
=
0
;
while
(
!
allDone
)
{
/* select from file set for reading */
if
((
ready_fd
=
select
(
max_fd
,
&
fdset
,
NULL
,
NULL
,
NULL
))
<
0
)
ERROR
(
"select"
);
if
(
ready_fd
>
0
)
{
for
(
i
=
0
;
i
<
nProcesses
;
i
++
)
{
/* is in file set that raised flag? */
if
(
FD_ISSET
(
fd_pipeIn
[
i
][
0
],
&
fdset
))
{
/* read from pipe and return number of bytes read */
if
((
buff_count
=
read
(
fd_pipeIn
[
i
][
0
],
&
buffR
,
BUFFER
))
<
0
)
{
ERROR
(
"read"
);
}
else
{
qargs
.
n_indexable
+=
atoi
(
buffR
);
qargs
.
n_processed
++
;
/* write to pipe */
if
((
nextImage
=
get_pattern
(
fh
))
==
NULL
){
nFinished
++
;
/* no more images */
if
(
nFinished
==
nProcesses
)
allDone
=
1
;
/* EXIT */
}
else
{
/* send out image */
buff_count
=
sprintf
(
buffW
,
"%s"
,
nextImage
);
if
(
write
(
fd_pipeOut
[
i
][
1
],
buffW
,
buff_count
)
<
0
)
ERROR
(
"write pipe"
);
}
allDone
=
0
;
nFinished
=
0
;
while
(
!
allDone
)
{
int
r
;
struct
timeval
tv
;
fd_set
fds_copy
;
double
tNow
;
tv
.
tv_sec
=
5
;
tv
.
tv_usec
=
0
;
memcpy
(
&
fds_copy
,
&
fds
,
sizeof
(
fd_set
));
r
=
select
(
n_proc
,
&
fds
,
NULL
,
NULL
,
&
tv
);
if
(
r
<
0
)
{
ERROR
(
"select() failed!
\n
"
);
}
else
{
for
(
i
=
0
;
i
<
n_proc
;
i
++
)
{
char
*
nextImage
;
char
results
[
1024
];
if
(
!
FD_ISSET
(
result_pipes
[
i
],
&
fds_copy
)
)
{
continue
;
}
r
=
read
(
result_pipes
[
i
],
results
,
1024
);
if
(
r
<
0
)
{
ERROR
(
"read() failed!"
);
continue
;
}
n_indexable
+=
atoi
(
results
);
n_processed
++
;
/* Send next filename */
nextImage
=
get_pattern
(
fh
);
if
(
nextImage
==
NULL
)
{
/* no more images */
nFinished
++
;
if
(
nFinished
==
n_proc
)
{
allDone
=
1
;
}
}
else
{
r
=
write
(
filename_pipes
[
i
],
nextImage
,
strlen
(
nextImage
));
if
(
r
<
0
)
{
ERROR
(
"write pipe"
);
}
}
}
}
/* file set is modified, so copy original from tmpset */
memcpy
((
void
*
)
&
fdset
,(
void
*
)
&
tmpset
,
sizeof
(
fd_set
));
/* Update to screen */
double
tNow
=
get_monotonic_seconds
();
if
(
tNow
>=
qargs
.
t_last_stats
+
STATS_EVERY_N_SECONDS
)
{
STATUS
(
"
%i out of %i in
dexed so far,"
" %i out of %i since the last message.
\n\n
"
,
qargs
.
n_indexable
,
qargs
.
n_processed
,
qargs
.
n_indexable
-
qargs
.
n_indexable
_last_stats
,
qargs
.
n_processed
-
qargs
.
n_processed_last_stats
);
qargs
.
n_indexable_last_stats
=
qargs
.
n_indexable
;
qargs
.
n_processed_last_stats
=
qargs
.
n_processed
;
qargs
.
t_last_stats
=
tNow
;
/* Update progress */
tNow
=
get_monotonic_seconds
();
if
(
tNow
>=
t_last_stats
+
STATS_EVERY_N_SECONDS
)
{
STATUS
(
"%i out of %i indexed so far,"
"
%i out of %i
s
in
ce the last message.
\n\n
"
,
n_indexable
,
n_processed
,
n_indexable
-
n_indexable_last_stats
,
n_processed
-
n_processed
_last_stats
);
n_indexable_last_stats
=
n_indexable
;
n_processed_last_stats
=
n_processed
;
t_last_stats
=
tNow
;
}
}
/* close my pipes */
for
(
i
=
0
;
i
<
n
P
roc
esses
;
i
++
)
{
close
(
f
d_pipeIn