nxt_port_memory.c (90:f9462c69c19e) nxt_port_memory.c (122:d18727e877c6)
1
2/*
3 * Copyright (C) Max Romanov
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 21 unchanged lines hidden (view full) ---

30nxt_port_mmap_buf_completion(nxt_task_t *task, void *obj, void *data)
31{
32 u_char *p;
33 nxt_mp_t *mp;
34 nxt_buf_t *b;
35 nxt_chunk_id_t c;
36 nxt_port_mmap_header_t *hdr;
37
1
2/*
3 * Copyright (C) Max Romanov
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 21 unchanged lines hidden (view full) ---

30nxt_port_mmap_buf_completion(nxt_task_t *task, void *obj, void *data)
31{
32 u_char *p;
33 nxt_mp_t *mp;
34 nxt_buf_t *b;
35 nxt_chunk_id_t c;
36 nxt_port_mmap_header_t *hdr;
37
38 if (nxt_buf_ts_handle(task, obj, data)) {
39 return;
40 }
41
38 b = obj;
39
40 nxt_debug(task, "mmap buf completion: %p %p", b, b->mem.start);
41
42 mp = b->data;
43
44#if (NXT_DEBUG)
45 if (nxt_slow_path(data != b->parent)) {

--- 20 unchanged lines hidden (view full) ---

66
67 while (p < b->mem.end) {
68 nxt_port_mmap_set_chunk_free(hdr, c);
69
70 p += PORT_MMAP_CHUNK_SIZE;
71 c++;
72 }
73
42 b = obj;
43
44 nxt_debug(task, "mmap buf completion: %p %p", b, b->mem.start);
45
46 mp = b->data;
47
48#if (NXT_DEBUG)
49 if (nxt_slow_path(data != b->parent)) {

--- 20 unchanged lines hidden (view full) ---

70
71 while (p < b->mem.end) {
72 nxt_port_mmap_set_chunk_free(hdr, c);
73
74 p += PORT_MMAP_CHUNK_SIZE;
75 c++;
76 }
77
74 nxt_buf_free(mp, b);
78 nxt_mp_release(mp, b);
75}
76
77
78nxt_port_mmap_header_t *
79nxt_port_incoming_port_mmap(nxt_task_t *task, nxt_process_t *process,
80 nxt_fd_t fd)
81{
82 void *mem;

--- 62 unchanged lines hidden (view full) ---

145
146static void
147nxt_port_mmap_send_fd_buf_completion(nxt_task_t *task, void *obj, void *data)
148{
149 nxt_fd_t fd;
150 nxt_buf_t *b;
151 nxt_mp_t *mp;
152
79}
80
81
82nxt_port_mmap_header_t *
83nxt_port_incoming_port_mmap(nxt_task_t *task, nxt_process_t *process,
84 nxt_fd_t fd)
85{
86 void *mem;

--- 62 unchanged lines hidden (view full) ---

149
150static void
151nxt_port_mmap_send_fd_buf_completion(nxt_task_t *task, void *obj, void *data)
152{
153 nxt_fd_t fd;
154 nxt_buf_t *b;
155 nxt_mp_t *mp;
156
157 if (nxt_buf_ts_handle(task, obj, data)) {
158 return;
159 }
160
153 b = obj;
154 mp = b->data;
155 fd = (nxt_fd_t) (intptr_t) data;
156
157#if (NXT_DEBUG)
158 if (nxt_slow_path(data != b->parent)) {
159 nxt_log_alert(task->log, "completion data (%p) != b->parent (%p)",
160 data, b->parent);
161 nxt_abort();
162 }
163#endif
164
165 nxt_debug(task, "mmap fd %FD has been sent", fd);
166
167 nxt_fd_close(fd);
168
161 b = obj;
162 mp = b->data;
163 fd = (nxt_fd_t) (intptr_t) data;
164
165#if (NXT_DEBUG)
166 if (nxt_slow_path(data != b->parent)) {
167 nxt_log_alert(task->log, "completion data (%p) != b->parent (%p)",
168 data, b->parent);
169 nxt_abort();
170 }
171#endif
172
173 nxt_debug(task, "mmap fd %FD has been sent", fd);
174
175 nxt_fd_close(fd);
176
169 nxt_buf_free(mp, b);
177 nxt_mp_release(mp, b);
170}
171
172
173static nxt_port_mmap_header_t *
174nxt_port_new_port_mmap(nxt_task_t *task, nxt_process_t *process,
175 nxt_port_t *port)
176{
177 void *mem;

--- 69 unchanged lines hidden (view full) ---

247 PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
248
249 if (nxt_slow_path(mem == MAP_FAILED)) {
250 goto remove_fail;
251 }
252
253 port_mmap->hdr = mem;
254
178}
179
180
181static nxt_port_mmap_header_t *
182nxt_port_new_port_mmap(nxt_task_t *task, nxt_process_t *process,
183 nxt_port_t *port)
184{
185 void *mem;

--- 69 unchanged lines hidden (view full) ---

255 PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
256
257 if (nxt_slow_path(mem == MAP_FAILED)) {
258 goto remove_fail;
259 }
260
261 port_mmap->hdr = mem;
262
255 b = nxt_buf_mem_alloc(port->mem_pool, 0, 0);
263 b = nxt_buf_mem_ts_alloc(task, port->mem_pool, 0);
256 if (nxt_slow_path(b == NULL)) {
257 goto remove_fail;
258 }
259
260 b->completion_handler = nxt_port_mmap_send_fd_buf_completion;
264 if (nxt_slow_path(b == NULL)) {
265 goto remove_fail;
266 }
267
268 b->completion_handler = nxt_port_mmap_send_fd_buf_completion;
261 b->data = port->mem_pool;
262 b->parent = (void *) (intptr_t) fd;
263
264 /* Init segment header. */
265 hdr = port_mmap->hdr;
266
267 nxt_memset(hdr->free_map, 0xFFU, sizeof(hdr->free_map));
268
269 hdr->id = process->outgoing->nelts - 1;

--- 121 unchanged lines hidden (view full) ---

391
392 nxt_debug(task, "request %z bytes shm buffer", size);
393
394 if (nxt_slow_path(size > PORT_MMAP_DATA_SIZE)) {
395 nxt_debug(task, "requested size (%z bytes) too big", size);
396 return NULL;
397 }
398
269 b->parent = (void *) (intptr_t) fd;
270
271 /* Init segment header. */
272 hdr = port_mmap->hdr;
273
274 nxt_memset(hdr->free_map, 0xFFU, sizeof(hdr->free_map));
275
276 hdr->id = process->outgoing->nelts - 1;

--- 121 unchanged lines hidden (view full) ---

398
399 nxt_debug(task, "request %z bytes shm buffer", size);
400
401 if (nxt_slow_path(size > PORT_MMAP_DATA_SIZE)) {
402 nxt_debug(task, "requested size (%z bytes) too big", size);
403 return NULL;
404 }
405
399 b = nxt_mp_zalloc(port->mem_pool, NXT_BUF_PORT_MMAP_SIZE);
406 b = nxt_buf_mem_ts_alloc(task, port->mem_pool, 0);
400 if (nxt_slow_path(b == NULL)) {
401 return NULL;
402 }
403
407 if (nxt_slow_path(b == NULL)) {
408 return NULL;
409 }
410
404 b->data = port->mem_pool;
405 b->completion_handler = nxt_port_mmap_buf_completion;
411 b->completion_handler = nxt_port_mmap_buf_completion;
406 b->size = NXT_BUF_PORT_MMAP_SIZE;
407
408 nxt_buf_set_port_mmap(b);
409
410 hdr = nxt_port_mmap_get(task, port, &c, size);
411 if (nxt_slow_path(hdr == NULL)) {
412 nxt_buf_set_port_mmap(b);
413
414 hdr = nxt_port_mmap_get(task, port, &c, size);
415 if (nxt_slow_path(hdr == NULL)) {
412 nxt_buf_free(port->mem_pool, b);
416 nxt_mp_release(port->mem_pool, b);
413 return NULL;
414 }
415
416 b->parent = hdr;
417 return NULL;
418 }
419
420 b->parent = hdr;
421
417 b->mem.start = nxt_port_mmap_chunk_start(hdr, c);
418 b->mem.pos = b->mem.start;
419 b->mem.free = b->mem.start;
420 b->mem.end = b->mem.start + PORT_MMAP_CHUNK_SIZE;
421
422 nchunks = size / PORT_MMAP_CHUNK_SIZE;
423 if ((size % PORT_MMAP_CHUNK_SIZE) != 0 || nchunks == 0) {
424 nchunks++;

--- 87 unchanged lines hidden (view full) ---

512 nxt_buf_t *b;
513 nxt_port_mmap_header_t *hdr;
514
515 hdr = nxt_port_get_port_incoming_mmap(task, spid, mmap_msg->mmap_id);
516 if (nxt_slow_path(hdr == NULL)) {
517 return NULL;
518 }
519
422 b->mem.start = nxt_port_mmap_chunk_start(hdr, c);
423 b->mem.pos = b->mem.start;
424 b->mem.free = b->mem.start;
425 b->mem.end = b->mem.start + PORT_MMAP_CHUNK_SIZE;
426
427 nchunks = size / PORT_MMAP_CHUNK_SIZE;
428 if ((size % PORT_MMAP_CHUNK_SIZE) != 0 || nchunks == 0) {
429 nchunks++;

--- 87 unchanged lines hidden (view full) ---

517 nxt_buf_t *b;
518 nxt_port_mmap_header_t *hdr;
519
520 hdr = nxt_port_get_port_incoming_mmap(task, spid, mmap_msg->mmap_id);
521 if (nxt_slow_path(hdr == NULL)) {
522 return NULL;
523 }
524
520 b = nxt_mp_zalloc(port->mem_pool, NXT_BUF_PORT_MMAP_SIZE);
525 b = nxt_buf_mem_ts_alloc(task, port->mem_pool, 0);
521 if (nxt_slow_path(b == NULL)) {
522 return NULL;
523 }
524
526 if (nxt_slow_path(b == NULL)) {
527 return NULL;
528 }
529
525 b->data = port->mem_pool;
526 b->completion_handler = nxt_port_mmap_buf_completion;
530 b->completion_handler = nxt_port_mmap_buf_completion;
527 b->size = NXT_BUF_PORT_MMAP_SIZE;
528
529 nxt_buf_set_port_mmap(b);
530
531 nchunks = mmap_msg->size / PORT_MMAP_CHUNK_SIZE;
532 if ((mmap_msg->size % PORT_MMAP_CHUNK_SIZE) != 0) {
533 nchunks++;
534 }
535

--- 18 unchanged lines hidden (view full) ---

554 nxt_port_mmap_msg_t *mmap_msg;
555 nxt_port_mmap_header_t *hdr;
556
557 nxt_debug(task, "prepare %z bytes message for transfer to process %PI "
558 "via shared memory", sb->size, port->pid);
559
560 bsize = sb->niov * sizeof(nxt_port_mmap_msg_t);
561
531
532 nxt_buf_set_port_mmap(b);
533
534 nchunks = mmap_msg->size / PORT_MMAP_CHUNK_SIZE;
535 if ((mmap_msg->size % PORT_MMAP_CHUNK_SIZE) != 0) {
536 nchunks++;
537 }
538

--- 18 unchanged lines hidden (view full) ---

557 nxt_port_mmap_msg_t *mmap_msg;
558 nxt_port_mmap_header_t *hdr;
559
560 nxt_debug(task, "prepare %z bytes message for transfer to process %PI "
561 "via shared memory", sb->size, port->pid);
562
563 bsize = sb->niov * sizeof(nxt_port_mmap_msg_t);
564
562 b = nxt_buf_mem_alloc(port->mem_pool, bsize, 0);
565 b = nxt_buf_mem_ts_alloc(task, port->mem_pool, bsize);
563 if (nxt_slow_path(b == NULL)) {
564 return;
565 }
566
567 mmap_msg = (nxt_port_mmap_msg_t *) b->mem.start;
568 bmem = msg->buf;
569
570 for (i = 0; i < sb->niov; i++, mmap_msg++) {

--- 135 unchanged lines hidden ---
566 if (nxt_slow_path(b == NULL)) {
567 return;
568 }
569
570 mmap_msg = (nxt_port_mmap_msg_t *) b->mem.start;
571 bmem = msg->buf;
572
573 for (i = 0; i < sb->niov; i++, mmap_msg++) {

--- 135 unchanged lines hidden ---