Go to the documentation of this file.
46 #if (CH_CFG_USE_FACTORY == TRUE) || defined(__DOXYGEN__)
55 #if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__)
56 #define F_LOCK() chMtxLock(&ch_factory.mtx)
57 #define F_UNLOCK() chMtxUnlock(&ch_factory.mtx)
59 #define F_LOCK() (void) chSemWait(&ch_factory.sem)
60 #define F_UNLOCK() chSemSignal(&ch_factory.sem)
86 static void copy_name(
const char *sp,
char *dp) {
95 }
while ((c != (
char)0) && (i > 0U));
98 static inline void dyn_list_init(
dyn_list_t *dlp) {
122 if (prev->
next == element) {
135 #if CH_FACTORY_REQUIRES_HEAP || defined(__DOXYGEN__)
136 static dyn_element_t *dyn_create_object_heap(
const char *name,
145 dep = dyn_list_find(name, dlp);
157 copy_name(name, dep->name);
159 dep->
next = dlp->next;
175 dep = dyn_list_unlink(dep, dlp);
181 #if CH_FACTORY_REQUIRES_POOLS || defined(__DOXYGEN__)
182 static dyn_element_t *dyn_create_object_pool(
const char *name,
190 dep = dyn_list_find(name, dlp);
202 copy_name(name, dep->name);
204 dep->
next = dlp->next;
221 dep = dyn_list_unlink(dep, dlp);
233 dep = dyn_list_find(name, dlp);
253 #if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__)
259 #if CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE
265 #if CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE
268 #if CH_CFG_FACTORY_SEMAPHORES == TRUE
274 #if CH_CFG_FACTORY_MAILBOXES == TRUE
277 #if CH_CFG_FACTORY_OBJ_FIFOS == TRUE
280 #if CH_CFG_FACTORY_PIPES == TRUE
285 #if (CH_CFG_FACTORY_OBJECTS_REGISTRY == TRUE) || defined(__DOXIGEN__)
363 if (rop->
objp == objp) {
394 dyn_release_object_pool(&rop->
element,
402 #if (CH_CFG_FACTORY_GENERIC_BUFFERS == TRUE) || defined(__DOXIGEN__)
429 memset((
void *)(dbp + 1), 0, size);
482 #if (CH_CFG_FACTORY_SEMAPHORES == TRUE) || defined(__DOXIGEN__)
555 dyn_release_object_pool(&dsp->
element,
563 #if (CH_CFG_FACTORY_MAILBOXES == TRUE) || defined(__DOXIGEN__)
587 (n *
sizeof (
msg_t)),
644 #if (CH_CFG_FACTORY_OBJ_FIFOS == TRUE) || defined(__DOXIGEN__)
677 size2 = objn * objsize;
686 uint8_t *objbuf = (uint8_t *)dofp + size1;
690 (
void *)objbuf, msgbuf);
744 #if (CH_CFG_FACTORY_PIPES == TRUE) || defined(__DOXIGEN__)
767 dpp = (
dyn_pipe_t *)dyn_create_object_heap(name,
static void chPoolObjectInit(memory_pool_t *mp, size_t size, memgetfunc_t provider)
Initializes an empty memory pool.
dyn_semaphore_t * chFactoryFindSemaphore(const char *name)
Retrieves a dynamic semaphore object.
dyn_mailbox_t * chFactoryFindMailbox(const char *name)
Retrieves a dynamic mailbox object.
void chFactoryReleaseObjectsFIFO(dyn_objects_fifo_t *dofp)
Releases a dynamic "objects FIFO" object.
void chPoolFree(memory_pool_t *mp, void *objp)
Releases an object into a memory pool.
dyn_objects_fifo_t * chFactoryCreateObjectsFIFO(const char *name, size_t objsize, size_t objn, unsigned objalign)
Creates a dynamic "objects FIFO" object.
dyn_element_t element
List element of the dynamic buffer object.
Type of a dynamic buffer object.
#define chDbgAssert(c, r)
Condition assertion.
dyn_pipe_t * chFactoryFindPipe(const char *name)
Retrieves a dynamic pipe object.
#define CH_CFG_FACTORY_MAX_NAMES_LENGTH
Maximum length for object names.
void * objp
Pointer to the object.
Type of a dynamic object list element.
registered_object_t * chFactoryRegisterObject(const char *name, void *objp)
Registers a generic object.
objects_fifo_t fifo
The objects FIFO.
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.
void chHeapFree(void *p)
Frees a previously allocated memory block.
Type of a dynamic object list.
dyn_element_t element
List element of the dynamic buffer object.
void chFactoryReleasePipe(dyn_pipe_t *dpp)
Releases a dynamic pipe object.
Type of a dynamic semaphore.
void chFactoryReleaseObject(registered_object_t *rop)
Releases a registered object.
void chFactoryReleaseSemaphore(dyn_semaphore_t *dsp)
Releases a dynamic semaphore object.
Type of a dynamic pipe object.
dyn_list_t fifo_list
List of the allocated "objects FIFO" objects.
#define chDbgCheck(c)
Function parameters check.
struct ch_dyn_element * next
Next dynamic object in the list.
dyn_objects_fifo_t * chFactoryFindObjectsFIFO(const char *name)
Retrieves a dynamic "objects FIFO" object.
dyn_list_t pipe_list
List of the allocated pipe objects.
#define CH_HEAP_ALIGNMENT
Minimum alignment used for heap.
void chFactoryReleaseBuffer(dyn_buffer_t *dbp)
Releases a dynamic buffer object.
void chSemObjectInit(semaphore_t *sp, cnt_t n)
Initializes a semaphore with the specified counter value.
void chFactoryReleaseMailbox(dyn_mailbox_t *dmp)
Releases a dynamic mailbox object.
void chMtxObjectInit(mutex_t *mp)
Initializes s mutex_t structure.
mutex_t mtx
Factory access mutex or semaphore.
dyn_element_t element
List element of the dynamic semaphore.
void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n)
Initializes a mailbox_t object.
dyn_element_t element
List element of the dynamic pipe object.
#define MEM_ALIGN_NEXT(p, a)
Aligns to the next aligned memory address.
Type of a dynamic buffer object.
Type of a dynamic buffer object.
objects_factory_t ch_factory
Factory object static instance.
dyn_semaphore_t * chFactoryCreateSemaphore(const char *name, cnt_t n)
Creates a dynamic semaphore object.
ucnt_t refs
Number of references to this object.
dyn_buffer_t * chFactoryCreateBuffer(const char *name, size_t size)
Creates a generic dynamic buffer object.
dyn_buffer_t * chFactoryFindBuffer(const char *name)
Retrieves a dynamic buffer object.
dyn_list_t buf_list
List of the allocated buffer objects.
void __factory_init(void)
Initializes the objects factory.
static void chFifoObjectInitAligned(objects_fifo_t *ofp, size_t objsize, size_t objn, unsigned objalign, void *objbuf, msg_t *msgbuf)
Initializes a FIFO object.
Type of the factory main object.
dyn_element_t element
List element of the registered object.
memory_pool_t sem_pool
Pool of the available semaphores.
Type of a registered object.
void chPipeObjectInit(pipe_t *pp, uint8_t *buf, size_t n)
Initializes a mailbox_t object.
memory_pool_t obj_pool
Pool of the available registered objects.
registered_object_t * chFactoryFindObject(const char *name)
Retrieves a registered object.
dyn_element_t element
List element of the dynamic buffer object.
void * chPoolAlloc(memory_pool_t *mp)
Allocates an object from a memory pool.
semaphore_t sem
The semaphore.
dyn_pipe_t * chFactoryCreatePipe(const char *name, size_t size)
Creates a dynamic pipe object.
registered_object_t * chFactoryFindObjectByPointer(void *objp)
Retrieves a registered object by pointer.
dyn_list_t obj_list
List of the registered objects.
dyn_list_t mbx_list
List of the allocated buffer objects.
static void * chCoreAllocAlignedI(size_t size, unsigned align)
Allocates a memory block.
dyn_mailbox_t * chFactoryCreateMailbox(const char *name, size_t n)
Creates a dynamic mailbox object.
dyn_list_t sem_list
List of the allocated semaphores.
mailbox_t mbx
The mailbox.