From 25d12538af49bcb89b7c1fa059d07372293f4527 Mon Sep 17 00:00:00 2001 From: Tejas Dinkar Date: Sun, 5 Jun 2011 21:09:26 +0530 Subject: [PATCH] Added a method to get and set extra pointers --- ext/downpour/downpour.h | 3 +++ ext/downpour/memory_allocation.c | 27 +++++++++++++++++++++++++++ spec/downpour/column_spec.rb | 4 ++++ 3 files changed, 34 insertions(+) diff --git a/ext/downpour/downpour.h b/ext/downpour/downpour.h index 8957637..8862935 100644 --- a/ext/downpour/downpour.h +++ b/ext/downpour/downpour.h @@ -19,6 +19,8 @@ void *downpour_from_ruby_object(VALUE value); VALUE downpour_to_ruby_object(void *ptr, VALUE klass, VALUE parent, FREE_METHOD free_method, SET_CONTEXT set_context); VALUE downpour_get_ruby_object(void *ptr); VALUE downpour_get_parent(VALUE self); +void downpour_set_extra_pointer(VALUE self, void *extra_pointer, FREE_METHOD free_extra_pointer); +void *downpour_get_extra_pointer(VALUE self); // All Constructors VALUE downpour_constructor(drizzle_st *self_ptr); @@ -39,6 +41,7 @@ const char *drizzle_gem_read_string_with_default(VALUE string, const char *defau #define read_string(value, default_value) drizzle_gem_read_string_with_default(value, default_value) #define drizzle_alloc(type) ((type *) malloc(sizeof(type))) #define to_ruby_object(ptr, klass, parent, free_method, set_context) downpour_to_ruby_object(ptr, klass, parent, (FREE_METHOD) (free_method), (SET_CONTEXT) (set_context)) +#define set_extra_pointer(value, ptr, free_method) downpour_set_extra_pointer(value, ptr, (FREE_METHOD) free_method) // Property Macros -> define attr(foo, conversion) and settr_string to use them #define attr_string(foo) attr(foo, rb_str_new2) diff --git a/ext/downpour/memory_allocation.c b/ext/downpour/memory_allocation.c index 78316e4..23da075 100644 --- a/ext/downpour/memory_allocation.c +++ b/ext/downpour/memory_allocation.c @@ -6,6 +6,8 @@ typedef struct DownpourWrapper { struct DownpourWrapper *parent; FREE_METHOD free_method; VALUE rb_object; + void *extra_pointer; + FREE_METHOD free_extra_pointer_method; } DownpourWrapper; static void downpour_mark(DownpourWrapper *wrapper) @@ -16,6 +18,14 @@ static void downpour_mark(DownpourWrapper *wrapper) wrapper->reference_count++; } +static void free_extra_pointer(DownpourWrapper *wrapper) +{ + if(wrapper->extra_pointer == NULL || wrapper->free_extra_pointer_method == NULL) + return; + + wrapper->free_extra_pointer_method(wrapper->extra_pointer); +} + static void downpour_release(DownpourWrapper *wrapper) { if(wrapper == NULL) @@ -24,6 +34,7 @@ static void downpour_release(DownpourWrapper *wrapper) wrapper->reference_count--; if(wrapper->reference_count == 0) { + free_extra_pointer(wrapper); wrapper->free_method(wrapper->ptr); downpour_release(wrapper->parent); free(wrapper); @@ -37,6 +48,8 @@ static DownpourWrapper *downpour_wrap_pointer(void *ptr, DownpourWrapper *parent wrapper->parent = parent; wrapper->free_method = free_method; wrapper->reference_count = 0; + wrapper->extra_pointer = NULL; + wrapper->free_extra_pointer_method = NULL; downpour_mark(parent); downpour_mark(wrapper); @@ -101,3 +114,17 @@ VALUE downpour_get_parent(VALUE self) return wrapper->parent->rb_object; } + +void downpour_set_extra_pointer(VALUE self, void *extra_pointer, FREE_METHOD free_extra_pointer_method) +{ + DownpourWrapper *wrapper = get_wrapper_from_object(self); + free_extra_pointer(wrapper); + wrapper->extra_pointer = extra_pointer; + wrapper->free_extra_pointer_method = free_extra_pointer_method; +} + +void *downpour_get_extra_pointer(VALUE self) +{ + DownpourWrapper *wrapper = get_wrapper_from_object(self); + return wrapper->extra_pointer; +} diff --git a/spec/downpour/column_spec.rb b/spec/downpour/column_spec.rb index ff08cec..9b859ce 100644 --- a/spec/downpour/column_spec.rb +++ b/spec/downpour/column_spec.rb @@ -26,4 +26,8 @@ it "should have table name set on column" do @results.columns[0].table.should == "Test2" end + + it "should return the same column each time" do + @results.columns[0].should == @results.columns[0] + end end