Mailing List Archive

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@rectangular.com
http://www.rectangular.com/mailman/listinfo/kinosearch-commits