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
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to