aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2012-05-29 17:49:54 +0200
committerThomas White <taw@physics.org>2012-05-29 17:49:54 +0200
commitdde3608a7d1b74d37f26d4fcf9ab89a092a4dd33 (patch)
treec9cb17813a85c3f8c2309ba6758607e7a222aac7 /src
parent75e3e982a09fb778270b5006d857a89626f35211 (diff)
WIP
Diffstat (limited to 'src')
-rw-r--r--src/indexamajig.c130
1 files changed, 85 insertions, 45 deletions
diff --git a/src/indexamajig.c b/src/indexamajig.c
index 21a60d7f..bb5be4b5 100644
--- a/src/indexamajig.c
+++ b/src/indexamajig.c
@@ -221,24 +221,47 @@ static void show_help(const char *s)
}
-static char *get_pattern(FILE *fh)
+static char *get_pattern(FILE *fh, char **use_this_one_instead,
+ int config_basename, const char *prefix)
{
- char *rval;
char *line;
+ char *filename;
+
+ /* Get the next filename */
+ if ( *use_this_one_instead != NULL ) {
+
+ line = *use_this_one_instead;
+ *use_this_one_instead = NULL;
+
+ } else {
+
+ char *rval;
+
+ line = malloc(1024*sizeof(char));
+ rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) {
+ free(line);
+ return NULL;
+ }
- 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;
+ chomp(line);
+
+ if ( config_basename ) {
+ char *tmp;
+ tmp = safe_basename(line);
+ free(line);
+ line = tmp;
}
- return rval;
+ filename = malloc(strlen(prefix)+strlen(line)+1);
+
+ snprintf(filename, 1023, "%s%s", prefix, line);
+
+ free(line);
+
+ return filename;
}
@@ -257,7 +280,7 @@ static void process_image(const struct index_args *iargs,
struct hdfile *hdfile;
char *outfile = iargs->outfile;
struct image image;
- char *outfilename;
+ char *outfilename = iargs->outfile;
int fd;
FILE *fh;
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0};
@@ -363,7 +386,6 @@ static void process_image(const struct index_args *iargs,
image.bw = beam->bandwidth;
image.profile_radius = 0.0001e9;
- /* RUN INDEXING HERE */
index_pattern(&image, cell, indm, iargs->cellr,
config_verbose, iargs->ipriv,
iargs->config_insane, iargs->tols);
@@ -398,10 +420,9 @@ static void process_image(const struct index_args *iargs,
exit(1);
}
- /* LOCKED! Write chunk */
fh = fopen(outfilename, "a");
- if (fh == NULL) {
- ERROR("Error inside lock\n");
+ if ( fh == NULL ) {
+ ERROR("Couldn't open stream '%s'.\n", outfilename);
}
write_chunk(fh, &image, hdfile, iargs->stream_flags);
fclose(fh);
@@ -430,44 +451,53 @@ static void run_work(const struct index_args *iargs,
int filename_pipe, int results_pipe, int cookie)
{
int allDone = 0;
+ FILE *fh;
+
+ fh = fdopen(filename_pipe, "r");
+ if ( fh == NULL ) {
+ ERROR("Failed to fdopen() the filename pipe!\n");
+ close(filename_pipe);
+ close(results_pipe);
+ return;
+ }
while ( !allDone ) {
struct pattern_args pargs;
- int r, w;
+ int w, c;
char buf[1024];
+ char *line;
+ char *rval;
+
+ line = malloc(1024*sizeof(char));
+ STATUS("Waiting for filename...\n");
+ rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) {
+ free(line);
+ ERROR("Read error!\n");
+ return;
+ }
- 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;
-
- STATUS("Got filename: '%s'\n", buf);
+ chomp(line);
+ pargs.filename = line;
+ pargs.indexable = 0;
- process_image(iargs, &pargs, cookie);
+ STATUS("Got filename: '%s'\n", line);
- /* Request another image */
- c = sprintf(buf, "%i\n", pargs.indexable);
- w = write(results_pipe, buf, c);
- if ( w < 0 ) {
- ERROR("write P0");
- }
+ process_image(iargs, &pargs, cookie);
- } else {
- allDone = 1;
+ /* Request another image */
+ c = sprintf(buf, "%i\n", pargs.indexable);
+ w = write(results_pipe, buf, c);
+ if ( w < 0 ) {
+ ERROR("write P0");
}
+ free(line);
+
}
/* close my pipes */
+ fclose(fh);
close(filename_pipe);
close(results_pipe);
}
@@ -562,6 +592,7 @@ int main(int argc, char *argv[])
int n_proc = 1;
char *prepare_line;
char prepare_filename[1024];
+ char *use_this_one_instead;
struct index_args iargs;
struct beam_params *beam = NULL;
char *element = NULL;
@@ -922,6 +953,7 @@ int main(int argc, char *argv[])
ERROR("Failed to get filename to prepare indexing.\n");
return 1;
}
+ use_this_one_instead = strdup(prepare_line);
chomp(prepare_line);
if ( config_basename ) {
char *tmp;
@@ -930,7 +962,6 @@ int main(int argc, char *argv[])
prepare_line = tmp;
}
snprintf(prepare_filename, 1023, "%s%s", prefix, prepare_line);
- rewind(fh);
/* Prepare the indexer */
if ( indm != NULL ) {
@@ -1048,11 +1079,14 @@ int main(int argc, char *argv[])
char *nextImage;
- nextImage = get_pattern(fh);
+ nextImage = get_pattern(fh, &use_this_one_instead,
+ config_basename, prefix);
write(filename_pipes[i], nextImage, strlen(nextImage));
write(filename_pipes[i], "\n", 1);
+ free(nextImage);
+
}
allDone = 0;
@@ -1095,7 +1129,11 @@ int main(int argc, char *argv[])
n_processed++;
/* Send next filename */
- nextImage = get_pattern(fh);
+ nextImage = get_pattern(fh,
+ &use_this_one_instead,
+ config_basename,
+ prefix);
+
if ( nextImage == NULL ) {
/* no more images */
nFinished++;
@@ -1106,6 +1144,7 @@ int main(int argc, char *argv[])
r = write(filename_pipes[i], nextImage,
strlen(nextImage));
+ r -= write(filename_pipes[i], "\n", 1);
if ( r < 0 ) {
ERROR("write pipe");
}
@@ -1120,7 +1159,7 @@ int main(int argc, char *argv[])
if ( tNow >= t_last_stats+STATS_EVERY_N_SECONDS ) {
STATUS("%i out of %i indexed so far,"
- " %i out of %i since the last message.\n\n",
+ " %i out of %i since the last message.\n",
n_indexable, n_processed,
n_indexable - n_indexable_last_stats,
n_processed - n_processed_last_stats);
@@ -1149,6 +1188,7 @@ int main(int argc, char *argv[])
free(hdf5_peak_path);
free_copy_hdf5_field_list(copyme);
cell_free(cell);
+ free(use_this_one_instead);
if ( fh != stdin ) fclose(fh);
if ( ofh != stdout ) fclose(ofh);