diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-11-05 12:22:58 -0800 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-11-05 12:22:58 -0800 |
| commit | 8ef4edebbfeead53e5b2b454086e21e42e809aab (patch) | |
| tree | 83ee9e9c362dd31f4225e99a67f52d9538d3ae6e /node/SharedPtr.hpp | |
| parent | a95ff21aafa793e5282f32b77b893da3f42a4a57 (diff) | |
| download | infinitytier-8ef4edebbfeead53e5b2b454086e21e42e809aab.tar.gz infinitytier-8ef4edebbfeead53e5b2b454086e21e42e809aab.zip | |
Deferred decode for HELLO to prevent HELLOcalypse under high load of new peers.
Diffstat (limited to 'node/SharedPtr.hpp')
| -rw-r--r-- | node/SharedPtr.hpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/node/SharedPtr.hpp b/node/SharedPtr.hpp index 4ecfa818..289c499f 100644 --- a/node/SharedPtr.hpp +++ b/node/SharedPtr.hpp @@ -64,20 +64,6 @@ public: ++obj->__refCount; } - SharedPtr(T *obj,bool runAwayFromZombies) - throw() : - _ptr(obj) - { - // HACK: this is used in "handlers" to take ownership of naked pointers, - // an ugly pattern that really ought to be factored out. - if (runAwayFromZombies) { - if ((int)(++obj->__refCount) < 2) { - --obj->__refCount; - _ptr = (T *)0; - } - } else ++obj->__refCount; - } - SharedPtr(const SharedPtr &sp) throw() : _ptr(sp._getAndInc()) @@ -105,6 +91,25 @@ public: return *this; } + /** + * Set to a naked pointer and increment its reference count + * + * This assumes this SharedPtr is NULL and that ptr is not a 'zombie.' No + * checks are performed. + * + * @param ptr Naked pointer to assign + */ + inline void setToUnsafe(T *ptr) + { + ++ptr->__refCount; + _ptr = ptr; + } + + /** + * Swap with another pointer 'for free' without ref count overhead + * + * @param with Pointer to swap with + */ inline void swap(SharedPtr &with) throw() { |
