- fsh_free_bytes_sub (fsh, chunk_size + sizeof (*c));
- }
- else if (chunk_size <= fss->n_fl_chunk_bytes)
- {
- c = fs_try_alloc_multi_chunk (fsh, fss, chunk_size);
- }
- else if (chunk_size <= fss->n_fl_chunk_bytes + n_free)
- {
- u32 min_size = FIFO_SEGMENT_MIN_FIFO_SIZE;
- u32 batch;
+ fsh_check_mem (fsh);
+ n_free = fsh_n_free_bytes (fsh);
+ }
+ if (chunk_size <= fss->n_fl_chunk_bytes)
+ {
+ c = fs_try_alloc_multi_chunk (fsh, fss, chunk_size);
+ if (c)
+ goto done;
+ batch = n_free / FIFO_SEGMENT_MIN_FIFO_SIZE;
+ if (!batch || fsh_try_alloc_chunk_batch (fsh, fss, 0, batch))
+ {
+ fsh_check_mem (fsh);
+ goto done;
+ }
+ }
+ if (chunk_size <= fss->n_fl_chunk_bytes + n_free)
+ {
+ u32 min_size = FIFO_SEGMENT_MIN_FIFO_SIZE;