Index: runtime/bin/eventhandler.h |
diff --git a/runtime/bin/eventhandler.h b/runtime/bin/eventhandler.h |
index ab5b590b65112c7cb28643df413ff7be28d3aae1..44b5ec834b137a8d2466f3e9a61a7c70152a3f45 100644 |
--- a/runtime/bin/eventhandler.h |
+++ b/runtime/bin/eventhandler.h |
@@ -132,6 +132,8 @@ class CircularLinkedList { |
public: |
CircularLinkedList() : head_(NULL) {} |
+ typedef void (*ClearFun) (void* value); |
+ |
// Returns true if the list was empty. |
bool Add(T t) { |
Entry* e = new Entry(t); |
@@ -151,7 +153,7 @@ class CircularLinkedList { |
} |
} |
- void RemoveHead() { |
+ void RemoveHead(ClearFun clear = NULL) { |
ASSERT(head_ != NULL); |
Entry* e = head_; |
@@ -162,6 +164,9 @@ class CircularLinkedList { |
e->next_->prev_ = e->prev_; |
head_ = e->next_; |
} |
+ if (clear != NULL) { |
+ clear(reinterpret_cast<void*>(e->t)); |
+ } |
delete e; |
} |
@@ -195,9 +200,9 @@ class CircularLinkedList { |
} |
} |
- void RemoveAll() { |
+ void RemoveAll(ClearFun clear = NULL) { |
while (HasHead()) { |
- RemoveHead(); |
+ RemoveHead(clear); |
} |
} |
@@ -413,7 +418,9 @@ class DescriptorInfoMultipleMixin : public DI { |
: DI(fd), tokens_map_(&SamePortValue, kTokenCount), |
disable_tokens_(disable_tokens) {} |
- virtual ~DescriptorInfoMultipleMixin() {} |
+ virtual ~DescriptorInfoMultipleMixin() { |
+ RemoveAllPorts(); |
+ } |
virtual bool IsListeningSocket() const { return true; } |
@@ -497,14 +504,16 @@ class DescriptorInfoMultipleMixin : public DI { |
} |
virtual void RemoveAllPorts() { |
- active_readers_.RemoveAll(); |
for (HashMap::Entry *entry = tokens_map_.Start(); |
entry != NULL; |
entry = tokens_map_.Next(entry)) { |
PortEntry* pentry = reinterpret_cast<PortEntry*>(entry->value); |
+ entry->value = NULL; |
+ active_readers_.Remove(pentry); |
delete pentry; |
} |
tokens_map_.Clear(); |
+ active_readers_.RemoveAll(DeletePortEntry); |
} |
virtual Dart_Port NextNotifyDartPort(intptr_t events_ready) { |
@@ -585,6 +594,11 @@ class DescriptorInfoMultipleMixin : public DI { |
} |
private: |
+ static void DeletePortEntry(void* data) { |
+ PortEntry* entry = reinterpret_cast<PortEntry*>(data); |
+ delete entry; |
+ } |
+ |
// The [Dart_Port]s which are not paused (i.e. are interested in read events, |
// i.e. `mask == (1 << kInEvent)`) and we have enough tokens to communicate |
// with them. |