Mailing List Archive

r3759 - trunk/c_src/KinoSearch/Obj
Author: creamyg
Date: 2008-08-24 21:46:32 -0700 (Sun, 24 Aug 2008)
New Revision: 3759

Modified:
trunk/c_src/KinoSearch/Obj/FastObj.bp
trunk/c_src/KinoSearch/Obj/FastObj.c
Log:
Fix a memory error in FastObj_Create(), and implement FastObj_Deserialize(),
fixing a nasty weird leak/error. (When FastObj was inheriting Obj's
Deserialize() method, it was being created as a subclass of Obj; i.e. with an
SV ref, rather than with an integer count. The address of this SV was being
treated as a refcount.)


Modified: trunk/c_src/KinoSearch/Obj/FastObj.bp
===================================================================
--- trunk/c_src/KinoSearch/Obj/FastObj.bp 2008-08-25 04:40:46 UTC (rev 3758)
+++ trunk/c_src/KinoSearch/Obj/FastObj.bp 2008-08-25 04:46:32 UTC (rev 3759)
@@ -16,6 +16,9 @@
Foster(FastObj *invoker, const CharBuf *class_name, VirtualTable *vtable,
size_t alloc_size, void *native_blank);

+ public incremented FastObj*
+ Deserialize(FastObj *self, InStream *instream);
+
u32_t
Get_RefCount(FastObj* self);


Modified: trunk/c_src/KinoSearch/Obj/FastObj.c
===================================================================
--- trunk/c_src/KinoSearch/Obj/FastObj.c 2008-08-25 04:40:46 UTC (rev 3758)
+++ trunk/c_src/KinoSearch/Obj/FastObj.c 2008-08-25 04:46:32 UTC (rev 3759)
@@ -6,6 +6,7 @@
#include <string.h>

#include "KinoSearch/Obj/FastObj.h"
+#include "KinoSearch/Store/InStream.h"
#include "KinoSearch/Util/VirtualTable.h"
#include "KinoSearch/Util/DynVirtualTable.h"
#include "KinoSearch/Util/Carp.h"
@@ -26,7 +27,7 @@
}
else {
VirtualTable *subclass_vtable
- = (VirtualTable*)DynVT_singleton((CharBuf*)&class_name, vtable);
+ = (VirtualTable*)DynVT_singleton((CharBuf*)class_name, vtable);
self->_ = REFCOUNT_INC(subclass_vtable);
}
self->ref.count = 1;
@@ -36,6 +37,21 @@
return self;
}

+FastObj*
+FastObj_deserialize(FastObj *self, InStream *instream)
+{
+ CharBuf *class_name = CB_deserialize(NULL, instream);
+ if (!self) {
+ self = (FastObj*)CREATE(class_name, KINO_FASTOBJ);
+ }
+ else {
+ if (!CB_Equals(class_name, (Obj*)self->_->name))
+ CONFESS("Class mismatch: %o %o", class_name, self->_->name);
+ }
+ REFCOUNT_DEC(class_name);
+ return (FastObj*)Obj_init((Obj*)self);
+}
+
chy_u32_t
FastObj_get_refcount(FastObj *self)
{


_______________________________________________
kinosearch-commits mailing list
kinosearch-commits@rectangular.com
http://www.rectangular.com/mailman/listinfo/kinosearch-commits