diff options
author | Roy Thompson <rthompso@gmail.com> | 2014-01-28 16:11:00 -0500 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2014-01-28 17:49:31 -0500 |
commit | e2acdc57d1b0ccb3fc9e91add8d141118cf78e3d (patch) | |
tree | 5ee9539170eeee6928fda751f85d891fef1e788b | |
parent | eac68237d5bb876bb1ecbe0c73555be5dbb838fc (diff) |
volk: make volk's get_machine thread safe.
Sets a local struct instead of the global while searching. When found, then sets the machine.
This assumes that the pointer assignment is atomic, which it probably is on almost any platform.
-rw-r--r-- | volk/tmpl/volk.tmpl.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/volk/tmpl/volk.tmpl.c b/volk/tmpl/volk.tmpl.c index f915f157f6..eb22435314 100644 --- a/volk/tmpl/volk.tmpl.c +++ b/volk/tmpl/volk.tmpl.c @@ -32,28 +32,32 @@ static size_t __alignment = 0; static intptr_t __alignment_mask = 0; -struct volk_machine *get_machine(void) { - extern struct volk_machine *volk_machines[]; - extern unsigned int n_volk_machines; - static struct volk_machine *machine = NULL; - - if(machine != NULL) return machine; - else { - unsigned int max_score = 0; - unsigned int i; - for(i=0; i<n_volk_machines; i++) { - if(!(volk_machines[i]->caps & (~volk_get_lvarch()))) { - if(volk_machines[i]->caps > max_score) { - max_score = volk_machines[i]->caps; - machine = volk_machines[i]; - } - } +struct volk_machine *get_machine(void) +{ + extern struct volk_machine *volk_machines[]; + extern unsigned int n_volk_machines; + static struct volk_machine *machine = NULL; + + if(machine != NULL) + return machine; + else { + unsigned int max_score = 0; + unsigned int i; + struct volk_machine *max_machine = NULL; + for(i=0; i<n_volk_machines; i++) { + if(!(volk_machines[i]->caps & (~volk_get_lvarch()))) { + if(volk_machines[i]->caps > max_score) { + max_score = volk_machines[i]->caps; + max_machine = volk_machines[i]; } - printf("Using Volk machine: %s\n", machine->name); - __alignment = machine->alignment; - __alignment_mask = (intptr_t)(__alignment-1); - return machine; + } } + machine = max_machine; + printf("Using Volk machine: %s\n", machine->name); + __alignment = machine->alignment; + __alignment_mask = (intptr_t)(__alignment-1); + return machine; + } } size_t volk_get_alignment(void) |