You would call extend instead of calling bump, or as part of bumping. On Wed, Jul 10, 2013 at 2:30 AM, Ashi <ashi08...@gmail.com> wrote: > Thanks for all good explanation. > > > On Tue, Jul 9, 2013 at 11:24 PM, Sebastian Huber > <sebastian.hu...@embedded-brains.de> wrote: >> >> On 07/09/2013 05:29 AM, Ashi wrote: >>> >>> Hi, Sebastian, thanks for your review! >>> >>> 在 2013-7-7 下午9:49,"Sebastian Huber" <sebastian.hu...@embedded-brains.de >>> <mailto:sebastian.hu...@embedded-brains.de>>写道: >>> >>> > >>> > Hello Ashi, >>> > >>> > >>> > On 06/07/13 09:17, Ashi wrote: >>> >> >>> >> Hi all, >>> >> >>> >> this patch adds a data structure called freelist to score, there are >>> no >>> >> test cases yet and should be added later. >>> > >>> > >>> > I would appreciate to have the test for this new stuff included in the >>> patch. >>> >>> >>> sure, I will update the patch with test cases. >>> > >>> > >>> >> >>> >> Freelist is a structure, which contains a chain of nodes. It supports >>> 2 >>> >> operation: >>> >> - get node from freelist >>> >> - put node to freelist. >>> >> And when there is no enough node in freelist, it will automatically >>> >> increase itself's size by allocate more nodes from heap or >>> workspace(which >>> >> is specified by user). >>> > >>> > >>> > What can I do if I like to get the nodes from a magic space? >>> >>> >>> sorry for the unclear, you can get nodes from freelist by 'get' >>> operation. And >>> if you mean get nodes from heap or workspace, it's done by >>> _Freelist_Get_node(), which calls _Freelist_Bump() when there is no free >>> node left. >> >> >> Yes, the problem is that you limit your Freelist to the heap and >> workspace. If you use a handler function (or virtual method if you like) >> then you can avoid this limitation. >> >> [...] >> >>> >> +/** >>> >> + * @typedef freelist_callout >>> >> + */ >>> >> +typedef void (*freelist_callout)( >>> >> + Freelist_Control *fc, >>> >> + void *nodes >>> >> +); >>> >> + >>> >> +/** >>> >> + * @typedef Freelist_Control_struct >>> >> + * >>> >> + * This is used to manage each element. >>> >> + */ >>> >> +struct Freelist_Control_struct { >>> >> + Chain_Control Freelist; >>> >> + size_t free_count; >>> > >>> > >>> > Why do we need the free_count? >>> >>> free_count is used to keep track how many nodes there is in freelist. And >>> if >>> free_count is 0 when you try to get node from freelist by call >>> _Freelist_Get_node(), _Freelist_Get_node() will call _Freelist_Bump() to >>> allocate more node from heap or workspace. >> >> >> The list knows if it is empty. There is not need to store this >> information in two ways. >> >> >>> > >>> >> + size_t bump_count; >>> >> + size_t node_size; >>> > >>> > >>> >> + freelist_callout callout; >>> >> + bool use_workspace; >>> >> +}; >>> > >>> > >>> > I would replace this with an extend handler. >>> > >>> > /** >>> > * @brief Extends the freelist. >>> > * >>> > * @param[in] freelist The freelist control. >>> > * >>> > * @return The count of new nodes. >>> > */ >>> > typedef size_t ( *Freelist_Extend )( Freelist_Control *freelist ); >>> > >>> > This is much more flexible since you only specify the interface and >>> don't >>> limit this to heap/workspace. >>> > >>> > You can provide a _Freelist_Extend_with_nothing() which simply returns >>> 0. >>> >>> Yeah, this Freelist_Extend is very flexible, but I feel the >>> Freelist_Extend is >>> a little complex. As it shows in _Freelist_Bump(), if users provides >>> their own >>> extension function, they have to append there new nodes to freelist's >>> internal >>> chain and call their callout function on new nodes. And since >>> _Freelist_Initialize() also would call Freelist_Extend(), if we provided >>> _Freelist_Extend_with_nothing(), the initialization may fail. >> >> >> Since the Freelist_Extend gets the Freelist as a first argument it can set >> the extend handler to _Freelist_Extend_with_nothing() after the first >> invocation. >> >> Example: >> >> >> /** >> * @brief Extends the freelist. >> * >> * @param[in] freelist The freelist control. >> */ >> typedef void ( *Freelist_Extend )( Freelist_Control *freelist ); >> >> typedef struct { >> Objects_Control obj; >> int x; >> } my_obj; >> >> void my_extend( Freelist_Control *freelist ) >> { >> size_t bump_count = freelist->bump_count; >> size_t size = bump_count * sizeof(my_obj); >> my_obj *objs = malloc(size); >> >> _Freelist_Set_extend_handler( freelist, _Freelist_Extend_with_nothing ); >> _Chain_Initialize( >> _Freelist_Get_list( freelist ), >> objs, >> bump_count, >> size >> ); >> >> } > > I'm a little confused by my_extend() function, is it only called after > calling _Freelist_Initialize() by user? >> >> >> [...] >> >> -- >> Sebastian Huber, embedded brains GmbH >> >> Address : Dornierstr. 4, D-82178 Puchheim, Germany >> Phone : +49 89 189 47 41-16 >> Fax : +49 89 189 47 41-09 >> E-Mail : sebastian.hu...@embedded-brains.de >> PGP : Public key available on request. >> >> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. > > > Cheers, > Zhongwei >
_______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel