blob: b4b4e50806f9f8a400d2bbe29528ef0dbbd63274 [file] [log] [blame]
/*
* Copyright (c) 2011-2012, Los Alamos National Security, LLC.
* All rights Reserved.
*
* Copyright 2011-2012. Los Alamos National Security, LLC. This software was produced
* under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National
* Laboratory (LANL), which is operated by Los Alamos National Security, LLC
* for the U.S. Department of Energy. The U.S. Government has rights to use,
* reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS
* ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the Los Alamos National Security, LLC, Los Alamos
* National Laboratory, LANL, the U.S. Government, nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE LOS ALAMOS NATIONAL SECURITY, LLC AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL
* SECURITY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* CLAMR -- LA-CC-11-094
* This research code is being developed as part of the
* 2011 X Division Summer Workshop for the express purpose
* of a collaborative code for development of ideas in
* the implementation of AMR codes for Exascale platforms
*
* AMR implementation of the Wave code previously developed
* as a demonstration code for regular grids on Exascale platforms
* as part of the Supercomputing Challenge and Los Alamos
* National Laboratory
*
* Authors: Bob Robey XCP-2 brobey@lanl.gov
* Neal Davis davis68@lanl.gov, davis68@illinois.edu
* David Nicholaeff dnic@lanl.gov, mtrxknight@aol.com
* Dennis Trujillo dptrujillo@lanl.gov, dptru10@gmail.com
*
*/
#include <sys/types.h>
#include <sys/queue.h>
#include <stdio.h>
#include <stdlib.h>
#include "genmalloc.h"
#ifndef DEBUG
#define DEBUG 0
#endif
double ***gentrimatrix_double_p(int knum, int jnum, int inum, const char *file, const int line);
int ***gentrimatrix_int_p(int knum, int jnum, int inum, const char *file, const int line);
SLIST_HEAD(slist_genmalloc_memory_head, genmalloc_memory_entry) genmalloc_memory_head = SLIST_HEAD_INITIALIZER(genmalloc_memory_head);
struct slist_genmalloc_memory_head *genmalloc_memory_headp;
struct genmalloc_memory_entry {
void *mem_ptr;
size_t mem_size;
SLIST_ENTRY(genmalloc_memory_entry) genmalloc_memory_entries;
} *genmalloc_memory_item;
void *genvector_p(int inum, size_t elsize, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
void *out;
size_t mem_size;
mem_size = inum*elsize;
out = (void *)calloc((size_t)inum, elsize);
genmalloc_memory_add(out, mem_size);
return (out);
}
void genvectorfree_p(void *var, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
genmalloc_memory_remove(var);
}
void **genmatrix_p(int jnum, int inum, size_t elsize, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
void **out;
size_t mem_size;
mem_size = jnum*sizeof(void *);
out = (void **)malloc(mem_size);
genmalloc_memory_add(out, mem_size);
mem_size = jnum*inum*elsize;
out[0] = (void *)calloc((size_t)jnum*(size_t)inum, elsize);
genmalloc_memory_add(out[0], mem_size);
for (int i = 1; i < jnum; i++) {
out[i] = out[i-1] + inum*elsize;
}
return (out);
}
void genmatrixfree_p(void **var, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
genmalloc_memory_remove(var[0]);
genmalloc_memory_remove(var);
}
void ***gentrimatrix_p(int knum, int jnum, int inum, size_t elsize, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
void ***out = NULL;
if (elsize == 8) {
out = (void ***)gentrimatrix_double_p(knum, jnum, inum, file, line);
} else if (elsize == 4) {
out = (void ***)gentrimatrix_int_p(knum, jnum, inum, file, line);
} else {
printf("Error -- element size not supported in genmalloc for call at %s line %d\n",file,line);
}
return(out);
}
double ***gentrimatrix_double_p(int knum, int jnum, int inum, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
double ***out;
size_t mem_size;
const size_t elsize = 8;
mem_size = knum*sizeof(void **);
out = (double ***)malloc(mem_size);
genmalloc_memory_add(out, mem_size);
mem_size = knum*jnum*sizeof(void *);
out[0] = (double **) malloc(mem_size);
genmalloc_memory_add(out[0], mem_size);
size_t nelems = knum*jnum*inum;
mem_size = nelems*elsize;
out[0][0] = (void *)calloc(nelems, elsize);
genmalloc_memory_add(out[0][0], mem_size);
for (int k = 0; k < knum; k++)
{
if (k > 0)
{
out[k] = out[k-1] + jnum;
out[k][0] = out[k-1][0] + (jnum*inum);
}
for (int j = 1; j < jnum; j++)
{
out[k][j] = out[k][j-1] + inum;
}
}
return (out);
}
int ***gentrimatrix_int_p(int knum, int jnum, int inum, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
int ***out;
size_t mem_size;
const size_t elsize = 4;
mem_size = knum*sizeof(void **);
out = (int ***)malloc(mem_size);
genmalloc_memory_add(out, mem_size);
mem_size = knum*jnum*sizeof(void *);
out[0] = (int **) malloc(mem_size);
genmalloc_memory_add(out[0], mem_size);
size_t nelems = knum*jnum*inum;
mem_size = nelems*elsize;
out[0][0] = (void *)calloc(nelems, elsize);
genmalloc_memory_add(out[0][0], mem_size);
for (int k = 0; k < knum; k++)
{
if (k > 0)
{
out[k] = out[k-1] + jnum;
out[k][0] = out[k-1][0] + (jnum*inum);
}
for (int j = 1; j < jnum; j++)
{
out[k][j] = out[k][j-1] + inum;
}
}
return (out);
}
void gentrimatrixfree_p(void ***var, const char *file, const int line)
{
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
genmalloc_memory_remove(var[0][0]);
genmalloc_memory_remove(var[0]);
genmalloc_memory_remove(var);
}
void *genmalloc_memory_add_p(void *malloc_mem_ptr, size_t size, const char *file, const int line){
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
if (SLIST_EMPTY(&genmalloc_memory_head)) SLIST_INIT(&genmalloc_memory_head);
genmalloc_memory_item = malloc(sizeof(struct genmalloc_memory_entry));
genmalloc_memory_item->mem_ptr = malloc_mem_ptr;
genmalloc_memory_item->mem_size = size;
if (DEBUG) printf("GENMALLOC_MEMORY_ADD: DEBUG -- malloc memory pointer is %p called from file %s line %d\n",malloc_mem_ptr,file,line);
SLIST_INSERT_HEAD(&genmalloc_memory_head, genmalloc_memory_item, genmalloc_memory_entries);
return(malloc_mem_ptr);
}
void genmalloc_memory_remove_p(void *malloc_mem_ptr, const char *file, const int line){
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
SLIST_FOREACH(genmalloc_memory_item, &genmalloc_memory_head, genmalloc_memory_entries){
if (genmalloc_memory_item->mem_ptr == malloc_mem_ptr) {
if (DEBUG) printf("GENMALLOC_MEMORY_REMOVE: DEBUG -- freeing malloc memory pointer %p called from file %s line %d\n",malloc_mem_ptr,file,line);
free(malloc_mem_ptr);
SLIST_REMOVE(&genmalloc_memory_head, genmalloc_memory_item, genmalloc_memory_entry, genmalloc_memory_entries);
free(genmalloc_memory_item);
break;
}
}
}
void genmem_free_all_p(const char *file, const int line){
// Just to get rid of warning
if (1 == 2) printf("Warning file %s line %d\n", file, line);
while (!SLIST_EMPTY(&genmalloc_memory_head)) {
genmalloc_memory_item = SLIST_FIRST(&genmalloc_memory_head);
if (DEBUG) printf("GENMEM_FREE_ALL: DEBUG -- freeing genmalloc memory %p called from file %s line %d\n",genmalloc_memory_item->mem_ptr,file,line);
free(genmalloc_memory_item->mem_ptr);
SLIST_REMOVE_HEAD(&genmalloc_memory_head, genmalloc_memory_entries);
free(genmalloc_memory_item);
}
}