OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkTemplatesPriv_DEFINED | 10 #ifndef SkTemplatesPriv_DEFINED |
11 #define SkTemplatesPriv_DEFINED | 11 #define SkTemplatesPriv_DEFINED |
12 | 12 |
13 #include "SkTemplates.h" | 13 #include "SkTemplates.h" |
14 | 14 |
15 //////////////////////////////////////////////////////////////////////////////// | 15 //////////////////////////////////////////////////////////////////////////////// |
16 | 16 |
17 #ifdef SK_BUILD_FOR_WIN32 | 17 #ifdef SK_BUILD_FOR_WIN32 |
bungeman-skia
2014/02/11 17:06:21
This seems to be an anachronism. I see no indicati
| |
18 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ | 18 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ |
19 result = SkNEW(classname) | 19 result = SkNEW(classname) |
20 | 20 |
21 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args) \ | 21 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args) \ |
22 result = SkNEW_ARGS(classname, args) | 22 result = SkNEW_ARGS(classname, args) |
23 | |
24 #define SK_PLACEMENT_SAFE_NEW(result, classname, storage, storageSize) \ | |
25 result = SkNEW(classname) | |
scroggo
2014/02/11 15:51:29
Yikes! This will result in a memory leak if the ca
Dominik Grewe
2014/02/11 16:04:31
I guess the same is true for the normal placement
scroggo
2014/02/11 16:14:26
Well, this one is actually safer than the normal p
| |
26 | |
27 #define SK_PLACEMENT_SAFE_NEW_ARGS(result, classname, storage, storageSize, args) \ | |
28 result = SkNEW_ARGS(classname, args) | |
23 #else | 29 #else |
24 #include <new> | 30 #include <new> |
25 #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ | 31 #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ |
bungeman-skia
2014/02/11 17:06:21
Every current user of this does the same dance whe
| |
26 do { \ | 32 do { \ |
27 if (storagesize) \ | 33 if (storagesize) \ |
28 { \ | 34 { \ |
29 SkASSERT(storageSize >= sizeof(classname)); \ | 35 SkASSERT(storageSize >= sizeof(classname)); \ |
30 result = new(storage) classname; \ | 36 result = new(storage) classname; \ |
31 } \ | 37 } \ |
32 else \ | 38 else \ |
33 result = SkNEW(classname); \ | 39 result = SkNEW(classname); \ |
34 } while (0) | 40 } while (0) |
35 | 41 |
36 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args) \ | 42 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args) \ |
37 do { \ | 43 do { \ |
38 if (storagesize) \ | 44 if (storagesize) \ |
39 { \ | 45 { \ |
40 SkASSERT(storageSize >= sizeof(classname)); \ | 46 SkASSERT(storageSize >= sizeof(classname)); \ |
41 result = new(storage) classname args; \ | 47 result = new(storage) classname args; \ |
42 } \ | 48 } \ |
43 else \ | 49 else \ |
44 result = SkNEW_ARGS(classname, args); \ | 50 result = SkNEW_ARGS(classname, args); \ |
45 } while (0) | 51 } while (0) |
52 | |
53 #define SK_PLACEMENT_SAFE_NEW(result, classname, storage, storagesize) \ | |
bungeman-skia
2014/02/11 17:06:21
Why are we multiplying entities without necessity
| |
54 do { \ | |
55 if (storagesize >= sizeof(classname)) \ | |
56 result = new(storage) classname; \ | |
57 else \ | |
58 result = SkNEW(classname); \ | |
59 } while (0) | |
60 | |
61 #define SK_PLACEMENT_SAFE_NEW_ARGS(result, classname, storage, storagesize, args) \ | |
62 do { \ | |
63 if (storagesize >= sizeof(classname)) \ | |
64 result = new(storage) classname args; \ | |
65 else \ | |
66 result = SkNEW_ARGS(classname, args); \ | |
67 } while (0) | |
46 #endif | 68 #endif |
47 | 69 |
48 //////////////////////////////////////////////////////////////////////////////// | 70 //////////////////////////////////////////////////////////////////////////////// |
49 | 71 |
50 template <class T> class SkAutoTPlacementDelete { | 72 template <class T> class SkAutoTPlacementDelete { |
51 public: | 73 public: |
52 SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) | 74 SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) |
53 { | 75 { |
54 } | 76 } |
55 ~SkAutoTPlacementDelete() | 77 ~SkAutoTPlacementDelete() |
(...skipping 11 matching lines...) Expand all Loading... | |
67 T* obj = fObj; | 89 T* obj = fObj; |
68 fObj = NULL; | 90 fObj = NULL; |
69 return obj; | 91 return obj; |
70 } | 92 } |
71 private: | 93 private: |
72 T* fObj; | 94 T* fObj; |
73 void* fStorage; | 95 void* fStorage; |
74 }; | 96 }; |
75 | 97 |
76 #endif | 98 #endif |
OLD | NEW |