diff mbox

example: timer: free resources while termination

Message ID 1447930448-22273-1-git-send-email-ivan.khoronzhuk@linaro.org
State Superseded
Headers show

Commit Message

Ivan Khoronzhuk Nov. 19, 2015, 10:54 a.m. UTC
Example should free resources in right order when terminates.
Also it should have correct error path.

Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
---
 example/timer/odp_timer_test.c | 46 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 8 deletions(-)

Comments

Ivan Khoronzhuk Dec. 2, 2015, 10:38 a.m. UTC | #1
ping

On 19.11.15 12:54, Ivan Khoronzhuk wrote:
> Example should free resources in right order when terminates.
> Also it should have correct error path.
>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
> ---
>   example/timer/odp_timer_test.c | 46 ++++++++++++++++++++++++++++++++++--------
>   1 file changed, 38 insertions(+), 8 deletions(-)
>
> diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
> index 94619e4..2d74e4c 100644
> --- a/example/timer/odp_timer_test.c
> +++ b/example/timer/odp_timer_test.c
> @@ -331,18 +331,21 @@ int main(int argc, char *argv[])
>   	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
>   	odp_shm_t shm;
>   	test_globals_t	*gbls;
> +	int err = 0;
>
>   	printf("\nODP timer example starts\n");
>
>   	if (odp_init_global(NULL, NULL)) {
> +		err = 1;
>   		printf("ODP global init failed.\n");
> -		return -1;
> +		goto err;
>   	}
>
>   	/* Init this thread. */
>   	if (odp_init_local(ODP_THREAD_CONTROL)) {
> +		err = 1;
>   		printf("ODP local init failed.\n");
> -		return -1;
> +		goto err_global;
>   	}
>
>   	printf("\n");
> @@ -360,14 +363,16 @@ int main(int argc, char *argv[])
>   	shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),
>   			      ODP_CACHE_LINE_SIZE, 0);
>   	if (ODP_SHM_INVALID == shm) {
> +		err = 1;
>   		EXAMPLE_ERR("Error: shared mem reserve failed.\n");
> -		return -1;
> +		goto err_local;
>   	}
>
>   	gbls = odp_shm_addr(shm);
>   	if (NULL == gbls) {
> +		err = 1;
>   		EXAMPLE_ERR("Error: shared mem alloc failed.\n");
> -		return -1;
> +		goto err_shm;
>   	}
>   	memset(gbls, 0, sizeof(test_globals_t));
>
> @@ -404,8 +409,9 @@ int main(int argc, char *argv[])
>   	gbls->pool = odp_pool_create("msg_pool", &params);
>
>   	if (gbls->pool == ODP_POOL_INVALID) {
> +		err = 1;
>   		EXAMPLE_ERR("Pool create failed.\n");
> -		return -1;
> +		goto err_shm;
>   	}
>
>   	tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;
> @@ -416,8 +422,9 @@ int main(int argc, char *argv[])
>   	tparams.clk_src = ODP_CLOCK_CPU;
>   	gbls->tp = odp_timer_pool_create("timer_pool", &tparams);
>   	if (gbls->tp == ODP_TIMER_POOL_INVALID) {
> +		err = 1;
>   		EXAMPLE_ERR("Timer pool create failed.\n");
> -		return -1;
> +		goto err_msg_pool;
>   	}
>   	odp_timer_pool_start();
>
> @@ -442,8 +449,9 @@ int main(int argc, char *argv[])
>   	queue = odp_queue_create("timer_queue", ODP_QUEUE_TYPE_SCHED, &param);
>
>   	if (queue == ODP_QUEUE_INVALID) {
> +		err = 1;
>   		EXAMPLE_ERR("Timer queue create failed.\n");
> -		return -1;
> +		goto err_timer_pool;
>   	}
>
>   	printf("CPU freq %"PRIu64" Hz\n", odp_sys_cpu_hz());
> @@ -481,7 +489,29 @@ int main(int argc, char *argv[])
>   	/* Wait for worker threads to exit */
>   	odph_linux_pthread_join(thread_tbl, num_workers);
>
> -	printf("ODP timer test complete\n\n");
> +	/* free resources */
> +	if (odp_queue_destroy(queue))
> +		err = 1;
> +err_timer_pool:
> +	odp_timer_pool_destroy(gbls->tp);
> +err_msg_pool:
> +	if (odp_pool_destroy(gbls->pool))
> +		err = 1;
> +err_shm:
> +	if (odp_shm_free(shm))
> +		err = 1;
> +err_local:
> +	if (odp_term_local())
> +		err = 1;
> +err_global:
> +	if (odp_term_global())
> +		err = 1;
> +err:
> +	if (err) {
> +		printf("Err: ODP timer test failed\n\n");
> +		return -1;
> +	}
>
> +	printf("ODP timer test complete\n\n");
>   	return 0;
>   }
>
Ivan Khoronzhuk Dec. 14, 2015, 3:29 p.m. UTC | #2
ping

On 19.11.15 12:54, Ivan Khoronzhuk wrote:
> Example should free resources in right order when terminates.
> Also it should have correct error path.
>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
> ---
>   example/timer/odp_timer_test.c | 46 ++++++++++++++++++++++++++++++++++--------
>   1 file changed, 38 insertions(+), 8 deletions(-)
>
> diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
> index 94619e4..2d74e4c 100644
> --- a/example/timer/odp_timer_test.c
> +++ b/example/timer/odp_timer_test.c
> @@ -331,18 +331,21 @@ int main(int argc, char *argv[])
>   	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
>   	odp_shm_t shm;
>   	test_globals_t	*gbls;
> +	int err = 0;
>
>   	printf("\nODP timer example starts\n");
>
>   	if (odp_init_global(NULL, NULL)) {
> +		err = 1;
>   		printf("ODP global init failed.\n");
> -		return -1;
> +		goto err;
>   	}
>
>   	/* Init this thread. */
>   	if (odp_init_local(ODP_THREAD_CONTROL)) {
> +		err = 1;
>   		printf("ODP local init failed.\n");
> -		return -1;
> +		goto err_global;
>   	}
>
>   	printf("\n");
> @@ -360,14 +363,16 @@ int main(int argc, char *argv[])
>   	shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),
>   			      ODP_CACHE_LINE_SIZE, 0);
>   	if (ODP_SHM_INVALID == shm) {
> +		err = 1;
>   		EXAMPLE_ERR("Error: shared mem reserve failed.\n");
> -		return -1;
> +		goto err_local;
>   	}
>
>   	gbls = odp_shm_addr(shm);
>   	if (NULL == gbls) {
> +		err = 1;
>   		EXAMPLE_ERR("Error: shared mem alloc failed.\n");
> -		return -1;
> +		goto err_shm;
>   	}
>   	memset(gbls, 0, sizeof(test_globals_t));
>
> @@ -404,8 +409,9 @@ int main(int argc, char *argv[])
>   	gbls->pool = odp_pool_create("msg_pool", &params);
>
>   	if (gbls->pool == ODP_POOL_INVALID) {
> +		err = 1;
>   		EXAMPLE_ERR("Pool create failed.\n");
> -		return -1;
> +		goto err_shm;
>   	}
>
>   	tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;
> @@ -416,8 +422,9 @@ int main(int argc, char *argv[])
>   	tparams.clk_src = ODP_CLOCK_CPU;
>   	gbls->tp = odp_timer_pool_create("timer_pool", &tparams);
>   	if (gbls->tp == ODP_TIMER_POOL_INVALID) {
> +		err = 1;
>   		EXAMPLE_ERR("Timer pool create failed.\n");
> -		return -1;
> +		goto err_msg_pool;
>   	}
>   	odp_timer_pool_start();
>
> @@ -442,8 +449,9 @@ int main(int argc, char *argv[])
>   	queue = odp_queue_create("timer_queue", ODP_QUEUE_TYPE_SCHED, &param);
>
>   	if (queue == ODP_QUEUE_INVALID) {
> +		err = 1;
>   		EXAMPLE_ERR("Timer queue create failed.\n");
> -		return -1;
> +		goto err_timer_pool;
>   	}
>
>   	printf("CPU freq %"PRIu64" Hz\n", odp_sys_cpu_hz());
> @@ -481,7 +489,29 @@ int main(int argc, char *argv[])
>   	/* Wait for worker threads to exit */
>   	odph_linux_pthread_join(thread_tbl, num_workers);
>
> -	printf("ODP timer test complete\n\n");
> +	/* free resources */
> +	if (odp_queue_destroy(queue))
> +		err = 1;
> +err_timer_pool:
> +	odp_timer_pool_destroy(gbls->tp);
> +err_msg_pool:
> +	if (odp_pool_destroy(gbls->pool))
> +		err = 1;
> +err_shm:
> +	if (odp_shm_free(shm))
> +		err = 1;
> +err_local:
> +	if (odp_term_local())
> +		err = 1;
> +err_global:
> +	if (odp_term_global())
> +		err = 1;
> +err:
> +	if (err) {
> +		printf("Err: ODP timer test failed\n\n");
> +		return -1;
> +	}
>
> +	printf("ODP timer test complete\n\n");
>   	return 0;
>   }
>
Bill Fischofer Dec. 16, 2015, 2:26 p.m. UTC | #3
This patch doesn't appear to apply to the current master.  Needs a rebase?

bill@Ubuntu15:~/linaro/ivanpatch$ git am --reject ~/Mail/Incoming/Ivan/1
Applying: example: timer: free resources while termination
Checking patch example/timer/odp_timer_test.c...
Hunk #1 succeeded at 334 (offset 3 lines).
Hunk #2 succeeded at 366 (offset 3 lines).
error: while searching for:
gbls->pool = odp_pool_create("msg_pool", &params);

if (gbls->pool == ODP_POOL_INVALID) {
EXAMPLE_ERR("Pool create failed.\n");
return -1;
}

tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;

error: patch failed: example/timer/odp_timer_test.c:404
Hunk #4 succeeded at 424 (offset 2 lines).
Hunk #5 succeeded at 451 (offset 2 lines).
Hunk #6 succeeded at 491 (offset 2 lines).
Applying patch example/timer/odp_timer_test.c with 1 reject...
Hunk #1 applied cleanly.
Hunk #2 applied cleanly.
Rejected hunk #3.
Hunk #4 applied cleanly.
Hunk #5 applied cleanly.
Hunk #6 applied cleanly.
Patch failed at 0001 example: timer: free resources while termination


On Mon, Dec 14, 2015 at 9:29 AM, Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org
> wrote:


> ping

>

> On 19.11.15 12:54, Ivan Khoronzhuk wrote:

>

>> Example should free resources in right order when terminates.

>> Also it should have correct error path.

>>

>> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>

>> ---

>>   example/timer/odp_timer_test.c | 46

>> ++++++++++++++++++++++++++++++++++--------

>>   1 file changed, 38 insertions(+), 8 deletions(-)

>>

>> diff --git a/example/timer/odp_timer_test.c

>> b/example/timer/odp_timer_test.c

>> index 94619e4..2d74e4c 100644

>> --- a/example/timer/odp_timer_test.c

>> +++ b/example/timer/odp_timer_test.c

>> @@ -331,18 +331,21 @@ int main(int argc, char *argv[])

>>         char cpumaskstr[ODP_CPUMASK_STR_SIZE];

>>         odp_shm_t shm;

>>         test_globals_t  *gbls;

>> +       int err = 0;

>>

>>         printf("\nODP timer example starts\n");

>>

>>         if (odp_init_global(NULL, NULL)) {

>> +               err = 1;

>>                 printf("ODP global init failed.\n");

>> -               return -1;

>> +               goto err;

>>         }

>>

>>         /* Init this thread. */

>>         if (odp_init_local(ODP_THREAD_CONTROL)) {

>> +               err = 1;

>>                 printf("ODP local init failed.\n");

>> -               return -1;

>> +               goto err_global;

>>         }

>>

>>         printf("\n");

>> @@ -360,14 +363,16 @@ int main(int argc, char *argv[])

>>         shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),

>>                               ODP_CACHE_LINE_SIZE, 0);

>>         if (ODP_SHM_INVALID == shm) {

>> +               err = 1;

>>                 EXAMPLE_ERR("Error: shared mem reserve failed.\n");

>> -               return -1;

>> +               goto err_local;

>>         }

>>

>>         gbls = odp_shm_addr(shm);

>>         if (NULL == gbls) {

>> +               err = 1;

>>                 EXAMPLE_ERR("Error: shared mem alloc failed.\n");

>> -               return -1;

>> +               goto err_shm;

>>         }

>>         memset(gbls, 0, sizeof(test_globals_t));

>>

>> @@ -404,8 +409,9 @@ int main(int argc, char *argv[])

>>         gbls->pool = odp_pool_create("msg_pool", &params);

>>

>>         if (gbls->pool == ODP_POOL_INVALID) {

>> +               err = 1;

>>                 EXAMPLE_ERR("Pool create failed.\n");

>> -               return -1;

>> +               goto err_shm;

>>         }

>>

>>         tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;

>> @@ -416,8 +422,9 @@ int main(int argc, char *argv[])

>>         tparams.clk_src = ODP_CLOCK_CPU;

>>         gbls->tp = odp_timer_pool_create("timer_pool", &tparams);

>>         if (gbls->tp == ODP_TIMER_POOL_INVALID) {

>> +               err = 1;

>>                 EXAMPLE_ERR("Timer pool create failed.\n");

>> -               return -1;

>> +               goto err_msg_pool;

>>         }

>>         odp_timer_pool_start();

>>

>> @@ -442,8 +449,9 @@ int main(int argc, char *argv[])

>>         queue = odp_queue_create("timer_queue", ODP_QUEUE_TYPE_SCHED,

>> &param);

>>

>>         if (queue == ODP_QUEUE_INVALID) {

>> +               err = 1;

>>                 EXAMPLE_ERR("Timer queue create failed.\n");

>> -               return -1;

>> +               goto err_timer_pool;

>>         }

>>

>>         printf("CPU freq %"PRIu64" Hz\n", odp_sys_cpu_hz());

>> @@ -481,7 +489,29 @@ int main(int argc, char *argv[])

>>         /* Wait for worker threads to exit */

>>         odph_linux_pthread_join(thread_tbl, num_workers);

>>

>> -       printf("ODP timer test complete\n\n");

>> +       /* free resources */

>> +       if (odp_queue_destroy(queue))

>> +               err = 1;

>> +err_timer_pool:

>> +       odp_timer_pool_destroy(gbls->tp);

>> +err_msg_pool:

>> +       if (odp_pool_destroy(gbls->pool))

>> +               err = 1;

>> +err_shm:

>> +       if (odp_shm_free(shm))

>> +               err = 1;

>> +err_local:

>> +       if (odp_term_local())

>> +               err = 1;

>> +err_global:

>> +       if (odp_term_global())

>> +               err = 1;

>> +err:

>> +       if (err) {

>> +               printf("Err: ODP timer test failed\n\n");

>> +               return -1;

>> +       }

>>

>> +       printf("ODP timer test complete\n\n");

>>         return 0;

>>   }

>>

>>

> --

> Regards,

> Ivan Khoronzhuk

>

> _______________________________________________

> lng-odp mailing list

> lng-odp@lists.linaro.org

> https://lists.linaro.org/mailman/listinfo/lng-odp

>
Ivan Khoronzhuk Dec. 16, 2015, 2:27 p.m. UTC | #4
On 16.12.15 16:26, Bill Fischofer wrote:
> This patch doesn't appear to apply to the current master.  Needs a rebase?
Probably yes, I'll rebase.

>
> bill@Ubuntu15:~/linaro/ivanpatch$ git am --reject ~/Mail/Incoming/Ivan/1
> Applying: example: timer: free resources while termination
> Checking patch example/timer/odp_timer_test.c...
> Hunk #1 succeeded at 334 (offset 3 lines).
> Hunk #2 succeeded at 366 (offset 3 lines).
> error: while searching for:
> gbls->pool = odp_pool_create("msg_pool", &params);
>
> if (gbls->pool == ODP_POOL_INVALID) {
> EXAMPLE_ERR("Pool create failed.\n");
> return -1;
> }
>
> tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;
>
> error: patch failed: example/timer/odp_timer_test.c:404
> Hunk #4 succeeded at 424 (offset 2 lines).
> Hunk #5 succeeded at 451 (offset 2 lines).
> Hunk #6 succeeded at 491 (offset 2 lines).
> Applying patch example/timer/odp_timer_test.c with 1 reject...
> Hunk #1 applied cleanly.
> Hunk #2 applied cleanly.
> Rejected hunk #3.
> Hunk #4 applied cleanly.
> Hunk #5 applied cleanly.
> Hunk #6 applied cleanly.
> Patch failed at 0001 example: timer: free resources while termination
>
>
> On Mon, Dec 14, 2015 at 9:29 AM, Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org <mailto:ivan.khoronzhuk@linaro.org>> wrote:
>
>     ping
>
>     On 19.11.15 12:54, Ivan Khoronzhuk wrote:
>
>         Example should free resources in right order when terminates.
>         Also it should have correct error path.
>
>         Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org <mailto:ivan.khoronzhuk@linaro.org>>
>         ---
>            example/timer/odp_timer_test.c | 46 ++++++++++++++++++++++++++++++++++--------
>            1 file changed, 38 insertions(+), 8 deletions(-)
>
>         diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
>         index 94619e4..2d74e4c 100644
>         --- a/example/timer/odp_timer_test.c
>         +++ b/example/timer/odp_timer_test.c
>         @@ -331,18 +331,21 @@ int main(int argc, char *argv[])
>                  char cpumaskstr[ODP_CPUMASK_STR_SIZE];
>                  odp_shm_t shm;
>                  test_globals_t  *gbls;
>         +       int err = 0;
>
>                  printf("\nODP timer example starts\n");
>
>                  if (odp_init_global(NULL, NULL)) {
>         +               err = 1;
>                          printf("ODP global init failed.\n");
>         -               return -1;
>         +               goto err;
>                  }
>
>                  /* Init this thread. */
>                  if (odp_init_local(ODP_THREAD_CONTROL)) {
>         +               err = 1;
>                          printf("ODP local init failed.\n");
>         -               return -1;
>         +               goto err_global;
>                  }
>
>                  printf("\n");
>         @@ -360,14 +363,16 @@ int main(int argc, char *argv[])
>                  shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),
>                                        ODP_CACHE_LINE_SIZE, 0);
>                  if (ODP_SHM_INVALID == shm) {
>         +               err = 1;
>                          EXAMPLE_ERR("Error: shared mem reserve failed.\n");
>         -               return -1;
>         +               goto err_local;
>                  }
>
>                  gbls = odp_shm_addr(shm);
>                  if (NULL == gbls) {
>         +               err = 1;
>                          EXAMPLE_ERR("Error: shared mem alloc failed.\n");
>         -               return -1;
>         +               goto err_shm;
>                  }
>                  memset(gbls, 0, sizeof(test_globals_t));
>
>         @@ -404,8 +409,9 @@ int main(int argc, char *argv[])
>                  gbls->pool = odp_pool_create("msg_pool", &params);
>
>                  if (gbls->pool == ODP_POOL_INVALID) {
>         +               err = 1;
>                          EXAMPLE_ERR("Pool create failed.\n");
>         -               return -1;
>         +               goto err_shm;
>                  }
>
>                  tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;
>         @@ -416,8 +422,9 @@ int main(int argc, char *argv[])
>                  tparams.clk_src = ODP_CLOCK_CPU;
>                  gbls->tp = odp_timer_pool_create("timer_pool", &tparams);
>                  if (gbls->tp == ODP_TIMER_POOL_INVALID) {
>         +               err = 1;
>                          EXAMPLE_ERR("Timer pool create failed.\n");
>         -               return -1;
>         +               goto err_msg_pool;
>                  }
>                  odp_timer_pool_start();
>
>         @@ -442,8 +449,9 @@ int main(int argc, char *argv[])
>                  queue = odp_queue_create("timer_queue", ODP_QUEUE_TYPE_SCHED, &param);
>
>                  if (queue == ODP_QUEUE_INVALID) {
>         +               err = 1;
>                          EXAMPLE_ERR("Timer queue create failed.\n");
>         -               return -1;
>         +               goto err_timer_pool;
>                  }
>
>                  printf("CPU freq %"PRIu64" Hz\n", odp_sys_cpu_hz());
>         @@ -481,7 +489,29 @@ int main(int argc, char *argv[])
>                  /* Wait for worker threads to exit */
>                  odph_linux_pthread_join(thread_tbl, num_workers);
>
>         -       printf("ODP timer test complete\n\n");
>         +       /* free resources */
>         +       if (odp_queue_destroy(queue))
>         +               err = 1;
>         +err_timer_pool:
>         +       odp_timer_pool_destroy(gbls->tp);
>         +err_msg_pool:
>         +       if (odp_pool_destroy(gbls->pool))
>         +               err = 1;
>         +err_shm:
>         +       if (odp_shm_free(shm))
>         +               err = 1;
>         +err_local:
>         +       if (odp_term_local())
>         +               err = 1;
>         +err_global:
>         +       if (odp_term_global())
>         +               err = 1;
>         +err:
>         +       if (err) {
>         +               printf("Err: ODP timer test failed\n\n");
>         +               return -1;
>         +       }
>
>         +       printf("ODP timer test complete\n\n");
>                  return 0;
>            }
>
>
>     --
>     Regards,
>     Ivan Khoronzhuk
>
>     _______________________________________________
>     lng-odp mailing list
>     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     https://lists.linaro.org/mailman/listinfo/lng-odp
>
>
diff mbox

Patch

diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
index 94619e4..2d74e4c 100644
--- a/example/timer/odp_timer_test.c
+++ b/example/timer/odp_timer_test.c
@@ -331,18 +331,21 @@  int main(int argc, char *argv[])
 	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
 	odp_shm_t shm;
 	test_globals_t	*gbls;
+	int err = 0;
 
 	printf("\nODP timer example starts\n");
 
 	if (odp_init_global(NULL, NULL)) {
+		err = 1;
 		printf("ODP global init failed.\n");
-		return -1;
+		goto err;
 	}
 
 	/* Init this thread. */
 	if (odp_init_local(ODP_THREAD_CONTROL)) {
+		err = 1;
 		printf("ODP local init failed.\n");
-		return -1;
+		goto err_global;
 	}
 
 	printf("\n");
@@ -360,14 +363,16 @@  int main(int argc, char *argv[])
 	shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),
 			      ODP_CACHE_LINE_SIZE, 0);
 	if (ODP_SHM_INVALID == shm) {
+		err = 1;
 		EXAMPLE_ERR("Error: shared mem reserve failed.\n");
-		return -1;
+		goto err_local;
 	}
 
 	gbls = odp_shm_addr(shm);
 	if (NULL == gbls) {
+		err = 1;
 		EXAMPLE_ERR("Error: shared mem alloc failed.\n");
-		return -1;
+		goto err_shm;
 	}
 	memset(gbls, 0, sizeof(test_globals_t));
 
@@ -404,8 +409,9 @@  int main(int argc, char *argv[])
 	gbls->pool = odp_pool_create("msg_pool", &params);
 
 	if (gbls->pool == ODP_POOL_INVALID) {
+		err = 1;
 		EXAMPLE_ERR("Pool create failed.\n");
-		return -1;
+		goto err_shm;
 	}
 
 	tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;
@@ -416,8 +422,9 @@  int main(int argc, char *argv[])
 	tparams.clk_src = ODP_CLOCK_CPU;
 	gbls->tp = odp_timer_pool_create("timer_pool", &tparams);
 	if (gbls->tp == ODP_TIMER_POOL_INVALID) {
+		err = 1;
 		EXAMPLE_ERR("Timer pool create failed.\n");
-		return -1;
+		goto err_msg_pool;
 	}
 	odp_timer_pool_start();
 
@@ -442,8 +449,9 @@  int main(int argc, char *argv[])
 	queue = odp_queue_create("timer_queue", ODP_QUEUE_TYPE_SCHED, &param);
 
 	if (queue == ODP_QUEUE_INVALID) {
+		err = 1;
 		EXAMPLE_ERR("Timer queue create failed.\n");
-		return -1;
+		goto err_timer_pool;
 	}
 
 	printf("CPU freq %"PRIu64" Hz\n", odp_sys_cpu_hz());
@@ -481,7 +489,29 @@  int main(int argc, char *argv[])
 	/* Wait for worker threads to exit */
 	odph_linux_pthread_join(thread_tbl, num_workers);
 
-	printf("ODP timer test complete\n\n");
+	/* free resources */
+	if (odp_queue_destroy(queue))
+		err = 1;
+err_timer_pool:
+	odp_timer_pool_destroy(gbls->tp);
+err_msg_pool:
+	if (odp_pool_destroy(gbls->pool))
+		err = 1;
+err_shm:
+	if (odp_shm_free(shm))
+		err = 1;
+err_local:
+	if (odp_term_local())
+		err = 1;
+err_global:
+	if (odp_term_global())
+		err = 1;
+err:
+	if (err) {
+		printf("Err: ODP timer test failed\n\n");
+		return -1;
+	}
 
+	printf("ODP timer test complete\n\n");
 	return 0;
 }