25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-12-26 17:38:45 +01:00

Use driver allocators in iconv_erl.c for reflecting memory in erlang:memory(system)

This commit is contained in:
Evgeniy Khramtsov 2010-07-20 15:28:22 +10:00
parent 26f6eebaa9
commit 8c4884d665

View File

@ -64,15 +64,15 @@ static int iconv_erl_control(ErlDrvData drv_data,
ei_decode_version(buf, &index, &i); ei_decode_version(buf, &index, &i);
ei_decode_tuple_header(buf, &index, &i); ei_decode_tuple_header(buf, &index, &i);
ei_get_type(buf, &index, &i, &size); ei_get_type(buf, &index, &i, &size);
from = malloc(size + 1); from = driver_alloc(size + 1);
ei_decode_string(buf, &index, from); ei_decode_string(buf, &index, from);
ei_get_type(buf, &index, &i, &size); ei_get_type(buf, &index, &i, &size);
to = malloc(size + 1); to = driver_alloc(size + 1);
ei_decode_string(buf, &index, to); ei_decode_string(buf, &index, to);
ei_get_type(buf, &index, &i, &size); ei_get_type(buf, &index, &i, &size);
stmp = string = malloc(size + 1); stmp = string = driver_alloc(size + 1);
ei_decode_string(buf, &index, string); ei_decode_string(buf, &index, string);
/* Special mode: parse as UTF-8 if possible; otherwise assume it's /* Special mode: parse as UTF-8 if possible; otherwise assume it's
@ -92,9 +92,9 @@ static int iconv_erl_control(ErlDrvData drv_data,
*rbuf = (char*)(b = driver_alloc_binary(size)); *rbuf = (char*)(b = driver_alloc_binary(size));
memcpy(b->orig_bytes, string, size); memcpy(b->orig_bytes, string, size);
free(from); driver_free(from);
free(to); driver_free(to);
free(string); driver_free(string);
return size; return size;
} }
@ -102,7 +102,7 @@ static int iconv_erl_control(ErlDrvData drv_data,
outleft = avail = 4*size; outleft = avail = 4*size;
inleft = size; inleft = size;
rtmp = rstring = malloc(avail); rtmp = rstring = driver_alloc(avail);
while (inleft > 0) { while (inleft > 0) {
if (iconv(cd, &stmp, &inleft, &rtmp, &outleft) == (size_t) -1) { if (iconv(cd, &stmp, &inleft, &rtmp, &outleft) == (size_t) -1) {
if (invalid_utf8_as_latin1 && (*stmp & 0x80) && outleft >= 2) { if (invalid_utf8_as_latin1 && (*stmp & 0x80) && outleft >= 2) {
@ -121,10 +121,10 @@ static int iconv_erl_control(ErlDrvData drv_data,
*rbuf = (char*)(b = driver_alloc_binary(size)); *rbuf = (char*)(b = driver_alloc_binary(size));
memcpy(b->orig_bytes, rstring, size); memcpy(b->orig_bytes, rstring, size);
free(from); driver_free(from);
free(to); driver_free(to);
free(string); driver_free(string);
free(rstring); driver_free(rstring);
iconv_close(cd); iconv_close(cd);
return size; return size;