if (delayed && !destroyPending_) {
return;
}
+ destroyPending_ = false;
delete this;
};
}
private:
/**
* destroyPending_ is set to true if destoy() is called while guardCount_ is
- * non-zero.
+ * non-zero. It is set to false before the object is deleted.
*
* If destroyPending_ is true, the object will be destroyed the next time
* guardCount_ drops to 0.
--- /dev/null
+/*
+ * Copyright 2015 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <folly/io/async/DelayedDestruction.h>
+
+#include <gtest/gtest.h>
+
+using namespace folly;
+
+class DeleteGuarder : public DelayedDestruction {
+
+ ~DeleteGuarder() {
+ doFoo();
+ }
+
+ void doFoo() {
+ DelayedDestructionBase::DestructorGuard dg(this);
+ LOG(INFO) << "foo";
+ }
+};
+
+TEST(DelayedDestructionTest, GuardOnDelete) {
+ auto dg = new DeleteGuarder();
+ dg->destroy();
+}
+
+TEST(DelayedDestructionTest, GuardOnDeleteWithPreGuard) {
+ auto dg = new DeleteGuarder();
+ DelayedDestructionBase::DestructorGuard guard(dg);
+ dg->destroy();
+}