... |
... |
@@ -238,54 +238,62 @@ |
238
|
238
|
{
|
239
|
239
|
FT_Error error;
|
240
|
240
|
FTC_MruNode node = NULL;
|
|
241
|
+ FTC_MruNode prev = NULL;
|
241
|
242
|
FT_Memory memory = list->memory;
|
242
|
243
|
|
243
|
244
|
|
244
|
|
- if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 )
|
|
245
|
+ if ( list->max_nodes > 0 && list->num_nodes >= list->max_nodes )
|
245
|
246
|
{
|
246
|
|
- node = list->nodes->prev;
|
|
247
|
+ prev = list->nodes->prev;
|
247
|
248
|
|
248
|
|
- FT_ASSERT( node );
|
|
249
|
+ FT_ASSERT( prev );
|
249
|
250
|
|
|
251
|
+ /* try fast reset when available */
|
250
|
252
|
if ( list->clazz.node_reset )
|
251
|
253
|
{
|
252
|
|
- error = list->clazz.node_reset( node, key, list->data );
|
|
254
|
+ error = list->clazz.node_reset( prev, key, list->data );
|
253
|
255
|
if ( !error )
|
|
256
|
+ {
|
|
257
|
+ node = prev;
|
|
258
|
+
|
254
|
259
|
FTC_MruNode_Up( &list->nodes, node );
|
255
|
|
- else
|
256
|
|
- node = NULL;
|
|
260
|
+ }
|
257
|
261
|
|
258
|
262
|
goto Exit;
|
259
|
263
|
}
|
260
|
|
-
|
261
|
|
- FTC_MruNode_Remove( &list->nodes, node );
|
262
|
|
- list->num_nodes--;
|
263
|
|
-
|
264
|
|
- if ( list->clazz.node_done )
|
265
|
|
- list->clazz.node_done( node, list->data );
|
266
|
264
|
}
|
267
|
265
|
|
268
|
266
|
/* zero new node in case of node_init failure */
|
269
|
|
- else if ( FT_ALLOC( node, list->clazz.node_size ) )
|
|
267
|
+ if ( FT_ALLOC( node, list->clazz.node_size ) )
|
270
|
268
|
goto Exit;
|
271
|
269
|
|
272
|
270
|
error = list->clazz.node_init( node, key, list->data );
|
273
|
271
|
if ( error )
|
274
|
|
- goto Fail;
|
|
272
|
+ {
|
|
273
|
+ prev = node;
|
|
274
|
+ node = NULL;
|
|
275
|
+
|
|
276
|
+ goto Clean;
|
|
277
|
+ }
|
275
|
278
|
|
276
|
279
|
FTC_MruNode_Prepend( &list->nodes, node );
|
277
|
280
|
list->num_nodes++;
|
278
|
281
|
|
279
|
|
- Exit:
|
280
|
|
- *anode = node;
|
281
|
|
- return error;
|
|
282
|
+ if ( !prev )
|
|
283
|
+ goto Exit;
|
282
|
284
|
|
283
|
|
- Fail:
|
|
285
|
+ FTC_MruNode_Remove( &list->nodes, prev );
|
|
286
|
+ list->num_nodes--;
|
|
287
|
+
|
|
288
|
+ Clean:
|
284
|
289
|
if ( list->clazz.node_done )
|
285
|
|
- list->clazz.node_done( node, list->data );
|
|
290
|
+ list->clazz.node_done( prev, list->data );
|
286
|
291
|
|
287
|
|
- FT_FREE( node );
|
288
|
|
- goto Exit;
|
|
292
|
+ FT_FREE( prev );
|
|
293
|
+
|
|
294
|
+ Exit:
|
|
295
|
+ *anode = node;
|
|
296
|
+ return error;
|
289
|
297
|
}
|
290
|
298
|
|
291
|
299
|
|
... |
... |
@@ -311,18 +319,16 @@ |
311
|
319
|
FTC_MruList_Remove( FTC_MruList list,
|
312
|
320
|
FTC_MruNode node )
|
313
|
321
|
{
|
314
|
|
- FTC_MruNode_Remove( &list->nodes, node );
|
315
|
|
- list->num_nodes--;
|
|
322
|
+ FT_Memory memory = list->memory;
|
316
|
323
|
|
317
|
|
- {
|
318
|
|
- FT_Memory memory = list->memory;
|
319
|
324
|
|
|
325
|
+ FTC_MruNode_Remove( &list->nodes, node );
|
|
326
|
+ list->num_nodes--;
|
320
|
327
|
|
321
|
|
- if ( list->clazz.node_done )
|
322
|
|
- list->clazz.node_done( node, list->data );
|
|
328
|
+ if ( list->clazz.node_done )
|
|
329
|
+ list->clazz.node_done( node, list->data );
|
323
|
330
|
|
324
|
|
- FT_FREE( node );
|
325
|
|
- }
|
|
331
|
+ FT_FREE( node );
|
326
|
332
|
}
|
327
|
333
|
|
328
|
334
|
|