mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 08:26:27 +00:00
Avoid cache_flush when releasing contents.
(send_release): Remove function. ([Collection -_releaseContents]): New method. ([Collection -dealloc]): Use it. ([Collection -empty]): Likewise. ([Collection -_safeWithElementsCallNoRetain:]): Use -getNextElement:withEnumState instead of -withElementsCall: to avoid cache_flush. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@613 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
2e9ca621e3
commit
3f05c8ed68
1 changed files with 22 additions and 7 deletions
|
@ -70,26 +70,41 @@
|
|||
int c = [self count];
|
||||
elt *elts = (elt*) (*objc_malloc) (c * sizeof(elt));
|
||||
int i = 0;
|
||||
void fill_elts(elt e)
|
||||
void *es = [self newEnumState];
|
||||
elt e;
|
||||
while ([self getNextElement:&e withEnumState:&es])
|
||||
{
|
||||
elts[i++] = e;
|
||||
}
|
||||
[self withElementsCall:fill_elts];
|
||||
[self freeEnumState:&es];
|
||||
assert (c == i);
|
||||
for (i = 0; i < c; i++)
|
||||
aFunc(elts[i]);
|
||||
(*objc_free) (elts);
|
||||
}
|
||||
|
||||
static void
|
||||
send_release(elt e)
|
||||
- (void) _releaseContents
|
||||
{
|
||||
[e.id_u release];
|
||||
int c = [self count];
|
||||
elt *elts = (elt*) (*objc_malloc) (c * sizeof(elt));
|
||||
int i = 0;
|
||||
void *es = [self newEnumState];
|
||||
elt e;
|
||||
while ([self getNextElement:&e withEnumState:&es])
|
||||
{
|
||||
elts[i++] = e;
|
||||
}
|
||||
[self freeEnumState:&es];
|
||||
assert (c == i);
|
||||
for (i = 0; i < c; i++)
|
||||
[elts[i].id_u release];
|
||||
(*objc_free) (elts);
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
if (CONTAINS_OBJECTS)
|
||||
[self _safeWithElementsCallNoRetain:send_release];
|
||||
[self _releaseContents];
|
||||
[self _collectionDealloc];
|
||||
[super dealloc];
|
||||
}
|
||||
|
@ -100,7 +115,7 @@ send_release(elt e)
|
|||
if ([self isEmpty])
|
||||
return self;
|
||||
if (CONTAINS_OBJECTS)
|
||||
[self _safeWithElementsCallNoRetain:send_release];
|
||||
[self _releaseContents];
|
||||
[self _empty];
|
||||
return self;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue