From 2d1453c46dfb8340fd646ab63666ffa9c81adf77 Mon Sep 17 00:00:00 2001 From: Robert Nishihara Date: Tue, 19 Apr 2016 10:54:16 -0700 Subject: [PATCH] fixed reference counting bug (#44) --- src/orchpylib.cc | 3 +++ src/scheduler.cc | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/orchpylib.cc b/src/orchpylib.cc index ad6b1f461..ee47c65ab 100644 --- a/src/orchpylib.cc +++ b/src/orchpylib.cc @@ -564,10 +564,13 @@ PyObject* deserialize_call(PyObject* self, PyObject* args) { worker->decrement_reference_count(objrefs); } int resultsize = call->result_size(); + std::vector result_objrefs; PyObject* resultlist = PyList_New(resultsize); for (int i = 0; i < resultsize; ++i) { PyList_SetItem(resultlist, i, make_pyobjref(worker_capsule, call->result(i))); + result_objrefs.push_back(call->result(i)); } + worker->decrement_reference_count(result_objrefs); // The corresponding increment is done in RemoteCall in the scheduler. PyObject* t = PyTuple_New(3); // We set the items of the tuple using PyTuple_SetItem, because that transfers ownership to the tuple. PyTuple_SetItem(t, 0, string); PyTuple_SetItem(t, 1, arglist); diff --git a/src/scheduler.cc b/src/scheduler.cc index 9babe9f67..9925861ce 100644 --- a/src/scheduler.cc +++ b/src/scheduler.cc @@ -16,11 +16,14 @@ Status SchedulerService::RemoteCall(ServerContext* context, const RemoteCallRequ size_t num_return_vals = fntable_[task->name()].num_return_vals(); fntable_lock_.unlock(); + std::vector result_objrefs; for (size_t i = 0; i < num_return_vals; ++i) { ObjRef result = register_new_object(); reply->add_result(result); task->add_result(result); + result_objrefs.push_back(result); } + increment_ref_count(result_objrefs); // The corresponding decrement will happen in deserialize_call in orchpylib. task_queue_lock_.lock(); task_queue_.emplace_back(std::move(task));