Caffe2 - C++ API
A deep learning, cross platform ML framework
temp_file.h
1 #pragma once
2 
3 #include <ATen/ATen.h>
4 #include <torch/csrc/WindowsTorchApiMacro.h>
5 #include <c10/util/Exception.h>
6 #include <torch/csrc/utils/disallow_copy.h>
7 
8 #include <unistd.h>
9 
10 #include <string>
11 #include <vector>
12 
13 namespace torch {
14 namespace jit {
15 namespace fuser {
16 namespace cpu {
17 
18 struct TempFile {
19  TH_DISALLOW_COPY_AND_ASSIGN(TempFile);
20 
21  TempFile(const std::string& t, int suffix) {
22  // mkstemps edits its first argument in places
23  // so we make a copy of the string here, including null terminator
24  std::vector<char> tt(t.c_str(), t.c_str() + t.size() + 1);
25  int fd = mkstemps(tt.data(), suffix);
26  AT_ASSERT(fd != -1);
27  file_ = fdopen(fd, "r+");
28 
29  // - 1 becuase tt.size() includes the null terminator,
30  // but std::string does not expect one
31  name_ = std::string(tt.begin(), tt.end() - 1);
32  }
33 
34  const std::string& name() const {
35  return name_;
36  }
37 
38  void sync() {
39  fflush(file_);
40  }
41 
42  void write(const std::string& str) {
43  size_t result = fwrite(str.c_str(), 1, str.size(), file_);
44  AT_ASSERT(str.size() == result);
45  }
46 
47  FILE* file() {
48  return file_;
49  }
50 
51  ~TempFile() {
52  if (file_ != nullptr) {
53  // unlink first to ensure another mkstemps doesn't
54  // race between close and unlink
55  unlink(name_.c_str());
56  fclose(file_);
57  }
58  }
59 
60  private:
61  FILE* file_ = nullptr;
62  std::string name_;
63 };
64 
65 } // namespace cpu
66 } // namespace fuser
67 } // namespace jit
68 } // namespace torch
Definition: jit_type.h:17