diff options
author | Max Romanov <max.romanov@nginx.com> | 2017-09-18 17:35:24 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2017-09-18 17:35:24 +0300 |
commit | 4f7e00ef34345235f3b118749b5183a3f1ad5732 (patch) | |
tree | a0db28819ec6c3b03cc8f50d48e4c72814488b53 /src/nxt_port_memory.c | |
parent | 75a63256563a1eaf13fbd182800070849c3beb52 (diff) | |
download | unit-4f7e00ef34345235f3b118749b5183a3f1ad5732.tar.gz unit-4f7e00ef34345235f3b118749b5183a3f1ad5732.tar.bz2 |
Fixing shared memory thread safety issue.
Do not reuse shared memory segment with different port until this segment
successfully received and indexed on other side. However, segment can be used
to transfer data via the port it was sent at any time.
Diffstat (limited to '')
-rw-r--r-- | src/nxt_port_memory.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/nxt_port_memory.c b/src/nxt_port_memory.c index 82d96004..ec4bbdf7 100644 --- a/src/nxt_port_memory.c +++ b/src/nxt_port_memory.c @@ -198,6 +198,8 @@ nxt_port_incoming_port_mmap(nxt_task_t *task, nxt_process_t *process, nxt_abort(); } + hdr->sent_over = 0xFFFFu; + fail: nxt_thread_mutex_unlock(&process->incoming_mutex); @@ -297,6 +299,7 @@ nxt_port_new_port_mmap(nxt_task_t *task, nxt_process_t *process, hdr->id = process->outgoing->nelts - 1; hdr->pid = process->pid; + hdr->sent_over = port->id; /* Mark first chunk as busy */ nxt_port_mmap_set_chunk_busy(hdr, 0); @@ -356,7 +359,9 @@ nxt_port_mmap_get(nxt_task_t *task, nxt_port_t *port, nxt_chunk_id_t *c, while (port_mmap < end_port_mmap) { - if (nxt_port_mmap_get_free_chunk(port_mmap->hdr, c)) { + if ( (port_mmap->hdr->sent_over == 0xFFFFu || + port_mmap->hdr->sent_over == port->id) && + nxt_port_mmap_get_free_chunk(port_mmap->hdr, c)) { hdr = port_mmap->hdr; goto unlock_return; |