You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2012/04/18 02:46:26 UTC
[lucy-commits] svn commit: r1327341 - /lucy/trunk/core/Lucy/Index/PolyReader.c
Author: marvin
Date: Wed Apr 18 00:46:26 2012
New Revision: 1327341
URL: http://svn.apache.org/viewvc?rev=1327341&view=rev
Log:
Refactor S_try_open_elements to use Err#trap.
Modified:
lucy/trunk/core/Lucy/Index/PolyReader.c
Modified: lucy/trunk/core/Lucy/Index/PolyReader.c
URL: http://svn.apache.org/viewvc/lucy/trunk/core/Lucy/Index/PolyReader.c?rev=1327341&r1=1327340&r2=1327341&view=diff
==============================================================================
--- lucy/trunk/core/Lucy/Index/PolyReader.c (original)
+++ lucy/trunk/core/Lucy/Index/PolyReader.c Wed Apr 18 00:46:26 2012
@@ -43,6 +43,14 @@ S_release_read_lock(PolyReader *self);
static void
S_release_deletion_lock(PolyReader *self);
+// Try to open all SegReaders.
+struct try_open_elements_context {
+ PolyReader *self;
+ VArray *seg_readers;
+};
+void
+S_try_open_elements(void *context);
+
// Try to read a Snapshot file.
struct try_read_snapshot_context {
Snapshot *snapshot;
@@ -205,13 +213,16 @@ S_try_open_segreader(void *context) {
args->segments, args->seg_tick);
}
-Obj*
-S_try_open_elements(PolyReader *self) {
- VArray *files = Snapshot_List(self->snapshot);
- Folder *folder = PolyReader_Get_Folder(self);
- uint32_t num_segs = 0;
- uint64_t latest_schema_gen = 0;
- CharBuf *schema_file = NULL;
+void
+S_try_open_elements(void *context) {
+ struct try_open_elements_context *args
+ = (struct try_open_elements_context*)context;
+ PolyReader *self = args->self;
+ VArray *files = Snapshot_List(self->snapshot);
+ Folder *folder = PolyReader_Get_Folder(self);
+ uint32_t num_segs = 0;
+ uint64_t latest_schema_gen = 0;
+ CharBuf *schema_file = NULL;
// Find schema file, count segments.
for (uint32_t i = 0, max = VA_Get_Size(files); i < max; i++) {
@@ -234,9 +245,8 @@ S_try_open_elements(PolyReader *self) {
// Read Schema.
if (!schema_file) {
- CharBuf *mess = MAKE_MESS("Can't find a schema file.");
DECREF(files);
- return (Obj*)Err_new(mess);
+ THROW(ERR, "Can't find a schema file.");
}
else {
Hash *dump = (Hash*)Json_slurp_json(folder, schema_file);
@@ -252,7 +262,7 @@ S_try_open_elements(PolyReader *self) {
CharBuf *mess = MAKE_MESS("Failed to parse %o", schema_file);
DECREF(schema_file);
DECREF(files);
- return (Obj*)Err_new(mess);
+ Err_throw_mess(ERR, mess);
}
}
@@ -276,7 +286,7 @@ S_try_open_elements(PolyReader *self) {
DECREF(segment);
DECREF(segments);
DECREF(files);
- return (Obj*)Err_new(mess);
+ Err_throw_mess(ERR, mess);
}
}
}
@@ -285,32 +295,30 @@ S_try_open_elements(PolyReader *self) {
VA_Sort(segments, NULL, NULL);
// Open individual SegReaders.
- struct try_open_segreader_context context;
- context.schema = PolyReader_Get_Schema(self);
- context.folder = folder;
- context.snapshot = PolyReader_Get_Snapshot(self);
- context.segments = segments;
- context.result = NULL;
- VArray *seg_readers = VA_new(num_segs);
+ struct try_open_segreader_context seg_context;
+ seg_context.schema = PolyReader_Get_Schema(self);
+ seg_context.folder = folder;
+ seg_context.snapshot = PolyReader_Get_Snapshot(self);
+ seg_context.segments = segments;
+ seg_context.result = NULL;
+ args->seg_readers = VA_new(num_segs);
Err *error = NULL;
for (uint32_t seg_tick = 0; seg_tick < num_segs; seg_tick++) {
- context.seg_tick = seg_tick;
- error = Err_trap(S_try_open_segreader, &context);
+ seg_context.seg_tick = seg_tick;
+ error = Err_trap(S_try_open_segreader, &seg_context);
if (error) {
break;
}
- VA_Push(seg_readers, (Obj*)context.result);
- context.result = NULL;
+ VA_Push(args->seg_readers, (Obj*)seg_context.result);
+ seg_context.result = NULL;
}
DECREF(segments);
DECREF(files);
if (error) {
- DECREF(seg_readers);
- return (Obj*)error;
- }
- else {
- return (Obj*)seg_readers;
+ DECREF(args->seg_readers);
+ args->seg_readers = NULL;
+ RETHROW(error);
}
}
@@ -409,22 +417,25 @@ PolyReader_do_open(PolyReader *self, Obj
* failed to open something, see if we can find a newer snapshot file.
* If we can, then the exception was due to the race condition. If
* not, we have a real exception, so throw an error. */
- Obj *result = S_try_open_elements(self);
- if (Obj_Is_A(result, ERR)) { // Error occurred.
+ struct try_open_elements_context context;
+ context.self = self;
+ context.seg_readers = NULL;
+ Err *error = Err_trap(S_try_open_elements, &context);
+ if (error) {
S_release_read_lock(self);
DECREF(target_snap_file);
if (last_gen < gen) { // Index updated, so try again.
- DECREF(result);
+ DECREF(error);
last_gen = gen;
}
else { // Real error.
if (manager) { S_release_deletion_lock(self); }
- RETHROW(result);
+ RETHROW(error);
}
}
else { // Succeeded.
- S_init_sub_readers(self, (VArray*)result);
- DECREF(result);
+ S_init_sub_readers(self, (VArray*)context.seg_readers);
+ DECREF(context.seg_readers);
DECREF(target_snap_file);
break;
}