
marvin at rectangular
Aug 3, 2008, 6:42 PM
Post #1 of 1
(410 views)
Permalink
|
|
r3710 - in trunk: c_src/KinoSearch/Store c_src/KinoSearch/Util perl/lib
|
|
Author: creamyg Date: 2008-08-03 18:42:17 -0700 (Sun, 03 Aug 2008) New Revision: 3710 Modified: trunk/c_src/KinoSearch/Store/Lock.c trunk/c_src/KinoSearch/Util/Json.bp trunk/c_src/KinoSearch/Util/Json.c trunk/perl/lib/KinoSearch.pm Log: Fix an unlikely potential race condition when obtaining a lock. Modified: trunk/c_src/KinoSearch/Store/Lock.c =================================================================== --- trunk/c_src/KinoSearch/Store/Lock.c 2008-08-03 23:23:46 UTC (rev 3709) +++ trunk/c_src/KinoSearch/Store/Lock.c 2008-08-04 01:42:17 UTC (rev 3710) @@ -79,6 +79,7 @@ { Hash *file_data; CharBuf *pid_buf; + bool_t success; if (Folder_File_Exists(self->folder, self->filename)) return false; @@ -89,13 +90,13 @@ Hash_Store_Str(file_data, "pid", 3, (Obj*)pid_buf); Hash_Store_Str(file_data, "agent_id", 8, (Obj*)self->agent_id); Hash_Store_Str(file_data, "lock_name", 9, (Obj*)self->lock_name); - Json_spew_json((Obj*)file_data, self->folder, self->filename); + success = Json_spew_json((Obj*)file_data, self->folder, self->filename); /* Clean up. */ REFCOUNT_DEC(pid_buf); REFCOUNT_DEC(file_data); - return true; + return success; } void Modified: trunk/c_src/KinoSearch/Util/Json.bp =================================================================== --- trunk/c_src/KinoSearch/Util/Json.bp 2008-08-03 23:23:46 UTC (rev 3709) +++ trunk/c_src/KinoSearch/Util/Json.bp 2008-08-04 01:42:17 UTC (rev 3710) @@ -6,9 +6,11 @@ */ class KinoSearch::Util::Json extends KinoSearch::Obj::FastObj { - /** Encode <code>obj</code> as JSON and write to the indicated file. + /** Encode <code>obj</code> as JSON and attempt to write to the indicated + * file. + * @return true if the write succeeds, false if it fails. */ - static void + static bool_t spew_json(Obj *obj, Folder *folder, const CharBuf *filename); /** Decode the JSON in the indicated file and return a data structure made Modified: trunk/c_src/KinoSearch/Util/Json.c =================================================================== --- trunk/c_src/KinoSearch/Util/Json.c 2008-08-03 23:23:46 UTC (rev 3709) +++ trunk/c_src/KinoSearch/Util/Json.c 2008-08-04 01:42:17 UTC (rev 3710) @@ -4,19 +4,18 @@ #include "KinoSearch/Store/Folder.h" #include "KinoSearch/Util/Native.h" -Json callback_dummy = { (VirtualTable*)&JSON, {1} }; - -void +bool_t Json_spew_json(Obj *obj, Folder *folder, const CharBuf *filename) { - Native_callback(&callback_dummy, "spew_json", 3, ARG_OBJ("obj", obj), - ARG_OBJ("folder", folder), ARG_OBJ("filename", filename)); + return (bool_t)Native_callback_i(&JSON, "spew_json", 3, + ARG_OBJ("obj", obj), ARG_OBJ("folder", folder), + ARG_STR("filename", filename)); } Obj* Json_slurp_json(Folder *folder, const CharBuf *filename) { - return Native_callback_obj(&callback_dummy, "slurp_json", 2, - ARG_OBJ("folder", folder), ARG_OBJ("filename", filename)); + return Native_callback_obj(&JSON, "slurp_json", 2, + ARG_OBJ("folder", folder), ARG_STR("filename", filename)); } Modified: trunk/perl/lib/KinoSearch.pm =================================================================== --- trunk/perl/lib/KinoSearch.pm 2008-08-03 23:23:46 UTC (rev 3709) +++ trunk/perl/lib/KinoSearch.pm 2008-08-04 01:42:17 UTC (rev 3710) @@ -830,10 +830,11 @@ my %args = @_; my $perl_data = to_perl( $args{obj} ); my $json = $json_encoder->encode($perl_data); - my $outstream = $args{folder}->open_outstream( $args{filename} ); + my $outstream = $args{folder}->safe_open_outstream( $args{filename} ); + return 0 unless $outstream; $outstream->print($json); $outstream->close; - return; + return 1; } } _______________________________________________ kinosearch-commits mailing list kinosearch-commits [at] rectangular http://www.rectangular.com/mailman/listinfo/kinosearch-commits
|