fixed memory leak

This commit is contained in:
Fournier Nicolas 2015-06-17 17:24:08 +02:00
parent 6ffe1d5dba
commit 6f02d4e355
4 changed files with 35 additions and 89 deletions

View File

@ -33,27 +33,30 @@ main (int argc, char ** argv)
struct GNUNET_CONFIGURATION_Handle *config;
struct PERF_TALER_MINTDB_Cmd test[] =
{
PERF_TALER_MINTDB_INIT_CMD_LOOP ("loop_db_init_deposit",100000),
PERF_TALER_MINTDB_INIT_CMD_LOOP ("loop_db_init_deposit",10),
PERF_TALER_MINTDB_INIT_CMD_START_TRANSACTION ("start_transaction_init"),
PERF_TALER_MINTDB_INIT_CMD_INSERT_DEPOSIT ("init_deposit_insert"),
PERF_TALER_MINTDB_INIT_CMD_COMMIT_TRANSACTION ("commit_transaction_init"),
PERF_TALER_MINTDB_INIT_CMD_END_LOOP ("endloop_init_deposit","loop_db_init_deposit"),
PERF_TALER_MINTDB_INIT_CMD_SAVE_ARRAY ("array_depo", "loop_db_init_deposit", "init_deposit_insert", 10, PERF_TALER_MINTDB_DEPOSIT),
PERF_TALER_MINTDB_INIT_CMD_END_LOOP ("endloop_init_deposit",
"loop_db_init_deposit"),
PERF_TALER_MINTDB_INIT_CMD_END("end")
};
// Plugin init
config = GNUNET_CONFIGURATION_create();
GNUNET_CONFIGURATION_load(config, "./test-mint-db-postgres.conf");
GNUNET_assert (NULL !=
(plugin = TALER_MINTDB_plugin_load (config)));
plugin->create_tables (plugin->cls, GNUNET_YES);
// Run command
PERF_TALER_MINTDB_interpret(plugin, test);
// Drop tables
{
struct TALER_MINTDB_Session *session;
session = plugin->get_session (plugin->cls, GNUNET_YES);
plugin->drop_temporary (plugin->cls, session);
}
TALER_MINTDB_plugin_unload(plugin);
GNUNET_CONFIGURATION_destroy(config);
return GNUNET_OK;

View File

@ -26,6 +26,7 @@
#define CURRENCY "EUR"
#define PERF_TALER_MINTDB_RSA_SIZE 256
/**
@ -193,7 +194,9 @@ PERF_TALER_MINTDB_deposit_init ()
GNUNET_assert (NULL !=
(eddsa_prvt = GNUNET_CRYPTO_eddsa_key_create ()));
GNUNET_assert (NULL !=
(rsa_prv = GNUNET_CRYPTO_rsa_private_key_create (128)));
(rsa_prv = GNUNET_CRYPTO_rsa_private_key_create (PERF_TALER_MINTDB_RSA_SIZE)));
GNUNET_CRYPTO_eddsa_key_get_public (eddsa_prvt,
&coin.coin_pub.eddsa_pub);
GNUNET_assert (NULL !=
(coin.denom_pub.rsa_public_key =
GNUNET_CRYPTO_rsa_private_key_get_public (rsa_prv)));
@ -202,8 +205,7 @@ PERF_TALER_MINTDB_deposit_init ()
GNUNET_CRYPTO_rsa_sign (rsa_prv,
&coin.coin_pub.eddsa_pub,
sizeof (struct GNUNET_CRYPTO_EddsaPublicKey))));
GNUNET_CRYPTO_eddsa_key_get_public (eddsa_prvt,
&coin.coin_pub.eddsa_pub);
GNUNET_CRYPTO_rsa_private_key_free (rsa_prv);
GNUNET_free (eddsa_prvt);
}
@ -273,6 +275,7 @@ PERF_TALER_MINTDB_deposit_free (struct TALER_MINTDB_Deposit *deposit)
return GNUNET_OK;
GNUNET_CRYPTO_rsa_public_key_free (deposit->coin.denom_pub.rsa_public_key);
GNUNET_CRYPTO_rsa_signature_free (deposit->coin.denom_sig.rsa_signature);
json_decref (deposit->wire);
GNUNET_free (deposit);
return GNUNET_OK;
@ -294,7 +297,7 @@ PERF_TALER_MINTDB_denomination_init ()
(dki = GNUNET_new (struct TALER_MINTDB_DenominationKeyIssueInformation)));
GNUNET_assert (NULL !=
(dki->denom_priv.rsa_private_key
= GNUNET_CRYPTO_rsa_private_key_create (128)));
= GNUNET_CRYPTO_rsa_private_key_create (PERF_TALER_MINTDB_RSA_SIZE)));
GNUNET_assert (NULL !=
(dki->denom_pub.rsa_public_key =
GNUNET_CRYPTO_rsa_private_key_get_public (dki->denom_priv.rsa_private_key)));
@ -363,7 +366,7 @@ PERF_TALER_MINTDB_coin_public_info_init ()
struct TALER_CoinPublicInfo *cpi;
GNUNET_assert (NULL !=
(denom_prv = GNUNET_CRYPTO_rsa_private_key_create (128)));
(denom_prv = GNUNET_CRYPTO_rsa_private_key_create (PERF_TALER_MINTDB_RSA_SIZE)));
GNUNET_assert (NULL !=
(coin_spent_prv = GNUNET_CRYPTO_eddsa_key_create ()));
GNUNET_assert (NULL !=

View File

@ -195,9 +195,18 @@ cmd_clean (struct PERF_TALER_MINTDB_Cmd cmd[])
static void
interpret_end_loop (struct PERF_TALER_MINTDB_interpreter_state *state)
{
int i;
int jump = cmd_find (state->cmd,
state->cmd[state->i].details.end_loop.label_loop);
// Cleaning up the memory in the loop
for (i = jump; i < state->i; i++)
{
// If the exposed variable has not been copied it is freed
if ( GNUNET_NO == state->cmd[i].exposed_saved)
data_free (&state->cmd[i].exposed, state->cmd[i].exposed_type);
state->cmd[i].exposed_saved = GNUNET_NO;
}
state->cmd[jump].details.loop.curr_iteration++;
// If the loop is not finished
if (state->cmd[jump].details.loop.max_iterations >
@ -209,15 +218,6 @@ interpret_end_loop (struct PERF_TALER_MINTDB_interpreter_state *state)
// Reset the loop counter and continue running
state->cmd[jump].details.loop.curr_iteration = 0;
}
// Cleaning up the memory in the loop
int j;
for (j = jump; j < state->i; j++)
{
// If the exposed variable has not been copied it is freed
if ( GNUNET_NO == state->cmd[j].exposed_saved)
data_free (&state->cmd[j].exposed, state->cmd[j].exposed_type);
state->cmd[j].exposed_saved = GNUNET_NO;
}
}
static void
@ -366,66 +366,6 @@ interpret (struct PERF_TALER_MINTDB_interpreter_state *state)
case PERF_TALER_MINTDB_CMD_SAVE_ARRAY:
interpret_save_array (state);
// {
// int loop_index;
// int proba;
// int rnd;
// // Array initialization on first loop iteration
// // Alows for nested loops
// if (0 == state->cmd[cmd_find (state->cmd,
// state->cmd[state->i]
// .details.save_array.label_loop)]
// .details.loop.curr_iteration)
// {
// state->cmd[state->i].details.save_array.index = 0;
// }
// loop_index = cmd_find (state->cmd,
// state->cmd[state->i].details.save_array.label_loop);
// // The probobility distribution of the saved items will be a little biased
// // against the few last items but it should not be a big problem.
// proba = state->cmd[loop_index].details.loop.max_iterations /
// state->cmd[state->i].details.save_array.nb_saved;
// rnd = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, proba);
// /*
// * If the remaining sapce is equal to the remaining number of
// * iterations, the item is automaticly saved.
// *
// * Else it is saved only if rdn is 0
// */
// if (((state->cmd[loop_index].details.loop.max_iterations -
// state->cmd[loop_index].details.loop.curr_iteration) ==
// (state->cmd[state->i].details.save_array.nb_saved -
// state->cmd[state->i].details.save_array.index))
// || (rnd == 0))
// {
// union PERF_TALER_MINTDB_Data *save_location;
// union PERF_TALER_MINTDB_Data *item_saved;
//
// save_location = &state->cmd[state->i].details.save_array
// .data_saved[state->cmd[state->i].details.save_array.index];
// item_saved = &state->cmd[cmd_find (state->cmd,
// state->cmd[state->i]
// .details.save_array.label_save)]
// .exposed;
// switch (state->cmd[state->i].details.save_array.type_saved)
// {
// case PERF_TALER_MINTDB_DEPOSIT:
// save_location->deposit = item_saved->deposit;
// break;
//
// case PERF_TALER_MINTDB_TIME:
// save_location->time = item_saved->time;
// break;
//
// default:
// break;
// }
// state->cmd[cmd_find (state->cmd,
// state->cmd[state->i].details.save_array.label_save)]
// .exposed_saved = GNUNET_YES;
// state->cmd[state->i].details.save_array.index++;
// }
// }
break;
case PERF_TALER_MINTDB_CMD_LOAD_ARRAY:
@ -461,14 +401,14 @@ interpret (struct PERF_TALER_MINTDB_interpreter_state *state)
case PERF_TALER_MINTDB_CMD_INSERT_DEPOSIT:
{
struct TALER_MINTDB_Deposit *deposit =
PERF_TALER_MINTDB_deposit_init ();
struct TALER_MINTDB_Deposit *deposit =
PERF_TALER_MINTDB_deposit_init ();
GNUNET_assert (
state->plugin->insert_deposit (state->plugin->cls,
state->session,
deposit));
state->cmd[state->i].exposed.deposit = deposit;
GNUNET_assert (
state->plugin->insert_deposit (state->plugin->cls,
state->session,
deposit));
state->cmd[state->i].exposed.deposit = deposit;
}
break;

View File

@ -125,7 +125,7 @@
{ \
.command = PERF_TALER_MINTDB_CMD_INSERT_DEPOSIT,\
.label = _label, \
.exposed_type = PERF_TALER_MINTDB_NONE, \
.exposed_type = PERF_TALER_MINTDB_DEPOSIT, \
}
/**
@ -144,7 +144,7 @@
* Extracts @a _nb_saved items of type @a _save_type
* from the command @a _label_save during the loop @a _label_loop
*/
#define PERF_TALER_MINTDB_INIT_CMD_SAMPLE_ARRAY(_label, _label_loop, _label_save, _nb_saved, _save_type) \
#define PERF_TALER_MINTDB_INIT_CMD_SAVE_ARRAY(_label, _label_loop, _label_save, _nb_saved, _save_type) \
{ \
.command = PERF_TALER_MINTDB_CMD_SAVE_ARRAY, \
.label = _label, \
@ -153,7 +153,7 @@
.label_loop = _label_loop, \
.label_save = _label_save, \
.nb_saved = _nb_saved, \
.save_type = _save_type \
.type_saved = _save_type \
} \
}