> On 1 Feb 2022, at 23:40, Jen Kris <jenk...@tutanota.com> wrote:
> 
> Barry, thanks for your reply.  
> 
> On the theory that it is not yet possible to pass data from a non-Python 
> language to Python with multiprocessing.shared_memory, I bypassed the problem 
> by attaching 4 bytes to my FIFO pipe message from NASM to Python:
> 
> byte_val = v[10:14]
> 
> where v is the message read from the FIFO.  Then:
> 
> breakup = int.from_bytes(byte_val, "big")
> print("this is breakup " + str(breakup))
> 
> Python prints:  this is breakup 32894
> 
> Note that I had to switch from little endian to big endian.  Python is little 
> endian by default, but in this case it's big endian.  
> 
> However, if anyone on this list knows how to pass data from a non-Python 
> language to Python in multiprocessing.shared_memory please let me (and the 
> list) know.  

By using the struct module you can control for endian of the data.

Barry

> 
> Thanks.  
> 
> 
> Feb 1, 2022, 14:20 by ba...@barrys-emacs.org:
> 
> On 1 Feb 2022, at 20:26, Jen Kris via Python-list <python-list@python.org> 
> wrote:
> 
> I am using multiprocesssing.shared_memory to pass data between NASM and 
> Python. The shared memory is created in NASM before Python is called. Python 
> connects to the shm: shm_00 = 
> shared_memory.SharedMemory(name='shm_object_00',create=False). 
> 
> I have used shared memory at other points in this project to pass text data 
> from Python back to NASM with no problems. But now this time I need to pass a 
> 32-bit integer (specifically 32,894) from NASM to Python. 
> 
> First I convert the integer to bytes in a C program linked into NASM:
> 
> unsigned char bytes[4]
> unsigned long int_to_convert = 32894;
> 
> bytes[0] = (int_to_convert >> 24) & 0xFF;
> bytes[1] = (int_to_convert >> 16) & 0xFF;
> bytes[2] = (int_to_convert >> 8) & 0xFF;
> bytes[3] = int_to_convert & 0xFF;
> memcpy(outbuf, bytes, 4);
> 
> where outbuf is a pointer to the shared memory. On return from C to NASM, I 
> verify that the first four bytes of the shared memory contain what I want, 
> and they are 0, 0, -128, 126 which is binary 00000000 00000000 10000000 
> 01111110, and that's correct (32,894). 
> 
> Next I send a message to Python through a FIFO to read the data from shared 
> memory. Python uses the following code to read the first four bytes of the 
> shared memory:
> 
> byte_val = shm_00.buf[:4]
> print(shm_00.buf[0])
> print(shm_00.buf[1])
> print(shm_00.buf[2])
> print(shm_00.buf[3])
> 
> But the bytes show as 40 39 96 96, which is exactly what the first four bytes 
> of this shared memory contained before I called C to overwrite them with the 
> bytes 0, 0, -128, 126. So Python does not see the updated bytes, and 
> naturally int.from_bytes(byte_val, "little") does not return the result I 
> want. 
> 
> I know that Python refers to shm00.buf, using the buffer protocol. Is that 
> the reason that Python can't see the data that has been updated by another 
> language? 
> 
> So my question is, how can I alter the data in shared memory in a non-Python 
> language to pass back to Python?
> 
> Maybe you need to use a memory barrier to force the data to be seen by 
> another cpu?
> Maybe use shm lock operation to sync both sides?
> Googling I see people talking about using stdatomic.h for this.
> 
> But I am far from clear what you would need to do.
> 
> Barry
> 
> Thanks,
> 
> Jen
> 
> -- 
> https://mail.python.org/mailman/listinfo/python-list
> 

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to