Skip to content

Commit

Permalink
Added a method to get and set extra pointers
Browse files Browse the repository at this point in the history
  • Loading branch information
gja committed Jun 5, 2011
1 parent 93f578c commit 25d1253
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
3 changes: 3 additions & 0 deletions ext/downpour/downpour.h
Expand Up @@ -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);
Expand All @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions ext/downpour/memory_allocation.c
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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;
}
4 changes: 4 additions & 0 deletions spec/downpour/column_spec.rb
Expand Up @@ -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

0 comments on commit 25d1253

Please sign in to comment.