コード例 #1
0
ファイル: shmpipe.c プロジェクト: spunktsch/svtplayer
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;
}
コード例 #2
0
ファイル: shmpipe.c プロジェクト: 0p1pp1/gst-plugins-bad
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);
}
コード例 #3
0
ファイル: shmpipe.c プロジェクト: spunktsch/svtplayer
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);
}