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
);
}
[...]
--
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.
_______________________________________________
rtems-devel mailing list
rtems-devel@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel