@@ -84,6 +84,13 @@ static zx_handle_t getPlaceholderVmo() {
84
84
return Vmo;
85
85
}
86
86
87
+ // Checks if MAP_ALLOWNOMEM allows the given error code.
88
+ static bool IsNoMemError (zx_status_t Status) {
89
+ // Note: _zx_vmar_map returns ZX_ERR_NO_RESOURCES if the VMAR does not contain
90
+ // a suitable free spot.
91
+ return Status == ZX_ERR_NO_MEMORY || Status == ZX_ERR_NO_RESOURCES;
92
+ }
93
+
87
94
MemMapFuchsia::MemMapFuchsia (uptr Base, uptr Capacity)
88
95
: MapAddr(Base), WindowBase(Base), WindowSize(Capacity) {
89
96
// Create the VMO.
@@ -101,7 +108,7 @@ bool MemMapFuchsia::mapImpl(UNUSED uptr Addr, uptr Size, const char *Name,
101
108
// Create the VMO.
102
109
zx_status_t Status = _zx_vmo_create (Size, 0 , &Vmo);
103
110
if (UNLIKELY (Status != ZX_OK)) {
104
- if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem)
111
+ if (! IsNoMemError (Status) || !AllowNoMem)
105
112
dieOnError (Status, " zx_vmo_create" , Size);
106
113
return false ;
107
114
}
@@ -116,7 +123,7 @@ bool MemMapFuchsia::mapImpl(UNUSED uptr Addr, uptr Size, const char *Name,
116
123
Status =
117
124
_zx_vmar_map (_zx_vmar_root_self (), MapFlags, 0 , Vmo, 0 , Size, &MapAddr);
118
125
if (UNLIKELY (Status != ZX_OK)) {
119
- if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem)
126
+ if (! IsNoMemError (Status) || !AllowNoMem)
120
127
dieOnError (Status, " zx_vmar_map" , Size);
121
128
122
129
Status = _zx_handle_close (Vmo);
@@ -187,7 +194,7 @@ bool MemMapFuchsia::remapImpl(uptr Addr, uptr Size, const char *Name,
187
194
_zx_vmar_map (_zx_vmar_root_self (), MapFlags, Addr - getRootVmarBase (),
188
195
Vmo, Addr - MapAddr, Size, &MappedAddr);
189
196
if (UNLIKELY (Status != ZX_OK)) {
190
- if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem)
197
+ if (! IsNoMemError (Status) || !AllowNoMem)
191
198
dieOnError (Status, " zx_vmar_map" , Size);
192
199
return false ;
193
200
}
@@ -227,7 +234,7 @@ bool ReservedMemoryFuchsia::createImpl(UNUSED uptr Addr, uptr Size,
227
234
zx_status_t Status = _zx_vmar_map (_zx_vmar_root_self (), ZX_VM_ALLOW_FAULTS, 0 ,
228
235
getPlaceholderVmo (), 0 , Size, &Base);
229
236
if (UNLIKELY (Status != ZX_OK)) {
230
- if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem)
237
+ if (! IsNoMemError (Status) || !AllowNoMem)
231
238
dieOnError (Status, " zx_vmar_map" , Size);
232
239
return false ;
233
240
}
0 commit comments