2011-05-20 3:30 GMT+02:00 erik quanstrom <quanstro@quanstro.net>:one note is that while i'm aware of privalloc(2), i didn't use it. the
implementation doesn't appear correct for shared-memory procs.
i think there are two issues
- locking is unnecessary. the only preemptable unit of execution is
a process and each process is guarenteed to have its own instance
of _privates and _nprivates.
- for shared-memory procs, we will run out of privates because
the static privinit will be falsely shared. privinit should be replaced
by using a private entry.In a set of processes that share memory, I need a single per-process location to store the address of structure (which is in turn allocated in the global memory space).Privalloc(2) seemed what I need, but seem that I can't use it properly.In the parent process I do:1) initialialize a global variable p = (MyStruct **)privalloc();2) allocate a MyStruct for every process I'm going to spawn3) spawn processes with rfork(RFMEM|RFPROC)The spawn() function that call rfork takes a MyStruct* as argument and assign it to *p in the new process.
For extra safety I added an assert(*p == nil) just after rfork, and after a few (apparently?) successful spawns, the assert fails.What I need is a sort of thread-local storage for the MyStruct*, so that each child process can find it's own dedicated MyStruct.I know that could get this with an hashtable based on the pid, but I'd prefer to avoid the book keeping if possible.Giacomo