From 708c6096c9e9ff1bac554a158ecc953fc1bd50f2 Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Wed, 10 Aug 2011 09:58:42 +0800 Subject: [PATCH] libfreerdp-utils: migrate profiler. --- include/freerdp/utils/profiler.h | 69 +++++++++++++++++++++++++++++ include/freerdp/utils/stopwatch.h | 44 +++++++++++++++++++ libfreerdp-utils/CMakeLists.txt | 2 + libfreerdp-utils/profiler.c | 72 +++++++++++++++++++++++++++++++ libfreerdp-utils/stopwatch.c | 60 ++++++++++++++++++++++++++ 5 files changed, 247 insertions(+) create mode 100644 include/freerdp/utils/profiler.h create mode 100644 include/freerdp/utils/stopwatch.h create mode 100644 libfreerdp-utils/profiler.c create mode 100644 libfreerdp-utils/stopwatch.c diff --git a/include/freerdp/utils/profiler.h b/include/freerdp/utils/profiler.h new file mode 100644 index 000000000..c0cad8ebc --- /dev/null +++ b/include/freerdp/utils/profiler.h @@ -0,0 +1,69 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Profiler Utils + * + * Copyright 2011 Stephen Erisman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTILS_PROFILER_H +#define __UTILS_PROFILER_H + +#include "config.h" + +#include + +#include +#include + +struct _PROFILER +{ + char* name; + STOPWATCH* stopwatch; +}; +typedef struct _PROFILER PROFILER; + +PROFILER* profiler_create(char* name); +void profiler_free(PROFILER* profiler); + +void profiler_enter(PROFILER* profiler); +void profiler_exit(PROFILER* profiler); + +void profiler_print_header(); +void profiler_print(PROFILER* profiler); +void profiler_print_footer(); + +#ifdef WITH_PROFILER +#define IF_PROFILER(then) then +#define PROFILER_DEFINE(prof) PROFILER* prof +#define PROFILER_CREATE(prof,name) prof = profiler_create(name) +#define PROFILER_FREE(prof) profiler_free(prof) +#define PROFILER_ENTER(prof) profiler_enter(prof) +#define PROFILER_EXIT(prof) profiler_exit(prof) +#define PROFILER_PRINT_HEADER profiler_print_header() +#define PROFILER_PRINT(prof) profiler_print(prof) +#define PROFILER_PRINT_FOOTER profiler_print_footer() +#else +#define IF_PROFILER(then) +#define PROFILER_DEFINE(prof) +#define PROFILER_CREATE(prof,name) +#define PROFILER_FREE(prof) +#define PROFILER_ENTER(prof) +#define PROFILER_EXIT(prof) +#define PROFILER_PRINT_HEADER +#define PROFILER_PRINT(prof) +#define PROFILER_PRINT_FOOTER +#endif + +#endif /* __UTILS_PROFILER_H */ diff --git a/include/freerdp/utils/stopwatch.h b/include/freerdp/utils/stopwatch.h new file mode 100644 index 000000000..64aa8697e --- /dev/null +++ b/include/freerdp/utils/stopwatch.h @@ -0,0 +1,44 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Stopwatch Utils + * + * Copyright 2011 Stephen Erisman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTILS_STOPWATCH_H +#define __UTILS_STOPWATCH_H + +#include +#include + +struct _STOPWATCH +{ + clock_t start; + clock_t end; + double elapsed; + clock_t count; +}; +typedef struct _STOPWATCH STOPWATCH; + +STOPWATCH* stopwatch_create(); +void stopwatch_free(STOPWATCH* stopwatch); + +void stopwatch_start(STOPWATCH* stopwatch); +void stopwatch_stop(STOPWATCH* stopwatch); +void stopwatch_reset(STOPWATCH* stopwatch); + +double stopwatch_get_elapsed_time_in_seconds(STOPWATCH* stopwatch); + +#endif /* __UTILS_STOPWATCH_H */ diff --git a/libfreerdp-utils/CMakeLists.txt b/libfreerdp-utils/CMakeLists.txt index 1cd5c6cb2..7b7078a92 100644 --- a/libfreerdp-utils/CMakeLists.txt +++ b/libfreerdp-utils/CMakeLists.txt @@ -29,7 +29,9 @@ set(FREERDP_UTILS_SRCS load_plugin.c memory.c mutex.c + profiler.c semaphore.c + stopwatch.c stream.c svc_plugin.c thread.c diff --git a/libfreerdp-utils/profiler.c b/libfreerdp-utils/profiler.c new file mode 100644 index 000000000..13b560c93 --- /dev/null +++ b/libfreerdp-utils/profiler.c @@ -0,0 +1,72 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Profiler Utils + * + * Copyright 2011 Stephen Erisman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +PROFILER* profiler_create(char* name) +{ + PROFILER* profiler; + + profiler = (PROFILER*) xmalloc(sizeof(PROFILER)); + + profiler->name = name; + profiler->stopwatch = stopwatch_create(); + + return profiler; +} + +void profiler_free(PROFILER* profiler) +{ + stopwatch_free(profiler->stopwatch); + + xfree(profiler); +} + +void profiler_enter(PROFILER* profiler) +{ + stopwatch_start(profiler->stopwatch); +} + +void profiler_exit(PROFILER* profiler) +{ + stopwatch_stop(profiler->stopwatch); +} + +void profiler_print_header() +{ + printf("\n"); + printf(" |-----------------------|\n" ); + printf(" PROFILER | elapsed seconds |\n" ); + printf("|--------------------------------------------|-----------------------|\n" ); + printf("| code section | iterations | total | avg. |\n" ); + printf("|-------------------------------|------------|-----------|-----------|\n" ); +} + +void profiler_print(PROFILER* profiler) +{ + double elapsed_sec = stopwatch_get_elapsed_time_in_seconds(profiler->stopwatch); + double avg_sec = elapsed_sec / (double) profiler->stopwatch->count; + + printf("| %-30.30s| %'10lu | %'9f | %'9f |\n", profiler->name, profiler->stopwatch->count, elapsed_sec, avg_sec); +} + +void profiler_print_footer() +{ + printf("|--------------------------------------------------------------------|\n" ); +} diff --git a/libfreerdp-utils/stopwatch.c b/libfreerdp-utils/stopwatch.c new file mode 100644 index 000000000..55b814f06 --- /dev/null +++ b/libfreerdp-utils/stopwatch.c @@ -0,0 +1,60 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * Stopwatch Utils + * + * Copyright 2011 Stephen Erisman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +STOPWATCH* stopwatch_create() +{ + STOPWATCH* sw; + + sw = (STOPWATCH*) xmalloc(sizeof(STOPWATCH)); + stopwatch_reset(sw); + + return sw; +} + +void stopwatch_free(STOPWATCH* stopwatch) +{ + xfree(stopwatch); +} + +void stopwatch_start(STOPWATCH* stopwatch) +{ + stopwatch->start = clock(); + stopwatch->count++; +} + +void stopwatch_stop(STOPWATCH* stopwatch) +{ + stopwatch->end = clock(); + stopwatch->elapsed += (stopwatch->end - stopwatch->start); +} + +void stopwatch_reset(STOPWATCH* stopwatch) +{ + stopwatch->start = 0; + stopwatch->end = 0; + stopwatch->elapsed = 0; + stopwatch->count = 0; +} + +double stopwatch_get_elapsed_time_in_seconds(STOPWATCH* stopwatch) +{ + return ((double)stopwatch->elapsed) / CLOCKS_PER_SEC; +}