drivers: construct driver list at runtime #233
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Relying on linker politeness could fail when compiled with -flto : https://sigrok.org/bugzilla/show_bug.cgi?id=1433
Instead of using a special section that holds a pointer to each of the driver descriptors, use
__attribute__((constructor))
to run a certain function at runtime just before main() entry.That is also before glib init and possibly (unclear) before heap is usable, so it may not be possible to directly build a GArray or GSList. A simple linked-list provides the intermediate step, and
sr_drivers_init()
still builds the final driver list via a GArray.This compiler attribute is well-supported by gcc and clang.
It would possible to simplify this if struct sr_dev_driver had a 'next' member.
The SR_REGISTER_DEV_DRIVER_LIST() implementation is also not very elegant, but is a drop-in replacement.