On Tue, Oct 10, 2017 at 10:17:09AM +1100, Tobin C. Harding wrote: > Hi, > > I would like to create a boot time variable i.e a variable that is set once at boot time. Variable > does not need to be globally accessible. (actually I am using two variables). static foo = 42; should be all you need, right? If not, what exactly do you mean by "boot time variable"? > Could any one point me to examples of this already intree please? > > I have tried the following but it has a race condition on the zero check and assignment of randval/oddval. > > /* Maps a pointer to a unique identifier. */ > static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) > { > long hashval; > static long randval = 0; > static long oddval = 0; > > if (oddval == 0 && randval == 0) { > randval = get_random_long(); > oddval = get_random_odd_long(); > } > > hashval = ptr_obfuscate((unsigned long)ptr, randval, oddval); > spec.base = 16; > > return number(buf, end, hashval, spec); > } What's wrong with this code? > And the compiler doesn't like > > static long randval = get_random_long(); > static long oddval = get_random_odd_long(); Yeah, that will not work, static initializers are at link/load time, not runtime. > I thought of wrapping oddval/randval in a struct and protecting it with a lock but I don't know > how/where to initialize the lock in a race free manner? Put a local lock in the function when testing if the variables are == 0, if you are worried that two different callers will enter it at the same time. hope this helps, greg k-h _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies