... and given getpid(2) implementation, a pid based table could be quite expensive, since MyStruct is accessed very very often.

2015-09-05 16:03 GMT+02:00 Giacomo Tesio <giacomo@tesio.it>:
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 spawn
3) 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