Advertisement
Guest User

Untitled

a guest
Jun 2nd, 2012
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.89 KB | None | 0 0
  1. class ThreadUnsafeDeallocator {
  2. public:
  3. concurrent_queue<void*> to_free;
  4. void* alloc(int);
  5. };
  6. Concurrency::concurrent_queue<std::unique_ptr<ThreadUnsafeAllocator>> allocs;
  7.  
  8. struct ConcurrentDeallocator {
  9. ConcurrentDeallocator(ThreadSafeDeallocator* ptr)
  10. : from(ptr) {}
  11. ThreadUnsafeAllocator* from;
  12. void operator()(void* ptr) {
  13. from->to_free.push(ptr);
  14. }
  15. };
  16. std::unique_ptr<void, ConcurrentDeallocator> malloc(int) {
  17. std::unique_ptr<ThreadUnsafeAllocator> alloc;
  18. if(!allocs.try_pop(alloc)) {
  19. alloc = new ThreadUnsafeAllocator; // lock here
  20. } else {
  21. void* p;
  22. while(alloc->to_free.try_pop(p)) {
  23. alloc->free(p);
  24. }
  25. }
  26. auto p = alloc->alloc(size);
  27. allocs.push(std::move(alloc));
  28. return std::unique_ptr<void, ConurrentDeallocator>(p, ConcurrentDeallocator(alloc.get());
  29.  
  30. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement