Davin Potts <pyt...@discontinuity.net> added the comment:

@giampaolo:

> Also, what happens if you alter the size of an existing object with a smaller 
> value? Is the memory region overwritten?

Attaching to an existing shared memory block with a size=N which is smaller 
than its allocated size (say it was created with size=M and N<M) will succeed 
in giving you access to at least the first N bytes of that shared memory block. 
 The shared memory block allocated size will still be M bytes.  That means 
future attempts to attach to it with size=M will continue to work as well.  One 
motivation for why this is supported is, I believe, to deliberately limit 
access to part of the shared memory in some parts of a user's code, avoiding 
potential coding mistakes by design; for example, say the first 100KB contains 
unchanging reference data that many processes need to access but the second 
100KB contains rapidly changing data that only a few processes should ever 
access or manipulate.  I expect the most common use is to simply attach to the 
whole of a shared memory block, but I would not want to unnecessarily limit 
other established use cases.

This behavior needed to be captured in the docs but I see it has not been!  I 
have now added to the description of the size parameter and it should show up 
in GH-11816 shortly.


> Can't you just avoid calling ftruncate() if size is not passed (None)?

It looks like it does skip calling ftruncate() if size is 0.  From posixshmem.c:
        if (size) {
            DPRINTF("calling ftruncate, fd = %d, size = %ld\n", self->fd, size);
            if (-1 == ftruncate(self->fd, (off_t)size)) {


>> I think this misses the ...
> It appears this is already covered:

Sorry for any confusion; I was interpreting your proposed parameter name, 
attach_if_exists, in the following way:
* attach_if_exists=True:   If exists, attach to it otherwise create one
* attach_if_exists=False:  Create a new one but do not attach to an existing 
with the same name
I did not see a way to indicate a desire to *only* attach without creation.  I 
need a way to test to see if a shared memory block already exists or not 
without risk of creating one.  At least this is how I was interpreting "attach 
if exists".


> Don't you also want to "create if it doesn't exist, else attach" as a single, 
> atomic operation?

Yes, I do!  This was part of my description for the parameter named "create" in 
msg335660:
    When set to True, a new shared memory block will be created unless
    one already exists with the supplied unique name, in which case that block
    will be attached to and used.


> I'm not sure if there are or should be sync primitives to "wait for another 
> memory to join me" etc.

In the case of shared memory, I do not think so.  I think such signaling 
between processes, when needed, can be accomplished by our existing signaling 
mechanisms (like, via the Proxy Objects for Event or Semaphore).

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue35813>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to