/*
 * Copyright (c) 2013      Mellanox Technologies, Inc.
 *                         All rights reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */
#ifndef _PROC_GROUP_CACHE_H
#define _PROC_GROUP_CACHE_H

#include "oshmem_config.h"
#include "proc.h"

#define OSHMEM_GROUP_CACHE_ENABLED  1
#define ABORT_ON_CACHE_OVERFLOW 1
BEGIN_C_DECLS
struct oshmem_group_cache_t {
    opal_list_item_t item;
    oshmem_group_t *group;
    int cache_id[3];
};

typedef struct oshmem_group_cache_t oshmem_group_cache_t;
OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(oshmem_group_cache_t);
OSHMEM_DECLSPEC extern opal_list_t oshmem_group_cache_list;

oshmem_group_t* find_group_in_cache(int PE_start, int logPE_stride, int PE_size);

int cache_group(oshmem_group_t *group,
                int PE_start,
                int logPE_stride,
                int PE_size);
int oshmem_group_cache_list_init(void);
int oshmem_group_cache_list_free(void);

extern unsigned int oshmem_group_cache_size;
END_C_DECLS

#endif