12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#import "config.h"
#import <stdlib.h>
#import <string.h>
#import <limits.h>
#import "OFObject.h"
#import "OFExceptions.h"
#import "OFMacros.h"
@implementation OFObject
- init
{
if ((self = [super init]) != nil) {
__memchunks = NULL;
__memchunks_size = 0;
}
return self;
}
- free
{
void **iter = __memchunks + __memchunks_size;
while (iter-- > __memchunks)
free(*iter);
if (__memchunks != NULL)
free(__memchunks);
return [super free];
}
- addToMemoryPool: (void*)ptr
{
void **memchunks;
size_t memchunks_size;
memchunks_size = __memchunks_size + 1;
if (SIZE_MAX - __memchunks_size == 0 ||
memchunks_size > SIZE_MAX / sizeof(void*))
@throw [OFOutOfRangeException newWithClass: [self class]];
if ((memchunks = realloc(__memchunks,
memchunks_size * sizeof(void*))) == NULL)
@throw [OFNoMemException newWithClass: [self class]
andSize: memchunks_size];
__memchunks = memchunks;
__memchunks[__memchunks_size] = ptr;
__memchunks_size = memchunks_size;
return ptr;
}
- (void*)getMemWithSize: (size_t)size
{
void *ptr, **memchunks;
size_t memchunks_size;
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#import "config.h"
#import <stdlib.h>
#import <string.h>
#import <limits.h>
#import "OFObject.h"
#import "OFAutoreleasePool.h"
#import "OFExceptions.h"
#import "OFMacros.h"
@implementation OFObject
- init
{
if ((self = [super init]) != nil) {
__memchunks = NULL;
__memchunks_size = 0;
__retain_count = 1;
}
return self;
}
- free
{
void **iter = __memchunks + __memchunks_size;
while (iter-- > __memchunks)
free(*iter);
if (__memchunks != NULL)
free(__memchunks);
return [super free];
}
- retain
{
__retain_count++;
return self;
}
- release
{
if (!--__retain_count)
return [self free];
return self;
}
- autorelease
{
[OFAutoreleasePool addToPool: self];
return self;
}
- addToMemoryPool: (void*)ptr
{
void **memchunks;
size_t memchunks_size;
memchunks_size = __memchunks_size + 1;
if (SIZE_MAX - __memchunks_size < 1 ||
memchunks_size > SIZE_MAX / sizeof(void*))
@throw [OFOutOfRangeException newWithClass: [self class]];
if ((memchunks = realloc(__memchunks,
memchunks_size * sizeof(void*))) == NULL)
@throw [OFNoMemException newWithClass: [self class]
andSize: memchunks_size];
__memchunks = memchunks;
__memchunks[__memchunks_size] = ptr;
__memchunks_size = memchunks_size;
return self;
}
- (void*)getMemWithSize: (size_t)size
{
void *ptr, **memchunks;
size_t memchunks_size;
|