1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #ifndef MPIDU_GENQI_SHMEM_TYPES_H_INCLUDED
7 #define MPIDU_GENQI_SHMEM_TYPES_H_INCLUDED
8 
9 #include "mpl.h"
10 #include "mpidu_init_shm.h"
11 
12 typedef void *MPIDU_genq_shmem_pool_t;
13 typedef void *MPIDU_genq_shmem_queue_t;
14 
15 typedef struct MPIDU_genqi_shmem_cell_header {
16     uintptr_t handle;
17     int block_idx;
18     union {
19         struct {
20             uintptr_t next;
21         } serial_queue;
22         struct {
23             uintptr_t prev;     /* used in the tail queue */
24             uintptr_t next;     /* used in the detached header queue */
25         } inverse_queue;
26         struct {
27             MPL_atomic_ptr_t next_m;
28         } nem_queue;
29     } u;
30 } MPIDU_genqi_shmem_cell_header_s;
31 
32 typedef union MPIDU_genq_shmem_queue {
33     struct {
34         union {
35             uintptr_t s;
36             MPL_atomic_ptr_t m;
37             uint8_t pad[MPIDU_SHM_CACHE_LINE_LEN];
38         } head;
39         union {
40             uintptr_t s;
41             MPL_atomic_ptr_t m;
42             uint8_t pad[MPIDU_SHM_CACHE_LINE_LEN];
43         } tail;
44         unsigned flags;
45     } q;
46     uint8_t pad[3 * MPIDU_SHM_CACHE_LINE_LEN];
47 } MPIDU_genq_shmem_queue_u;
48 
49 typedef struct MPIDU_genqi_shmem_pool {
50     uintptr_t cell_size;
51     uintptr_t cell_alloc_size;
52     uintptr_t cells_per_proc;
53     uintptr_t num_proc;
54     int rank;
55 
56     void *slab;
57     MPIDU_genqi_shmem_cell_header_s *cell_header_base;
58     MPIDU_genqi_shmem_cell_header_s **cell_headers;
59     union MPIDU_genq_shmem_queue *free_queues;
60 } MPIDU_genqi_shmem_pool_s;
61 
62 #define HEADER_TO_CELL(header) \
63     ((char *) (header) + sizeof(MPIDU_genqi_shmem_cell_header_s))
64 
65 #define CELL_TO_HEADER(cell) \
66     ((MPIDU_genqi_shmem_cell_header_s *) ((char *) (cell) \
67                                           - sizeof(MPIDU_genqi_shmem_cell_header_s)))
68 
69 /* The handle value is calculated using (address_offset + 1), see MPIDU_genq_shmem_pool.h */
70 #define HANDLE_TO_HEADER(pool, handle) \
71     ((MPIDU_genqi_shmem_cell_header_s *) ((char *) (pool)->cell_header_base + (uintptr_t) (handle) \
72                                           - 1))
73 
74 /* declare static inline prototypes to avoid circular inclusion */
75 
76 int MPIDU_genq_shmem_queue_init(MPIDU_genq_shmem_queue_t queue, int flags);
77 static inline int MPIDU_genq_shmem_queue_dequeue(MPIDU_genq_shmem_pool_t pool,
78                                                  MPIDU_genq_shmem_queue_t queue, void **cell);
79 static inline int MPIDU_genq_shmem_queue_enqueue(MPIDU_genq_shmem_pool_t pool,
80                                                  MPIDU_genq_shmem_queue_t queue, void *cell);
81 
82 #endif /* ifndef MPIDU_GENQI_SHMEM_TYPES_H_INCLUDED */
83