MEMORY add wrappers around all mallocs and frees and trace them

This patch adds a wrapper around all memory allocations and frees.
The idea is to get warned immediately if the application leaks memory.
Additionally the wrapper functions make it easy to add different
memory allocators or memory pools in the future.
This commit is contained in:
Peter Lieven
2012-11-03 01:05:57 +01:00
parent 389f6a8ba5
commit d327ab09c6
11 changed files with 300 additions and 287 deletions

View File

@@ -37,7 +37,7 @@ struct iscsi_scsi_cbdata {
};
void
iscsi_free_scsi_cbdata(struct iscsi_scsi_cbdata *scsi_cbdata)
iscsi_free_scsi_cbdata(struct iscsi_context *iscsi, struct iscsi_scsi_cbdata *scsi_cbdata)
{
if (scsi_cbdata == NULL) {
return;
@@ -45,7 +45,7 @@ iscsi_free_scsi_cbdata(struct iscsi_scsi_cbdata *scsi_cbdata)
if (scsi_cbdata->task != NULL) {
scsi_cbdata->task = NULL;
}
free(scsi_cbdata);
iscsi_free(iscsi, scsi_cbdata);
}
static void
@@ -186,13 +186,12 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
return -1;
}
scsi_cbdata = malloc(sizeof(struct iscsi_scsi_cbdata));
scsi_cbdata = iscsi_zmalloc(iscsi, sizeof(struct iscsi_scsi_cbdata));
if (scsi_cbdata == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: failed to allocate "
"scsi cbdata.");
return -1;
}
memset(scsi_cbdata, 0, sizeof(struct iscsi_scsi_cbdata));
scsi_cbdata->task = task;
scsi_cbdata->callback = cb;
scsi_cbdata->private_data = private_data;
@@ -204,7 +203,7 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
if (pdu == NULL) {
iscsi_set_error(iscsi, "Out-of-memory, Failed to allocate "
"scsi pdu.");
iscsi_free_scsi_cbdata(scsi_cbdata);
iscsi_free_scsi_cbdata(iscsi, scsi_cbdata);
return -1;
}
pdu->scsi_cbdata = scsi_cbdata;
@@ -384,7 +383,7 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
break;
case SCSI_STATUS_CHECK_CONDITION:
task->datain.size = in->data_pos;
task->datain.data = malloc(task->datain.size);
task->datain.data = iscsi_malloc(iscsi, task->datain.size);
if (task->datain.data == NULL) {
iscsi_set_error(iscsi, "failed to allocate blob for "
"sense data");
@@ -533,7 +532,7 @@ iscsi_testunitready_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_testunitready();
task = scsi_cdb_testunitready(iscsi);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"testunitready cdb.");
@@ -561,7 +560,7 @@ iscsi_reportluns_task(struct iscsi_context *iscsi, int report_type,
return NULL;
}
task = scsi_reportluns_cdb(report_type, alloc_len);
task = scsi_reportluns_cdb(iscsi, report_type, alloc_len);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"reportluns cdb.");
@@ -584,7 +583,7 @@ iscsi_inquiry_task(struct iscsi_context *iscsi, int lun, int evpd,
{
struct scsi_task *task;
task = scsi_cdb_inquiry(evpd, page_code, maxsize);
task = scsi_cdb_inquiry(iscsi, evpd, page_code, maxsize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"inquiry cdb.");
@@ -605,7 +604,7 @@ iscsi_readcapacity10_task(struct iscsi_context *iscsi, int lun, int lba,
{
struct scsi_task *task;
task = scsi_cdb_readcapacity10(lba, pmi);
task = scsi_cdb_readcapacity10(iscsi, lba, pmi);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"readcapacity10 cdb.");
@@ -626,7 +625,7 @@ iscsi_readcapacity16_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_readcapacity16();
task = scsi_cdb_readcapacity16(iscsi);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"readcapacity16 cdb.");
@@ -648,7 +647,7 @@ iscsi_get_lba_status_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_get_lba_status(starting_lba, alloc_len);
task = scsi_cdb_get_lba_status(iscsi, starting_lba, alloc_len);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"get-lba-status cdb.");
@@ -676,7 +675,7 @@ iscsi_read6_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_read6(lba, datalen, blocksize);
task = scsi_cdb_read6(iscsi, lba, datalen, blocksize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"read6 cdb.");
@@ -705,7 +704,7 @@ iscsi_read10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_read10(lba, datalen, blocksize, rdprotect,
task = scsi_cdb_read10(iscsi, lba, datalen, blocksize, rdprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -735,7 +734,7 @@ iscsi_read12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_read12(lba, datalen, blocksize, rdprotect,
task = scsi_cdb_read12(iscsi, lba, datalen, blocksize, rdprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -765,7 +764,7 @@ iscsi_read16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
return NULL;
}
task = scsi_cdb_read16(lba, datalen, blocksize, rdprotect,
task = scsi_cdb_read16(iscsi, lba, datalen, blocksize, rdprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -796,7 +795,7 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_write10(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_write10(iscsi, lba, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -831,7 +830,7 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_write12(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_write12(iscsi, lba, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -866,7 +865,7 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
return NULL;
}
task = scsi_cdb_write16(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_write16(iscsi, lba, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -901,7 +900,7 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
return NULL;
}
task = scsi_cdb_orwrite(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_orwrite(iscsi, lba, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -936,7 +935,7 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
return NULL;
}
task = scsi_cdb_compareandwrite(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_compareandwrite(iscsi, lba, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -971,7 +970,7 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_writeverify10(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_writeverify10(iscsi, lba, datalen, blocksize, wrprotect,
dpo, bytchk, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1006,7 +1005,7 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
return NULL;
}
task = scsi_cdb_writeverify12(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_writeverify12(iscsi, lba, datalen, blocksize, wrprotect,
dpo, bytchk, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1041,7 +1040,7 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
return NULL;
}
task = scsi_cdb_writeverify16(lba, datalen, blocksize, wrprotect,
task = scsi_cdb_writeverify16(iscsi, lba, datalen, blocksize, wrprotect,
dpo, bytchk, group_number);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1075,7 +1074,7 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
return NULL;
}
task = scsi_cdb_verify10(lba, datalen, vprotect, dpo, bytchk, blocksize);
task = scsi_cdb_verify10(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"verify10 cdb.");
@@ -1108,7 +1107,7 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
return NULL;
}
task = scsi_cdb_verify12(lba, datalen, vprotect, dpo, bytchk, blocksize);
task = scsi_cdb_verify12(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"verify12 cdb.");
@@ -1141,7 +1140,7 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
return NULL;
}
task = scsi_cdb_verify16(lba, datalen, vprotect, dpo, bytchk, blocksize);
task = scsi_cdb_verify16(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"verify16 cdb.");
@@ -1168,7 +1167,7 @@ iscsi_modesense6_task(struct iscsi_context *iscsi, int lun, int dbd, int pc,
{
struct scsi_task *task;
task = scsi_cdb_modesense6(dbd, pc, page_code, sub_page_code,
task = scsi_cdb_modesense6(iscsi, dbd, pc, page_code, sub_page_code,
alloc_len);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1192,7 +1191,7 @@ iscsi_startstopunit_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_startstopunit(immed, pcm, pc, no_flush,
task = scsi_cdb_startstopunit(iscsi, immed, pcm, pc, no_flush,
loej, start);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1215,7 +1214,7 @@ iscsi_preventallow_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_preventallow(prevent);
task = scsi_cdb_preventallow(iscsi, prevent);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"PreventAllowMediumRemoval cdb.");
@@ -1237,7 +1236,7 @@ iscsi_synchronizecache10_task(struct iscsi_context *iscsi, int lun, int lba,
{
struct scsi_task *task;
task = scsi_cdb_synchronizecache10(lba, num_blocks, syncnv,
task = scsi_cdb_synchronizecache10(iscsi, lba, num_blocks, syncnv,
immed);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1260,7 +1259,7 @@ iscsi_synchronizecache16_task(struct iscsi_context *iscsi, int lun, uint64_t lba
{
struct scsi_task *task;
task = scsi_cdb_synchronizecache16(lba, num_blocks, syncnv,
task = scsi_cdb_synchronizecache16(iscsi, lba, num_blocks, syncnv,
immed);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
@@ -1283,7 +1282,7 @@ iscsi_prefetch10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
{
struct scsi_task *task;
task = scsi_cdb_prefetch10(lba, num_blocks, immed, group);
task = scsi_cdb_prefetch10(iscsi, lba, num_blocks, immed, group);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"prefetch10 cdb.");
@@ -1305,7 +1304,7 @@ iscsi_prefetch16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
{
struct scsi_task *task;
task = scsi_cdb_prefetch16(lba, num_blocks, immed, group);
task = scsi_cdb_prefetch16(iscsi, lba, num_blocks, immed, group);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"prefetch16 cdb.");
@@ -1331,7 +1330,7 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun,
struct scsi_task *task;
struct iscsi_data outdata;
task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
task = scsi_cdb_writesame10(iscsi, wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"writesame10 cdb.");
@@ -1373,7 +1372,7 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun,
struct scsi_task *task;
struct iscsi_data outdata;
task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
task = scsi_cdb_writesame16(iscsi, wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"writesame16 cdb.");
@@ -1417,7 +1416,7 @@ iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group,
xferlen = 8 + list_len * 16;
task = scsi_cdb_unmap(anchor, group, xferlen);
task = scsi_cdb_unmap(iscsi, anchor, group, xferlen);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"unmap cdb.");
@@ -1484,7 +1483,7 @@ iscsi_readtoc_task(struct iscsi_context *iscsi, int lun, int msf,
{
struct scsi_task *task;
task = scsi_cdb_readtoc(msf, format, track_session, maxsize);
task = scsi_cdb_readtoc(iscsi, msf, format, track_session, maxsize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"read TOC cdb.");
@@ -1505,7 +1504,7 @@ iscsi_reserve6_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_reserve6();
task = scsi_cdb_reserve6(iscsi);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"reserve6 cdb.");
@@ -1526,7 +1525,7 @@ iscsi_release6_task(struct iscsi_context *iscsi, int lun,
{
struct scsi_task *task;
task = scsi_cdb_release6();
task = scsi_cdb_release6(iscsi);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"release6 cdb.");
@@ -1548,7 +1547,7 @@ iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi,
{
struct scsi_task *task;
task = scsi_cdb_report_supported_opcodes(return_timeouts, maxsize);
task = scsi_cdb_report_supported_opcodes(iscsi, return_timeouts, maxsize);
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"Maintenance In/Read Supported Op Codes cdb.");