[SciPy-user] shared memory machines
Mon Feb 9 14:25:57 CST 2009
On Feb 9, 2009, at 1:05 PM, Sturla Molden wrote:
> On 2/9/2009 6:49 PM, Philip Semanchuk wrote:
>> If you're destroying the segment when the attach count drops to zero,
>> why not check that immediately after the call to shmdt()?
> I thought it was only the owner/creator that was allowed to do that?
Yes, sort of. Sys V IPC objects are owned by users, not processes, so
if user foo creates a semaphore in one process and destroys it in
another, that's OK. I just verified this on OS X. Unless portions of
your SciPy application will be running under different users, I think
the matter of which process destroys an IPC object is irrelevant.
>> ftok() should probably be avoided as it returns duplicate keys:
> Oh :(
> In that case I could rewrite the object to pickle the shmid instead
> of a
> random name (uuid string) on System V.
But you need the key, not the id, to pass to shmget() to get a handle
to an existing IPC object.
>> I'd recommend using a random number generator instead. I believe a
>> key_t is guaranteed to fit into an int, so you could generate a
>> number anywhere from 1 to INT_MAX, taking care not to step on the
>> value IPC_PRIVATE (unless you want to assume that that is always
>> #defined to 0).
> I am not sure how big the problem is, as I pass an uuid as filename
> to ftok.
I'm not sure how big the problem is either. All I know is that in my
experience, ftok() returned the same key for different files in the
same directory. I realized, therefore, that my code needed to handle
the case where ftok() didn't generate a useful key. Since I needed a
second, more reliable method of key generation, why use ftok() at all?
If I were you, rather than trying to figure out how broken ftok() is
(and it might be broken in different ways on different platforms), I'd
just abandon it altogether. It's not as if generating a random number
instead is difficult. In fact, it's easier. Instead of generating a
random uuid and passing that to ftok(), eliminate the middleman and
generate a random key yourself.
More information about the SciPy-user