Fix memory leak in memcached_mget().

This commit is contained in:
Evan Weaver 2011-02-24 13:33:29 -08:00
Родитель 94cac4c64d
Коммит c538f37035
5 изменённых файлов: 30 добавлений и 15 удалений

Просмотреть файл

@ -1,3 +1,5 @@
v1.1.2. Fix memory leak in memcached_mget().
v1.1.1. Speed up multiget. Don't cast types on unmarshalled set. v1.1.1. Speed up multiget. Don't cast types on unmarshalled set.
v1.1. TTL interface requires Fixnums. v1.1. TTL interface requires Fixnums.

Просмотреть файл

@ -41,19 +41,8 @@
$1[i] = StringValuePtr(RARRAY_PTR($input)[i]); $1[i] = StringValuePtr(RARRAY_PTR($input)[i]);
} }
} }
%typemap(in) (char **keys, size_t *key_length, unsigned int number_of_keys) {
int i; %typemap(freearg) (const char **keys, size_t *key_length, size_t number_of_keys) {
Check_Type($input, T_ARRAY);
$3 = (unsigned int) RARRAY_LEN($input);
$2 = (size_t *) malloc(($3+1)*sizeof(size_t));
$1 = (char **) malloc(($3+1)*sizeof(char *));
for(i = 0; i < $3; i ++) {
Check_Type(RARRAY_PTR($input)[i], T_STRING);
$2[i] = RSTRING_LEN(RARRAY_PTR($input)[i]);
$1[i] = StringValuePtr(RARRAY_PTR($input)[i]);
}
}
%typemap(freearg) (char **keys, size_t *key_length, size_t number_of_keys) {
free($1); free($1);
free($2); free($2);
} }

Просмотреть файл

@ -8849,8 +8849,16 @@ _wrap_memcached_mget(int argc, VALUE *argv, VALUE self) {
} }
result = (memcached_return)memcached_mget(arg1,(char const **)arg2,arg3,arg4); result = (memcached_return)memcached_mget(arg1,(char const **)arg2,arg3,arg4);
vresult = SWIG_From_int((int)(result)); vresult = SWIG_From_int((int)(result));
{
free(arg2);
free(arg3);
}
return vresult; return vresult;
fail: fail:
{
free(arg2);
free(arg3);
}
return Qnil; return Qnil;
} }
@ -8896,8 +8904,16 @@ _wrap_memcached_mget_len(int argc, VALUE *argv, VALUE self) {
arg5 = (uint32_t)(val5); arg5 = (uint32_t)(val5);
result = (memcached_return)memcached_mget_len(arg1,(char const **)arg2,arg3,arg4,arg5); result = (memcached_return)memcached_mget_len(arg1,(char const **)arg2,arg3,arg4,arg5);
vresult = SWIG_From_int((int)(result)); vresult = SWIG_From_int((int)(result));
{
free(arg2);
free(arg3);
}
return vresult; return vresult;
fail: fail:
{
free(arg2);
free(arg3);
}
return Qnil; return Qnil;
} }
@ -9031,9 +9047,17 @@ _wrap_memcached_mget_by_key(int argc, VALUE *argv, VALUE self) {
result = (memcached_return)memcached_mget_by_key(arg1,(char const *)arg2,arg3,(char const **)arg4,arg5,arg6,arg7); result = (memcached_return)memcached_mget_by_key(arg1,(char const *)arg2,arg3,(char const **)arg4,arg5,arg6,arg7);
vresult = SWIG_From_int((int)(result)); vresult = SWIG_From_int((int)(result));
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
{
free(arg4);
free(arg5);
}
return vresult; return vresult;
fail: fail:
if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2);
{
free(arg4);
free(arg5);
}
return Qnil; return Qnil;
} }

Просмотреть файл

@ -103,7 +103,7 @@ class Worker
end end
when "multiget" when "multiget"
@i.times do @i.times do
@cache.get([@key1, @key2]) @cache.get([@key1, @key2, @key3])
end end
when "clone" when "clone"
@i.times do @i.times do

Просмотреть файл

@ -1,3 +1,3 @@
require "#{File.dirname(__FILE__)}/../setup" require "#{File.dirname(__FILE__)}/../setup"
exec("valgrind --tool=memcheck --leak-check=full --show-reachable=no --num-callers=15 --track-fds=yes --workaround-gcc296-bugs=yes --max-stackframe=7304328 --dsymutil=yes --track-origins=yes ruby -r#{File.dirname(__FILE__)}/exercise.rb -e \"Worker.new('mixed', 10000, 'true').work\"") exec("valgrind --tool=memcheck --error-limit=no --leak-check=full --show-reachable=no --num-callers=15 --track-fds=yes --workaround-gcc296-bugs=yes --max-stackframe=7304328 --dsymutil=yes --track-origins=yes ruby -r#{File.dirname(__FILE__)}/exercise.rb -e \"Worker.new(ENV['TEST'] || 'mixed', 500, 'true').work\"")