From 4648337f9ea1ca4f1262bd028fe35503ef1849a2 Mon Sep 17 00:00:00 2001 From: EKR Date: Mon, 4 Mar 2013 08:51:48 -0800 Subject: [PATCH] Assert on WrapRunnableRet with NS_DISPATCH_NORMAL Bug 847439. Assert on WrapRunnableRet with NS_DISPATCH_NORMAL. r=derf,jesup --- media/mtransport/runnable_utils.h | 11 +++++++- media/mtransport/runnable_utils.py | 1 + media/mtransport/runnable_utils_generated.h | 30 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/media/mtransport/runnable_utils.h b/media/mtransport/runnable_utils.h index b63f6f32fb74..dae107923d54 100644 --- a/media/mtransport/runnable_utils.h +++ b/media/mtransport/runnable_utils.h @@ -18,9 +18,9 @@ namespace mozilla { class runnable_args_base : public nsRunnable { public: NS_IMETHOD Run() = 0; + virtual bool returns_value() const { return false; } }; - // The generated file contains four major function templates // (in variants for arbitrary numbers of arguments up to 10, // which is why it is machine generated). The four templates @@ -54,6 +54,15 @@ static inline nsresult RUN_ON_THREAD(nsIEventTarget *thread, nsIRunnable *runnab return runnable_ref->Run(); } +static inline nsresult RUN_ON_THREAD(nsIEventTarget *thread, runnable_args_base *runnable, uint32_t flags) { + // Detect attempts to return a value when in async mode, since this + // most likely means someone is trying to assign to a heap variable + // which is now out of scope. + MOZ_ASSERT((!(runnable->returns_value()) || (flags != NS_DISPATCH_NORMAL))); + + return RUN_ON_THREAD(thread, static_cast(runnable), flags); +} + #ifdef MOZ_DEBUG #define ASSERT_ON_THREAD(t) do { \ if (t) { \ diff --git a/media/mtransport/runnable_utils.py b/media/mtransport/runnable_utils.py index 2934445bfd92..5680be453921 100644 --- a/media/mtransport/runnable_utils.py +++ b/media/mtransport/runnable_utils.py @@ -89,6 +89,7 @@ def generate_class_template(args, ret = False, member = True): else: print " runnable_args_%s_%d_ret("%(nm, args) + gen_args_type(args, member) + ", R *r) :" print " " + gen_init(args, True, member) + " {}" + print " virtual bool returns_value() const { return true; }" print print " NS_IMETHOD Run() {" if ret: diff --git a/media/mtransport/runnable_utils_generated.h b/media/mtransport/runnable_utils_generated.h index 195cf16c45b2..544ba4b03847 100644 --- a/media/mtransport/runnable_utils_generated.h +++ b/media/mtransport/runnable_utils_generated.h @@ -25,6 +25,7 @@ template class runnable_args_nm_0_ret : public runnable_ public: runnable_args_nm_0_ret(M m, R *r) : m_(m), r_(r) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = m_(); @@ -61,6 +62,7 @@ template class runnable_args_m_0_ret : publi public: runnable_args_m_0_ret(C o, M m, R *r) : o_(o), m_(m), r_(r) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = ((*o_).*m_)(); @@ -98,6 +100,7 @@ template class runnable_args_nm_1_ret : pub public: runnable_args_nm_1_ret(M m, A0 a0, R *r) : m_(m), r_(r), a0_(a0) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = m_(a0_); @@ -136,6 +139,7 @@ template class runnable_args_m_ public: runnable_args_m_1_ret(C o, M m, A0 a0, R *r) : o_(o), m_(m), r_(r), a0_(a0) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = ((*o_).*m_)(a0_); @@ -175,6 +179,7 @@ template class runnable_args_n public: runnable_args_nm_2_ret(M m, A0 a0, A1 a1, R *r) : m_(m), r_(r), a0_(a0), a1_(a1) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = m_(a0_, a1_); @@ -215,6 +220,7 @@ template class run public: runnable_args_m_2_ret(C o, M m, A0 a0, A1 a1, R *r) : o_(o), m_(m), r_(r), a0_(a0), a1_(a1) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = ((*o_).*m_)(a0_, a1_); @@ -256,6 +262,7 @@ template class ru public: runnable_args_nm_3_ret(M m, A0 a0, A1 a1, A2 a2, R *r) : m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2) {} + virtual bool returns_value() const { return true; } NS_IMETHOD Run() { *r_ = m_(a0_, a1_, a2_); @@ -298,6 +305,7 @@ template