int sp_writer_recv (ShmPipe * self, ShmClient * client) { ShmBuffer *buf = NULL, *prev_buf = NULL; struct CommandBuffer cb; if (!recv_command (client->fd, &cb)) return -1; switch (cb.type) { case COMMAND_ACK_BUFFER: for (buf = self->buffers; buf; buf = buf->next) { if (buf->shm_area->id == cb.area_id && buf->offset == cb.payload.ack_buffer.offset) { sp_shmbuf_dec (self, buf, prev_buf); break; } prev_buf = buf; } if (!buf) return -2; break; default: return -99; } return 0; }
void sp_writer_close_client (ShmPipe * self, ShmClient * client, sp_buffer_free_callback callback, void *user_data) { ShmBuffer *buffer = NULL, *prev_buf = NULL; ShmClient *item = NULL, *prev_item = NULL; shutdown (client->fd, SHUT_RDWR); close (client->fd); again: for (buffer = self->buffers; buffer; buffer = buffer->next) { int i; void *tag = NULL; for (i = 0; i < buffer->num_clients; i++) { if (buffer->clients[i] == client->fd) { if (!sp_shmbuf_dec (self, buffer, prev_buf, client, &tag)) { if (callback) callback (tag, user_data); goto again; } break; } } prev_buf = buffer; } for (item = self->clients; item; item = item->next) { if (item == client) break; prev_item = item; } assert (item); if (prev_item) prev_item->next = client->next; else self->clients = client->next; self->num_clients--; spalloc_free (ShmClient, client); }
void sp_writer_close_client (ShmPipe * self, ShmClient * client) { ShmBuffer *buffer = NULL, *prev_buf = NULL; ShmClient *item = NULL, *prev_item = NULL; close (client->fd); again: for (buffer = self->buffers; buffer; buffer = buffer->next) { int i; for (i = 0; i < buffer->num_clients; i++) { if (buffer->clients[i] == client->fd) { buffer->clients[i] = -1; if (!sp_shmbuf_dec (self, buffer, prev_buf)) goto again; break; } prev_buf = buffer; } } for (item = self->clients; item; item = item->next) { if (item == client) break; prev_item = item; } assert (item); if (prev_item) prev_item->next = client->next; else self->clients = client->next; self->num_clients--; spalloc_free (ShmClient, client); }