AdjoinableMPI
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
support.c
Go to the documentation of this file.
1 /*
2 ##########################################################
3 # This file is part of the AdjoinableMPI library #
4 # released under the MIT License. #
5 # The full COPYRIGHT notice can be found in the top #
6 # level directory of the AdjoinableMPI distribution. #
7 ##########################################################
8 */
9 #include <malloc.h>
10 #include <assert.h>
11 #include <mpi.h>
13 
14 struct RequestListItem {
15  struct AMPI_Request_S ampiRequest; /*[llh] I'd rather put *ampiRequest to not copy */
18 };
19 
23 
27 static struct RequestListItem* addRequestToList() {
28  struct RequestListItem* returnItem_p=0;
29  if (! unusedRequestStack) {
30  unusedRequestStack=(struct RequestListItem*)malloc(sizeof(struct RequestListItem));
31  assert(unusedRequestStack);
32  unusedRequestStack->next_p=0;
33  unusedRequestStack->prev_p=0;
34  }
35  /* get it from the unused stack */
36  returnItem_p=unusedRequestStack;
37  unusedRequestStack=returnItem_p->prev_p;
38  returnItem_p->prev_p=0;
39  /* add it to the list */
40  if (!requestListHead) requestListHead=returnItem_p;
41  if (requestListTail) {
42  requestListTail->next_p=returnItem_p;
43  returnItem_p->prev_p=requestListTail;
44  }
45  requestListTail=returnItem_p;
46  return returnItem_p;
47 }
48 
52 static void dropRequestFromList(struct RequestListItem* toBoDropped) {
53  /* remove it from the list */
54  if (requestListHead==toBoDropped) {
55  requestListHead=toBoDropped->next_p;
56  if (requestListHead) requestListHead->prev_p=0;
57  toBoDropped->next_p=0;
58  }
59  if (requestListTail==toBoDropped) {
60  requestListTail=toBoDropped->prev_p;
61  if (requestListTail) requestListTail->next_p=0;
62  toBoDropped->prev_p=0;
63  }
64  if (toBoDropped->next_p && toBoDropped->prev_p) {
65  toBoDropped->prev_p->next_p=toBoDropped->next_p;
66  toBoDropped->next_p->prev_p=toBoDropped->prev_p;
67  toBoDropped->next_p=0;
68  toBoDropped->prev_p=0;
69  }
70  /* add it to the unused stack */
71  if (unusedRequestStack) {
72  toBoDropped->prev_p=unusedRequestStack;
73  }
74  unusedRequestStack=toBoDropped;
75 }
76 
77 static struct RequestListItem* findRequestInList(MPI_Request *request, int traced) {
78  struct RequestListItem* current_p=requestListHead;
79  while(current_p) {
80  if ((traced==0 && current_p->ampiRequest.plainRequest==*request) || (traced!=0 && current_p->ampiRequest.tracedRequest==*request)) break;
81  current_p=current_p->next_p;
82  }
83  assert(current_p);
84  return current_p;
85 }
86 
88  struct RequestListItem *inList_p;
89  inList_p=addRequestToList();
90  inList_p->ampiRequest=*ampiRequest;
91 }
92 
93 void BK_AMPI_get_AMPI_Request(MPI_Request *request, struct AMPI_Request_S *ampiRequest, int traced) {
94  struct RequestListItem *inList_p=findRequestInList(request,traced);
95  *ampiRequest=inList_p->ampiRequest;
96  dropRequestFromList(inList_p);
97 }
98 
99 void BK_AMPI_read_AMPI_Request(MPI_Request *request, struct AMPI_Request_S *ampiRequest, int traced) {
100  struct RequestListItem *inList_p=findRequestInList(request,traced);
101  *ampiRequest=inList_p->ampiRequest;
102 }
103 
104 struct WinListItem {
105  AMPI_Win ampiWin; /*[llh] I'd rather put *ampiWin to not copy */
108 };
109 
110 static struct WinListItem* winListHead=0;
111 static struct WinListItem* winListTail=0;
112 static struct WinListItem* unusedWinStack=0;
113 
117 static struct WinListItem* addWinToList() {
118  struct WinListItem* returnItem_p=0;
119  if (! unusedWinStack) {
120  unusedWinStack=(struct WinListItem*)malloc(sizeof(struct WinListItem));
121  assert(unusedWinStack);
122  unusedWinStack->next_p=0;
123  unusedWinStack->prev_p=0;
124  }
125  /* get it from the unused stack */
126  returnItem_p=unusedWinStack;
127  unusedWinStack=returnItem_p->prev_p;
128  returnItem_p->prev_p=0;
129  /* add it to the list */
130  if (!winListHead) winListHead=returnItem_p;
131  if (winListTail) {
132  winListTail->next_p=returnItem_p;
133  returnItem_p->prev_p=winListTail;
134  }
135  winListTail=returnItem_p;
136  return returnItem_p;
137 }
138 
142 static void dropWinFromList(struct WinListItem* toBoDropped) {
143  /* remove it from the list */
144  if (winListHead==toBoDropped) {
145  winListHead=toBoDropped->next_p;
146  if (winListHead) winListHead->prev_p=0;
147  toBoDropped->next_p=0;
148  }
149  if (winListTail==toBoDropped) {
150  winListTail=toBoDropped->prev_p;
151  if (winListTail) winListTail->next_p=0;
152  toBoDropped->prev_p=0;
153  }
154  if (toBoDropped->next_p && toBoDropped->prev_p) {
155  toBoDropped->prev_p->next_p=toBoDropped->next_p;
156  toBoDropped->next_p->prev_p=toBoDropped->prev_p;
157  toBoDropped->next_p=0;
158  toBoDropped->prev_p=0;
159  }
160  /* add it to the unused stack */
161  if (unusedWinStack) {
162  toBoDropped->prev_p=unusedWinStack;
163  }
164  unusedWinStack=toBoDropped;
165 }
166 
167 static struct WinListItem* findWinInList(MPI_Win *win) {
168  struct WinListItem* current_p=winListHead;
169  while(current_p) {
170  if (*current_p->ampiWin.plainWindow==win) break;
171  current_p=current_p->next_p;
172  }
173  assert(current_p);
174  return current_p;
175 }
176 
178  struct WinListItem *inList_p;
179  inList_p=addWinToList();
180  inList_p->ampiWin=*ampiWin;
181 }
182 
183 void BK_AMPI_get_AMPI_Win(MPI_Win *win, AMPI_Win *ampiWin) {
184  struct WinListItem *inList_p=findWinInList(win);
185  *ampiWin=inList_p->ampiWin;
186  dropWinFromList(inList_p);
187 }
188 
189 void BK_AMPI_read_AMPI_Win(MPI_Win *win, AMPI_Win *ampiWin) {
190  struct WinListItem *inList_p=findWinInList(win);
191  *ampiWin=inList_p->ampiWin;
192 }
193