diff options
author | Eric Wong <normalperson@yhbt.net> | 2010-02-13 01:35:55 -0800 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2010-02-13 01:35:55 -0800 |
commit | 4247fafd0f361d2373df7213a1a0028554e93d93 (patch) | |
tree | e4e8e3f52b909725264463993422779892e3cdd4 /ext/clogger_ext/clogger.c | |
parent | 883368f745af13a57b3784b834001a82823eee05 (diff) | |
download | clogger-4247fafd0f361d2373df7213a1a0028554e93d93.tar.gz |
The optional C extension leaked memory due to improper use of the Ruby API, causing duplicated objects to never be garbage collected. I misread the Data_Make_Struct/Data_Wrap_Struct documentation and ended up passing NULL as the "free" argument instead of -1, causing the memory to never be freed. From README.EXT in the MRI source which I misread: > The free argument is the function to free the pointer > allocation. If this is -1, the pointer will be just freed. > The functions mark and free will be called from garbage > collector.
Diffstat (limited to 'ext/clogger_ext/clogger.c')
-rw-r--r-- | ext/clogger_ext/clogger.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c index da6b5d2..6e14938 100644 --- a/ext/clogger_ext/clogger.c +++ b/ext/clogger_ext/clogger.c @@ -188,7 +188,7 @@ static VALUE clogger_alloc(VALUE klass) { struct clogger *c; - return Data_Make_Struct(klass, struct clogger, clogger_mark, 0, c); + return Data_Make_Struct(klass, struct clogger, clogger_mark, -1, c); } static struct clogger *clogger_get(VALUE self) |