summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Thompson <rthompso@gmail.com>2014-01-28 16:11:00 -0500
committerTom Rondeau <tom@trondeau.com>2014-01-28 17:49:31 -0500
commite2acdc57d1b0ccb3fc9e91add8d141118cf78e3d (patch)
tree5ee9539170eeee6928fda751f85d891fef1e788b
parenteac68237d5bb876bb1ecbe0c73555be5dbb838fc (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.c44
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)