]> Kevux Git Server - fll/commit
Bugfix: File stream read inefficiency, allocation f_string_t instead of char, and...
authorKevin Day <thekevinday@gmail.com>
Mon, 7 Feb 2022 03:03:52 +0000 (21:03 -0600)
committerKevin Day <thekevinday@gmail.com>
Mon, 7 Feb 2022 03:38:48 +0000 (21:38 -0600)
commitc19060537c4136665b665c96a932291d53bfbda1
tree58ada554b7b2f571ef19887cc63ef0a4badd0f5d
parent99680bdca6e194971f4e40336d833486fa2693d1
Bugfix: File stream read inefficiency, allocation f_string_t instead of char, and actually use state.step_small.

The file stream reader requires the buffer to be pre-allocated.
Prevent the resize from resizing an extra time if the resulting size read is smaller than the requested size.
The caller can then optimize this by setting the read size to 1 digit larger than the actual file size.
Also switch to fread_unlocked() and handle the locks manually.

The strings are being allocated as f_string_t.
The f_string_t type definition is actually a "char *".
This is the size of a memory address (and could be as large as 64-bit type on 64-bit architectures).
This is a huge mistake because this should only be using size of char, which is 1.

I provided a state.step_large and state.step_small to the FSS functions as a quick solution for more control over memory management.
It turns out this is not being used and for very large files this can be very wasteful.
In the long term, I believe a better fix is needed where the files are pre-processed to determine the objects and contents.
Then, the structures can be allocated with a known size.
The reason for this is that it seems that memory resizes are significantly more expensive than processing an arbitrarily large string.
Increasing the cost of processing that string from one time to two times is likely worth the cost to save time and resources lost due to memory re-allocations.
12 files changed:
level_0/f_file/c/file.c
level_0/f_file/c/file.h
level_0/f_string/c/private-string.c
level_0/f_string/c/string-common.h
level_2/fll_execute/c/private-execute.c
level_2/fll_fss/c/fss.c
level_2/fll_fss/c/fss_basic.c
level_2/fll_fss/c/fss_basic_list.c
level_2/fll_fss/c/fss_embedded_list.c
level_2/fll_fss/c/fss_extended.c
level_2/fll_fss/c/fss_extended_list.c
level_2/fll_fss/c/fss_payload.c