From 767564a7460d44003b44c77fabccb4de82ab3e7e Mon Sep 17 00:00:00 2001 From: pini Date: Thu, 20 Jan 2011 14:18:36 +0000 Subject: [PATCH] Added macros definitions and runtime support for cocci-processed local static variables. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9450 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- buildtools/Cmake/DefinePackages.cmake | 1 + include/smpi/smpi_cocci.h | 36 ++++++++++++++++++++++++--- src/smpi/private.h | 1 + src/smpi/smpi_c99.c | 16 ++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/smpi/smpi_c99.c diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 6cf1e8b8d6..8137ed660a 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -108,6 +108,7 @@ set(SMPI_SRC src/smpi/smpi_global.c src/smpi/smpi_mpi.c src/smpi/smpi_pmpi.c + src/smpi/smpi_c99.c src/smpi/smpi_f77.c src/smpi/smpi_comm.c src/smpi/smpi_group.c diff --git a/include/smpi/smpi_cocci.h b/include/smpi/smpi_cocci.h index 1cce1a676d..bcd150d3c8 100644 --- a/include/smpi/smpi_cocci.h +++ b/include/smpi/smpi_cocci.h @@ -7,10 +7,12 @@ #ifndef SMPI_COCCI_H #define SMPI_COCCI_H +#include + /* Macros used by coccinelle-generated code */ -#define SMPI_VARINIT_GLOBAL(name,type) \ -type *name = NULL; \ +#define SMPI_VARINIT_GLOBAL(name,type) \ +type *name = NULL; \ void __attribute__((weak,constructor)) __preinit_##name(void) { \ if(!name) \ name = (type*)malloc(smpi_global_size() * sizeof(type)); \ @@ -20,8 +22,8 @@ void __attribute__((weak,destructor)) __postfini_##name(void) { \ name = NULL; \ } -#define SMPI_VARINIT_GLOBAL_AND_SET(name,type,expr) \ -type *name = NULL; \ +#define SMPI_VARINIT_GLOBAL_AND_SET(name,type,expr) \ +type *name = NULL; \ void __attribute__((weak,constructor)) __preinit_##name(void) { \ size_t size = smpi_global_size(); \ size_t i; \ @@ -40,4 +42,30 @@ void __attribute__((weak,destructor)) __postfini_##name(void) { \ #define SMPI_VARGET_GLOBAL(name) name[smpi_process_index()] +/* The following handle local static variables */ + +XBT_PUBLIC(void) smpi_register_static(void* arg); + +#define SMPI_VARINIT_STATIC(name,type) \ +static type *name = NULL; \ +if(!name) { \ + name = (type*)malloc(smpi_global_size() * sizeof(type)); \ + smpi_register_static(name); \ +} + +#define SMPI_VARINIT_STATIC_AND_SET(name,type,expr) \ +static type *name = NULL; \ +if(!name) { \ + size_t size = smpi_global_size(); \ + size_t i; \ + type value = expr; \ + name = (type*)malloc(size * sizeof(type)); \ + for(i = 0; i < size; i++) { \ + name[i] = value; \ + } \ + smpi_register_static(name); \ +} + +#define SMPI_VARGET_STATIC(name) name[smpi_process_index()] + #endif diff --git a/src/smpi/private.h b/src/smpi/private.h index 65f48393f4..12bf309a46 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -12,6 +12,7 @@ #include "simix/simix.h" #include "smpi/smpi.h" #include "smpi/smpif.h" +#include "smpi/smpi_cocci.h" #include "instr/instr_private.h" struct s_smpi_process_data; diff --git a/src/smpi/smpi_c99.c b/src/smpi/smpi_c99.c new file mode 100644 index 0000000000..2efa529505 --- /dev/null +++ b/src/smpi/smpi_c99.c @@ -0,0 +1,16 @@ +/* Copyright (c) 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include "private.h" + +static void smpi_free_static(int status, void* arg) { + free(arg); +} + +void smpi_register_static(void* arg) { + on_exit(&smpi_free_static, arg); +} -- 2.20.1