1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #ifndef MPIDU_GENQ_SHMEM_POOL_H_INCLUDED
7 #define MPIDU_GENQ_SHMEM_POOL_H_INCLUDED
8 
9 #include "mpidimpl.h"
10 #include "mpidu_genqi_shmem_types.h"
11 #include "mpidu_genq_shmem_queue.h"
12 
13 #include <stdlib.h>
14 #include <stdint.h>
15 #include <string.h>
16 
17 int MPIDU_genq_shmem_pool_create_unsafe(uintptr_t cell_size, uintptr_t cells_per_proc,
18                                         uintptr_t num_proc, int rank,
19                                         MPIDU_genq_shmem_pool_t * pool);
20 int MPIDU_genq_shmem_pool_destroy_unsafe(MPIDU_genq_shmem_pool_t pool);
21 
MPIDU_genq_shmem_pool_cell_alloc(MPIDU_genq_shmem_pool_t pool,void ** cell)22 static inline int MPIDU_genq_shmem_pool_cell_alloc(MPIDU_genq_shmem_pool_t pool, void **cell)
23 {
24     int rc = MPI_SUCCESS;
25     MPIDU_genqi_shmem_pool_s *pool_obj = (MPIDU_genqi_shmem_pool_s *) pool;
26 
27     *cell = NULL;
28 
29     MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPIDU_GENQ_SHMEM_POOL_CELL_ALLOC);
30     MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPIDU_GENQ_SHMEM_POOL_CELL_ALLOC);
31 
32     rc = MPIDU_genq_shmem_queue_dequeue(pool, &pool_obj->free_queues[pool_obj->rank], cell);
33     MPIR_ERR_CHECK(rc);
34 
35   fn_exit:
36     MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPIDU_GENQ_SHMEM_POOL_CELL_ALLOC);
37     return rc;
38   fn_fail:
39     goto fn_exit;
40 }
41 
MPIDU_genq_shmem_pool_cell_free(MPIDU_genq_shmem_pool_t pool,void * cell)42 static inline int MPIDU_genq_shmem_pool_cell_free(MPIDU_genq_shmem_pool_t pool, void *cell)
43 {
44     int rc = MPI_SUCCESS;
45     MPIDU_genqi_shmem_cell_header_s *cell_h = CELL_TO_HEADER(cell);
46     MPIDU_genqi_shmem_pool_s *pool_obj = (MPIDU_genqi_shmem_pool_s *) pool;
47 
48     MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPIDU_GENQ_SHMEM_POOL_CELL_FREE);
49     MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPIDU_GENQ_SHMEM_POOL_CELL_FREE);
50 
51     rc = MPIDU_genq_shmem_queue_enqueue(pool, &pool_obj->free_queues[cell_h->block_idx], cell);
52     MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPIDU_GENQ_SHMEM_POOL_CELL_FREE);
53     return rc;
54 }
55 
56 #endif /* ifndef MPIDU_GENQ_SHMEM_POOL_H_INCLUDED */
57