45#if (CH_CFG_USE_FACTORY == TRUE) || defined(__DOXYGEN__)
54#if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__)
55#define F_LOCK() chMtxLock(&ch_factory.mtx)
56#define F_UNLOCK() chMtxUnlock(&ch_factory.mtx)
58#define F_LOCK() (void) chSemWait(&ch_factory.sem)
59#define F_UNLOCK() chSemSignal(&ch_factory.sem)
85#if CH_FACTORY_REQUIRES_HEAP || defined(__DOXYGEN__)
86static bool add_size(
size_t a,
size_t b,
size_t *result) {
88 if (a > ((
size_t)-1) - b) {
98#if ((CH_CFG_FACTORY_MAILBOXES == TRUE) || \
99 (CH_CFG_FACTORY_OBJ_FIFOS == TRUE)) || defined(__DOXYGEN__)
100static bool mul_size(
size_t a,
size_t b,
size_t *result) {
102 if ((a != (
size_t)0) && (b > ((
size_t)-1) / a)) {
112#if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXYGEN__)
113static bool align_size(
size_t size,
unsigned align,
size_t *result) {
117 if (aligned < size) {
136 }
while ((c != (
char)0) && (i > 0U));
163 if (prev->
next == element) {
182#if CH_FACTORY_REQUIRES_HEAP || defined(__DOXYGEN__)
238#if CH_FACTORY_REQUIRES_POOLS || defined(__DOXYGEN__)
320#if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__)
326#if CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE
332#if CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE
335#if CH_CFG_FACTORY_SEMAPHORES == TRUE
341#if CH_CFG_FACTORY_MAILBOXES == TRUE
344#if CH_CFG_FACTORY_OBJ_FIFOS == TRUE
347#if CH_CFG_FACTORY_PIPES == TRUE
375#if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXIGEN__)
453 while ((
void *)rop != (
void *)&
ch_factory.obj_list) {
454 if (rop->
objp == objp) {
493#if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXIGEN__)
525 memset((
void *)(dbp + 1), 0, size);
578#if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXIGEN__)
659#if (CH_CFG_FACTORY_MAILBOXES == TRUE) || defined(__DOXIGEN__)
676 size_t buffer_size, alloc_size;
745#if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXIGEN__)
769 size_t msgbuf_size, size1, size2, alloc_size;
772 chDbgCheck((objalign >= PORT_NATURAL_ALIGN) &&
775 if (
align_size(objsize, objalign, &objsize) ||
780 add_size(size1, size2, &alloc_size)) {
793 uint8_t *objbuf = (uint8_t *)dofp + size1;
797 (
void *)objbuf, msgbuf);
851#if (CH_CFG_FACTORY_PIPES == TRUE) || defined(__DOXIGEN__)
ChibiOS/RT main include file.
#define chDbgAssert(c, r)
Condition assertion.
#define chDbgCheck(c)
Function parameters check.
#define CH_CFG_FACTORY_MAX_NAMES_LENGTH
Maximum length for object names.
#define MEM_IS_VALID_ALIGNMENT(a)
Returns whatever a constant is a valid alignment.
#define MEM_ALIGN_NEXT(p, a)
Aligns to the next aligned memory address.
void chMtxObjectInit(mutex_t *mp)
Initializes s mutex_t structure.
void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n)
Initializes a mailbox_t object.
static void * chCoreAllocAlignedI(size_t size, unsigned align)
Allocates a memory block.
void chHeapFree(void *p)
Frees a previously allocated memory block.
void * chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align)
Allocates a block of memory from the heap by using the first-fit algorithm.
#define CH_HEAP_ALIGNMENT
Minimum alignment used for heap.
void * chPoolAlloc(memory_pool_t *mp)
Allocates an object from a memory pool.
static void chPoolObjectInit(memory_pool_t *mp, size_t size, memgetfunc_t provider)
Initializes an empty memory pool.
void chPoolFree(memory_pool_t *mp, void *objp)
Releases an object into a memory pool.
struct ch_dyn_objects_fifo dyn_objects_fifo_t
Type of a dynamic buffer object.
struct ch_dyn_element dyn_element_t
Type of a dynamic object list element.
dyn_mailbox_t * chFactoryFindMailbox(const char *name)
Retrieves a dynamic mailbox object.
static dyn_element_t * dyn_list_unlink(dyn_element_t *prev)
void chFactoryReleaseObjectsFIFO(dyn_objects_fifo_t *dofp)
Releases a dynamic "objects FIFO" object.
static void copy_name(const char *sp, char *dp)
struct ch_dyn_object dyn_buffer_t
Type of a dynamic buffer object.
static dyn_element_t * dyn_create_object_pool(const char *name, dyn_list_t *dlp, memory_pool_t *mp)
static bool align_size(size_t size, unsigned align, size_t *result)
void chFactoryReleaseObject(registered_object_t *rop)
Releases a registered object.
struct ch_dyn_list dyn_list_t
Type of a dynamic object list.
objects_factory_t ch_factory
Factory object static instance.
struct ch_dyn_semaphore dyn_semaphore_t
Type of a dynamic semaphore.
dyn_semaphore_t * chFactoryCreateSemaphore(const char *name, cnt_t n)
Creates a dynamic semaphore object.
dyn_objects_fifo_t * chFactoryFindObjectsFIFO(const char *name)
Retrieves a dynamic "objects FIFO" object.
static void dyn_release_object_heap(dyn_element_t *dep, dyn_list_t *dlp)
registered_object_t * chFactoryFindObjectByPointer(void *objp)
Retrieves a registered object by pointer.
static bool mul_size(size_t a, size_t b, size_t *result)
void chFactoryReleaseSemaphore(dyn_semaphore_t *dsp)
Releases a dynamic semaphore object.
dyn_buffer_t * chFactoryFindBuffer(const char *name)
Retrieves a dynamic buffer object.
dyn_semaphore_t * chFactoryFindSemaphore(const char *name)
Retrieves a dynamic semaphore object.
static dyn_element_t * dyn_create_object_heap(const char *name, dyn_list_t *dlp, size_t size, unsigned align)
static bool add_size(size_t a, size_t b, size_t *result)
dyn_pipe_t * chFactoryCreatePipe(const char *name, size_t size)
Creates a dynamic pipe object.
static void dyn_list_init(dyn_list_t *dlp)
void chFactoryReleasePipe(dyn_pipe_t *dpp)
Releases a dynamic pipe object.
struct ch_dyn_pipe dyn_pipe_t
Type of a dynamic pipe object.
struct ch_dyn_mailbox dyn_mailbox_t
Type of a dynamic buffer object.
dyn_mailbox_t * chFactoryCreateMailbox(const char *name, size_t n)
Creates a dynamic mailbox object.
dyn_objects_fifo_t * chFactoryCreateObjectsFIFO(const char *name, size_t objsize, size_t objn, unsigned objalign)
Creates a dynamic "objects FIFO" object.
registered_object_t * chFactoryFindObject(const char *name)
Retrieves a registered object.
void chFactoryReleaseBuffer(dyn_buffer_t *dbp)
Releases a dynamic buffer object.
void __factory_init(void)
Initializes the objects factory.
void chFactoryReleaseMailbox(dyn_mailbox_t *dmp)
Releases a dynamic mailbox object.
static dyn_element_t * dyn_list_find_prev(dyn_element_t *element, dyn_list_t *dlp)
struct ch_registered_static_object registered_object_t
Type of a registered object.
struct ch_objects_factory objects_factory_t
Type of the factory main object.
dyn_element_t * chFactoryDuplicateReference(dyn_element_t *dep)
Duplicates an object reference.
static dyn_element_t * dyn_list_find(const char *name, dyn_list_t *dlp)
registered_object_t * chFactoryRegisterObject(const char *name, void *objp)
Registers a generic object.
static dyn_element_t * dyn_find_object(const char *name, dyn_list_t *dlp)
dyn_buffer_t * chFactoryCreateBuffer(const char *name, size_t size)
Creates a generic dynamic buffer object.
dyn_pipe_t * chFactoryFindPipe(const char *name)
Retrieves a dynamic pipe object.
static void dyn_release_object_pool(dyn_element_t *dep, dyn_list_t *dlp, memory_pool_t *mp)
static void chFifoObjectInitAligned(objects_fifo_t *ofp, size_t objsize, size_t objn, unsigned objalign, void *objbuf, msg_t *msgbuf)
Initializes a FIFO object.
void chPipeObjectInit(pipe_t *pp, uint8_t *buf, size_t n)
Initializes a mailbox_t object.
void chSemObjectInit(semaphore_t *sp, cnt_t n)
Initializes a semaphore with the specified counter value.
char name[CH_CFG_FACTORY_MAX_NAMES_LENGTH]
struct ch_dyn_element * next
Next dynamic object in the list.
ucnt_t refs
Number of references to this object.
mailbox_t mbx
The mailbox.
dyn_element_t element
List element of the dynamic buffer object.
dyn_element_t element
List element of the dynamic buffer object.
objects_fifo_t fifo
The objects FIFO.
dyn_element_t element
List element of the dynamic buffer object.
dyn_element_t element
List element of the dynamic pipe object.
semaphore_t sem
The semaphore.
dyn_element_t element
List element of the dynamic semaphore.
void * objp
Pointer to the object.
dyn_element_t element
List element of the registered object.