Beispiel #1
0
/** Initialise a BufferChunk for a BufferedWriter.
 *
 * \warning A lock on the BufferedWriter should be held if the readerThread
 * has already been started.
 *
 * \param self BufferedWriter pointer
 * \return a pointer to the newly-created BufferChunk, or NULL on error
 */
BufferChunk*
createBufferChunk(BufferedWriter* self)
{
  size_t initsize = 0.1 * self->bufSize;
  MBuffer* buf = mbuf_create2(self->bufSize, initsize);
  if (buf == NULL) { return NULL; }

  BufferChunk* chunk = (BufferChunk*)oml_malloc(sizeof(BufferChunk));
  if (chunk == NULL) {
    mbuf_destroy(buf);
    return NULL;
  }
  memset(chunk, 0, sizeof(BufferChunk));

  // set state
  chunk->mbuf = buf;
  chunk->targetBufSize = self->bufSize;
  chunk->next = chunk;
  pthread_mutex_init(&chunk->lock, NULL);
  logdebug3("%s: initialised chunk mutex %p\n", self->outStream->dest, &chunk->lock);

  self->unallocatedBuffers--;
  logdebug("Allocated chunk of size %dB (up to %d), %d remaining\n",
        initsize, self->bufSize, self->unallocatedBuffers);
  return chunk;
}
Beispiel #2
0
BufferChain*
createBufferChain(
  BufferedWriter* self
) {
  //  BufferChain* chain = (BufferChain*)malloc(sizeof(BufferChain) + self->chainLength);

  MBuffer* buf = mbuf_create2(self->chainLength, (size_t)(0.1 * self->chainLength));
  if (buf == NULL) return NULL;

  BufferChain* chain = (BufferChain*)xmalloc(sizeof(BufferChain));
  if (chain == NULL) {
    mbuf_destroy(buf);
    return NULL;
  }
  memset(chain, 0, sizeof(BufferChain));

  // set state
  chain->mbuf = buf;
  chain->targetBufSize = self->chainLength;

  /**
  buf->writeP = buf->readP = &buf->buf;
  buf->endP = &buf->buf + (buf->bufLength = self->chainLength);
  */

  self->chainsAvailable--;
  o_log (O_LOG_DEBUG, "Created new buffer chain of size %d with %d remaining.\n",
        self->chainLength, self->chainsAvailable);
  return chain;
}