Skip to content

Commit

Permalink
closes #338. Clear read conversion cache on received_count= and recei…
Browse files Browse the repository at this point in the history
…ved_time=
  • Loading branch information
ryanmelt committed Nov 23, 2016
1 parent 77abe7f commit c8729a1
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
10 changes: 10 additions & 0 deletions ext/cosmos/ext/packet/packet.c
Expand Up @@ -22,6 +22,7 @@ static ID id_method_packet_name_equals = 0;
static ID id_method_description_equals = 0;
static ID id_method_upcase = 0;
static ID id_method_clone = 0;
static ID id_method_clear = 0;

static ID id_ivar_id_items = 0;
static ID id_ivar_id_value = 0;
Expand Down Expand Up @@ -169,6 +170,7 @@ static VALUE description_equals(VALUE self, VALUE description) {
*
* @param received_time [Time] Time this packet was received */
static VALUE received_time_equals(VALUE self, VALUE received_time) {
volatile VALUE read_conversion_cache = rb_ivar_get(self, id_ivar_read_conversion_cache);
if (RTEST(received_time)) {
if (rb_funcall(received_time, id_method_class, 0) != rb_cTime) {
rb_raise(rb_eArgError, "received_time must be a Time but is a %s", RSTRING_PTR(rb_funcall(rb_funcall(received_time, id_method_class, 0), id_method_to_s, 0)));
Expand All @@ -177,6 +179,9 @@ static VALUE received_time_equals(VALUE self, VALUE received_time) {
} else {
rb_ivar_set(self, id_ivar_received_time, Qnil);
}
if (RTEST(read_conversion_cache)) {
rb_funcall(read_conversion_cache, id_method_clear, 0);
}
return rb_ivar_get(self, id_ivar_received_time);
}

Expand All @@ -185,10 +190,14 @@ static VALUE received_time_equals(VALUE self, VALUE received_time) {
* @param received_count [Integer] Number of times this packet has been
* received */
static VALUE received_count_equals(VALUE self, VALUE received_count) {
volatile VALUE read_conversion_cache = rb_ivar_get(self, id_ivar_read_conversion_cache);
if (rb_funcall(received_count, id_method_class, 0) != rb_cFixnum) {
rb_raise(rb_eArgError, "received_count must be a Fixnum but is a %s", RSTRING_PTR(rb_funcall(rb_funcall(received_count, id_method_class, 0), id_method_to_s, 0)));
}
rb_ivar_set(self, id_ivar_received_count, received_count);
if (RTEST(read_conversion_cache)) {
rb_funcall(read_conversion_cache, id_method_clear, 0);
}
return rb_ivar_get(self, id_ivar_received_count);
}

Expand Down Expand Up @@ -299,6 +308,7 @@ void Init_packet (void)
id_method_description_equals = rb_intern("description=");
id_method_upcase = rb_intern("upcase");
id_method_clone = rb_intern("clone");
id_method_clear = rb_intern("clear");

id_ivar_id_items = rb_intern("@id_items");
id_ivar_id_value = rb_intern("@id_value");
Expand Down
15 changes: 10 additions & 5 deletions lib/cosmos/packets/packet.rb
Expand Up @@ -122,6 +122,11 @@ def buffer=(buffer)
def set_received_time_fast(received_time)
@received_time = received_time
@received_time.freeze if @received_time
if @read_conversion_cache
synchronize() do
@read_conversion_cache.clear
end
end
end

# Sets the received count of the packet
Expand Down Expand Up @@ -440,11 +445,6 @@ def read_item(item, value_type = :CONVERTED, buffer = @buffer)
# @param value_type (see #read_item)
# @param buffer (see Structure#write_item)
def write_item(item, value, value_type = :CONVERTED, buffer = @buffer)
if @read_conversion_cache
synchronize() do
@read_conversion_cache.clear
end
end
case value_type
when :RAW
super(item, value, value_type, buffer)
Expand Down Expand Up @@ -473,6 +473,11 @@ def write_item(item, value, value_type = :CONVERTED, buffer = @buffer)
else
raise ArgumentError, "Unknown value type on write: #{value_type}"
end
if @read_conversion_cache
synchronize() do
@read_conversion_cache.clear
end
end
end

# Read an item in the packet by name
Expand Down

0 comments on commit c8729a1

Please sign in to comment.