/*
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
2011,2012 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
ChibiOS/RT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/RT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/**
* @file mail.c
* @brief Threads mail code.
*
* @addtogroup mail
* @{
*/
#include "ch.h"
#include "mail.h"
/**
* @brief Initializes a Mail Pool.
* @note The number of the mail objects in the mail pool should be at
* least 2+size(mailbox), this considering one writer and
* one reader, add one element for each extra reader or writer in
* order to avoid waiting on the mail pool. A smaller number of
* elements can be specified if waiting on the pool is acceptable.
*
* @param[out] mlp pointer to a @p MailPool structure
* @param[in] size the size of the mail objects to be placed in the pool
* @param[in] p pointer to the mail objects array first element
* @param[in] n number of elements in the mail objects array
*
* @init
*/
void mailInit(MailPool *mlp, size_t size, void *p, size_t n) {
chPoolInit(&mlp->pool, size, NULL);
chPoolLoadArray(&mlp->pool, p, n);
chSemInit(&mlp->sem, (cnt_t)n);
}
/**
* @brief Allocates a mail object from a mail pool.
* @pre The mail pool must be already been initialized.
*
* @param[in] mlp pointer to a @p MailPool structure
* @param[in] time the number of ticks before the operation timeouts,
* the following special values are allowed:
* - @a TIME_IMMEDIATE immediate timeout.
* - @a TIME_INFINITE no timeout.
* .
* @return The mail object.
* @retval NULL timeout expired.
*
* @api
*/
void *mailCreate(MailPool *mlp, systime_t time) {
msg_t msg;
void *mailp;
msg = chSemWaitTimeout(&mlp->sem, time);
if (msg != RDY_OK)
return NULL;
mailp = chPoolAlloc(&mlp->pool);
chDbgAssert(mailp != NULL, "mailCreate(), #1", "empty pool");
return mailp;
}
/**
* @brief Releases a mail object into a mail pool.
* @pre The mail pool must be already been initialized.
*
* @param[in] mlp pointer to a @p MailPool structure
* @param[in] mailp the pointer to the mail object to be released
*
* @api
*/
void mailDelete(MailPool *mlp, void *mailp) {
chPoolFree(&mlp->pool, mailp);
chSemSignal(&mlp->sem);
}
/** @} */