aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/core/framework/reader_op_kernel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/core/framework/reader_op_kernel.cc')
-rw-r--r--tensorflow/core/framework/reader_op_kernel.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/tensorflow/core/framework/reader_op_kernel.cc b/tensorflow/core/framework/reader_op_kernel.cc
new file mode 100644
index 0000000000..719f27d94b
--- /dev/null
+++ b/tensorflow/core/framework/reader_op_kernel.cc
@@ -0,0 +1,39 @@
+#include "tensorflow/core/framework/reader_op_kernel.h"
+
+namespace tensorflow {
+
+ReaderOpKernel::ReaderOpKernel(OpKernelConstruction* context)
+ : OpKernel(context), have_handle_(false) {
+ OP_REQUIRES_OK(context, context->allocate_persistent(
+ tensorflow::DT_STRING,
+ tensorflow::TensorShape({2}), &handle_, nullptr));
+}
+
+ReaderOpKernel::~ReaderOpKernel() {
+ if (have_handle_ && cinfo_.resource_is_private_to_kernel()) {
+ TF_CHECK_OK(cinfo_.resource_manager()->Delete<ReaderInterface>(
+ cinfo_.container(), cinfo_.name()));
+ }
+}
+
+void ReaderOpKernel::Compute(OpKernelContext* ctx) {
+ mutex_lock l(mu_);
+ if (!have_handle_) {
+ OP_REQUIRES_OK(ctx, cinfo_.Init(ctx->resource_manager(), def(), false));
+ ReaderInterface* reader;
+ OP_REQUIRES_OK(ctx,
+ cinfo_.resource_manager()->LookupOrCreate<ReaderInterface>(
+ cinfo_.container(), cinfo_.name(), &reader,
+ [this](ReaderInterface** ret) {
+ *ret = factory_();
+ return Status::OK();
+ }));
+ auto h = handle_.AccessTensor(ctx)->flat<string>();
+ h(0) = cinfo_.container();
+ h(1) = cinfo_.name();
+ have_handle_ = true;
+ }
+ ctx->set_output_ref(0, &mu_, handle_.AccessTensor(ctx));
+}
+
+} // namespace tensorflow