1*b6fb3261SAndroid Build Coastguard Worker /* Copyright 2018 The TensorFlow Authors. All Rights Reserved.
2*b6fb3261SAndroid Build Coastguard Worker
3*b6fb3261SAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
4*b6fb3261SAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
5*b6fb3261SAndroid Build Coastguard Worker You may obtain a copy of the License at
6*b6fb3261SAndroid Build Coastguard Worker
7*b6fb3261SAndroid Build Coastguard Worker http://www.apache.org/licenses/LICENSE-2.0
8*b6fb3261SAndroid Build Coastguard Worker
9*b6fb3261SAndroid Build Coastguard Worker Unless required by applicable law or agreed to in writing, software
10*b6fb3261SAndroid Build Coastguard Worker distributed under the License is distributed on an "AS IS" BASIS,
11*b6fb3261SAndroid Build Coastguard Worker WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*b6fb3261SAndroid Build Coastguard Worker See the License for the specific language governing permissions and
13*b6fb3261SAndroid Build Coastguard Worker limitations under the License.
14*b6fb3261SAndroid Build Coastguard Worker ==============================================================================*/
15*b6fb3261SAndroid Build Coastguard Worker
16*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/c/env.h"
17*b6fb3261SAndroid Build Coastguard Worker
18*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/c/c_api_macros.h"
19*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/c/tf_status.h"
20*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/c/tf_status_helper.h"
21*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/core/platform/env.h"
22*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/core/platform/path.h"
23*b6fb3261SAndroid Build Coastguard Worker #include "tensorflow/core/platform/types.h"
24*b6fb3261SAndroid Build Coastguard Worker
25*b6fb3261SAndroid Build Coastguard Worker struct TF_StringStream {
26*b6fb3261SAndroid Build Coastguard Worker std::vector<::tensorflow::string>* list;
27*b6fb3261SAndroid Build Coastguard Worker size_t position;
28*b6fb3261SAndroid Build Coastguard Worker };
29*b6fb3261SAndroid Build Coastguard Worker
TF_CreateDir(const char * dirname,TF_Status * status)30*b6fb3261SAndroid Build Coastguard Worker void TF_CreateDir(const char* dirname, TF_Status* status) {
31*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
32*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
33*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->CreateDir(dirname));
34*b6fb3261SAndroid Build Coastguard Worker }
35*b6fb3261SAndroid Build Coastguard Worker
TF_DeleteDir(const char * dirname,TF_Status * status)36*b6fb3261SAndroid Build Coastguard Worker void TF_DeleteDir(const char* dirname, TF_Status* status) {
37*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
38*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
39*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->DeleteDir(dirname));
40*b6fb3261SAndroid Build Coastguard Worker }
41*b6fb3261SAndroid Build Coastguard Worker
TF_DeleteRecursively(const char * dirname,int64_t * undeleted_file_count,int64_t * undeleted_dir_count,TF_Status * status)42*b6fb3261SAndroid Build Coastguard Worker void TF_DeleteRecursively(const char* dirname, int64_t* undeleted_file_count,
43*b6fb3261SAndroid Build Coastguard Worker int64_t* undeleted_dir_count, TF_Status* status) {
44*b6fb3261SAndroid Build Coastguard Worker ::int64_t f, d;
45*b6fb3261SAndroid Build Coastguard Worker
46*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
47*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
48*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->DeleteRecursively(dirname, &f, &d));
49*b6fb3261SAndroid Build Coastguard Worker *undeleted_file_count = f;
50*b6fb3261SAndroid Build Coastguard Worker *undeleted_dir_count = d;
51*b6fb3261SAndroid Build Coastguard Worker }
52*b6fb3261SAndroid Build Coastguard Worker
TF_FileStat(const char * filename,TF_FileStatistics * stats,TF_Status * status)53*b6fb3261SAndroid Build Coastguard Worker void TF_FileStat(const char* filename, TF_FileStatistics* stats,
54*b6fb3261SAndroid Build Coastguard Worker TF_Status* status) {
55*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::FileStatistics cc_stats;
56*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
57*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Status s =
58*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Env::Default()->Stat(filename, &cc_stats);
59*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(status, s);
60*b6fb3261SAndroid Build Coastguard Worker if (s.ok()) {
61*b6fb3261SAndroid Build Coastguard Worker stats->length = cc_stats.length;
62*b6fb3261SAndroid Build Coastguard Worker stats->mtime_nsec = cc_stats.mtime_nsec;
63*b6fb3261SAndroid Build Coastguard Worker stats->is_directory = cc_stats.is_directory;
64*b6fb3261SAndroid Build Coastguard Worker }
65*b6fb3261SAndroid Build Coastguard Worker }
66*b6fb3261SAndroid Build Coastguard Worker
TF_NewWritableFile(const char * filename,TF_WritableFileHandle ** handle,TF_Status * status)67*b6fb3261SAndroid Build Coastguard Worker void TF_NewWritableFile(const char* filename, TF_WritableFileHandle** handle,
68*b6fb3261SAndroid Build Coastguard Worker TF_Status* status) {
69*b6fb3261SAndroid Build Coastguard Worker std::unique_ptr<::tensorflow::WritableFile> f;
70*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
71*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Status s =
72*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Env::Default()->NewWritableFile(filename, &f);
73*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(status, s);
74*b6fb3261SAndroid Build Coastguard Worker
75*b6fb3261SAndroid Build Coastguard Worker if (s.ok()) {
76*b6fb3261SAndroid Build Coastguard Worker *handle = reinterpret_cast<TF_WritableFileHandle*>(f.release());
77*b6fb3261SAndroid Build Coastguard Worker }
78*b6fb3261SAndroid Build Coastguard Worker }
79*b6fb3261SAndroid Build Coastguard Worker
TF_CloseWritableFile(TF_WritableFileHandle * handle,TF_Status * status)80*b6fb3261SAndroid Build Coastguard Worker void TF_CloseWritableFile(TF_WritableFileHandle* handle, TF_Status* status) {
81*b6fb3261SAndroid Build Coastguard Worker auto* cc_file = reinterpret_cast<::tensorflow::WritableFile*>(handle);
82*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
83*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(status, cc_file->Close());
84*b6fb3261SAndroid Build Coastguard Worker delete cc_file;
85*b6fb3261SAndroid Build Coastguard Worker }
86*b6fb3261SAndroid Build Coastguard Worker
TF_SyncWritableFile(TF_WritableFileHandle * handle,TF_Status * status)87*b6fb3261SAndroid Build Coastguard Worker void TF_SyncWritableFile(TF_WritableFileHandle* handle, TF_Status* status) {
88*b6fb3261SAndroid Build Coastguard Worker auto* cc_file = reinterpret_cast<::tensorflow::WritableFile*>(handle);
89*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
90*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(status, cc_file->Sync());
91*b6fb3261SAndroid Build Coastguard Worker }
92*b6fb3261SAndroid Build Coastguard Worker
TF_FlushWritableFile(TF_WritableFileHandle * handle,TF_Status * status)93*b6fb3261SAndroid Build Coastguard Worker void TF_FlushWritableFile(TF_WritableFileHandle* handle, TF_Status* status) {
94*b6fb3261SAndroid Build Coastguard Worker auto* cc_file = reinterpret_cast<::tensorflow::WritableFile*>(handle);
95*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
96*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(status, cc_file->Flush());
97*b6fb3261SAndroid Build Coastguard Worker }
98*b6fb3261SAndroid Build Coastguard Worker
TF_AppendWritableFile(TF_WritableFileHandle * handle,const char * data,size_t length,TF_Status * status)99*b6fb3261SAndroid Build Coastguard Worker void TF_AppendWritableFile(TF_WritableFileHandle* handle, const char* data,
100*b6fb3261SAndroid Build Coastguard Worker size_t length, TF_Status* status) {
101*b6fb3261SAndroid Build Coastguard Worker auto* cc_file = reinterpret_cast<::tensorflow::WritableFile*>(handle);
102*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
103*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
104*b6fb3261SAndroid Build Coastguard Worker status, cc_file->Append(::tensorflow::StringPiece{data, length}));
105*b6fb3261SAndroid Build Coastguard Worker }
106*b6fb3261SAndroid Build Coastguard Worker
TF_DeleteFile(const char * filename,TF_Status * status)107*b6fb3261SAndroid Build Coastguard Worker void TF_DeleteFile(const char* filename, TF_Status* status) {
108*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
109*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
110*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->DeleteFile(filename));
111*b6fb3261SAndroid Build Coastguard Worker }
112*b6fb3261SAndroid Build Coastguard Worker
TF_StringStreamNext(TF_StringStream * list,const char ** result)113*b6fb3261SAndroid Build Coastguard Worker bool TF_StringStreamNext(TF_StringStream* list, const char** result) {
114*b6fb3261SAndroid Build Coastguard Worker if (list->position >= list->list->size()) {
115*b6fb3261SAndroid Build Coastguard Worker *result = nullptr;
116*b6fb3261SAndroid Build Coastguard Worker return false;
117*b6fb3261SAndroid Build Coastguard Worker }
118*b6fb3261SAndroid Build Coastguard Worker
119*b6fb3261SAndroid Build Coastguard Worker *result = list->list->at(list->position++).c_str();
120*b6fb3261SAndroid Build Coastguard Worker return true;
121*b6fb3261SAndroid Build Coastguard Worker }
122*b6fb3261SAndroid Build Coastguard Worker
TF_StringStreamDone(TF_StringStream * list)123*b6fb3261SAndroid Build Coastguard Worker void TF_StringStreamDone(TF_StringStream* list) {
124*b6fb3261SAndroid Build Coastguard Worker delete list->list;
125*b6fb3261SAndroid Build Coastguard Worker delete list;
126*b6fb3261SAndroid Build Coastguard Worker }
TF_GetChildren(const char * dirname,TF_Status * status)127*b6fb3261SAndroid Build Coastguard Worker TF_StringStream* TF_GetChildren(const char* dirname, TF_Status* status) {
128*b6fb3261SAndroid Build Coastguard Worker auto* children = new std::vector<::tensorflow::string>;
129*b6fb3261SAndroid Build Coastguard Worker
130*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
131*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
132*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->GetChildren(dirname, children));
133*b6fb3261SAndroid Build Coastguard Worker
134*b6fb3261SAndroid Build Coastguard Worker auto* list = new TF_StringStream;
135*b6fb3261SAndroid Build Coastguard Worker list->list = children;
136*b6fb3261SAndroid Build Coastguard Worker list->position = 0;
137*b6fb3261SAndroid Build Coastguard Worker return list;
138*b6fb3261SAndroid Build Coastguard Worker }
139*b6fb3261SAndroid Build Coastguard Worker
TF_GetLocalTempDirectories()140*b6fb3261SAndroid Build Coastguard Worker TF_StringStream* TF_GetLocalTempDirectories() {
141*b6fb3261SAndroid Build Coastguard Worker auto* tmpdirs = new std::vector<::tensorflow::string>;
142*b6fb3261SAndroid Build Coastguard Worker
143*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Env::Default()->GetLocalTempDirectories(tmpdirs);
144*b6fb3261SAndroid Build Coastguard Worker
145*b6fb3261SAndroid Build Coastguard Worker auto* list = new TF_StringStream;
146*b6fb3261SAndroid Build Coastguard Worker list->list = tmpdirs;
147*b6fb3261SAndroid Build Coastguard Worker list->position = 0;
148*b6fb3261SAndroid Build Coastguard Worker return list;
149*b6fb3261SAndroid Build Coastguard Worker }
150*b6fb3261SAndroid Build Coastguard Worker
TF_GetTempFileName(const char * extension)151*b6fb3261SAndroid Build Coastguard Worker char* TF_GetTempFileName(const char* extension) {
152*b6fb3261SAndroid Build Coastguard Worker return strdup(::tensorflow::io::GetTempFilename(extension).c_str());
153*b6fb3261SAndroid Build Coastguard Worker }
154*b6fb3261SAndroid Build Coastguard Worker
TF_NowNanos(void)155*b6fb3261SAndroid Build Coastguard Worker TF_CAPI_EXPORT extern uint64_t TF_NowNanos(void) {
156*b6fb3261SAndroid Build Coastguard Worker return ::tensorflow::Env::Default()->NowNanos();
157*b6fb3261SAndroid Build Coastguard Worker }
158*b6fb3261SAndroid Build Coastguard Worker
159*b6fb3261SAndroid Build Coastguard Worker // Returns the number of microseconds since the Unix epoch.
TF_NowMicros(void)160*b6fb3261SAndroid Build Coastguard Worker TF_CAPI_EXPORT extern uint64_t TF_NowMicros(void) {
161*b6fb3261SAndroid Build Coastguard Worker return ::tensorflow::Env::Default()->NowMicros();
162*b6fb3261SAndroid Build Coastguard Worker }
163*b6fb3261SAndroid Build Coastguard Worker
164*b6fb3261SAndroid Build Coastguard Worker // Returns the number of seconds since the Unix epoch.
TF_NowSeconds(void)165*b6fb3261SAndroid Build Coastguard Worker TF_CAPI_EXPORT extern uint64_t TF_NowSeconds(void) {
166*b6fb3261SAndroid Build Coastguard Worker return ::tensorflow::Env::Default()->NowSeconds();
167*b6fb3261SAndroid Build Coastguard Worker }
168*b6fb3261SAndroid Build Coastguard Worker
TF_DefaultThreadOptions(TF_ThreadOptions * options)169*b6fb3261SAndroid Build Coastguard Worker void TF_DefaultThreadOptions(TF_ThreadOptions* options) {
170*b6fb3261SAndroid Build Coastguard Worker options->stack_size = 0;
171*b6fb3261SAndroid Build Coastguard Worker options->guard_size = 0;
172*b6fb3261SAndroid Build Coastguard Worker options->numa_node = -1;
173*b6fb3261SAndroid Build Coastguard Worker }
174*b6fb3261SAndroid Build Coastguard Worker
TF_StartThread(const TF_ThreadOptions * options,const char * thread_name,void (* work_func)(void *),void * param)175*b6fb3261SAndroid Build Coastguard Worker TF_Thread* TF_StartThread(const TF_ThreadOptions* options,
176*b6fb3261SAndroid Build Coastguard Worker const char* thread_name, void (*work_func)(void*),
177*b6fb3261SAndroid Build Coastguard Worker void* param) {
178*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::ThreadOptions cc_options;
179*b6fb3261SAndroid Build Coastguard Worker cc_options.stack_size = options->stack_size;
180*b6fb3261SAndroid Build Coastguard Worker cc_options.guard_size = options->guard_size;
181*b6fb3261SAndroid Build Coastguard Worker cc_options.numa_node = options->numa_node;
182*b6fb3261SAndroid Build Coastguard Worker return reinterpret_cast<TF_Thread*>(::tensorflow::Env::Default()->StartThread(
183*b6fb3261SAndroid Build Coastguard Worker cc_options, thread_name, [=]() { (*work_func)(param); }));
184*b6fb3261SAndroid Build Coastguard Worker }
185*b6fb3261SAndroid Build Coastguard Worker
TF_JoinThread(TF_Thread * thread)186*b6fb3261SAndroid Build Coastguard Worker void TF_JoinThread(TF_Thread* thread) {
187*b6fb3261SAndroid Build Coastguard Worker // ::tensorflow::Thread joins on destruction
188*b6fb3261SAndroid Build Coastguard Worker delete reinterpret_cast<::tensorflow::Thread*>(thread);
189*b6fb3261SAndroid Build Coastguard Worker }
190*b6fb3261SAndroid Build Coastguard Worker
TF_LoadSharedLibrary(const char * library_filename,TF_Status * status)191*b6fb3261SAndroid Build Coastguard Worker void* TF_LoadSharedLibrary(const char* library_filename, TF_Status* status) {
192*b6fb3261SAndroid Build Coastguard Worker void* handle = nullptr;
193*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
194*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
195*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->LoadDynamicLibrary(library_filename,
196*b6fb3261SAndroid Build Coastguard Worker &handle));
197*b6fb3261SAndroid Build Coastguard Worker return handle;
198*b6fb3261SAndroid Build Coastguard Worker }
199*b6fb3261SAndroid Build Coastguard Worker
TF_GetSymbolFromLibrary(void * handle,const char * symbol_name,TF_Status * status)200*b6fb3261SAndroid Build Coastguard Worker void* TF_GetSymbolFromLibrary(void* handle, const char* symbol_name,
201*b6fb3261SAndroid Build Coastguard Worker TF_Status* status) {
202*b6fb3261SAndroid Build Coastguard Worker void* symbol = nullptr;
203*b6fb3261SAndroid Build Coastguard Worker TF_SetStatus(status, TF_OK, "");
204*b6fb3261SAndroid Build Coastguard Worker ::tensorflow::Set_TF_Status_from_Status(
205*b6fb3261SAndroid Build Coastguard Worker status, ::tensorflow::Env::Default()->GetSymbolFromLibrary(
206*b6fb3261SAndroid Build Coastguard Worker handle, symbol_name, &symbol));
207*b6fb3261SAndroid Build Coastguard Worker return symbol;
208*b6fb3261SAndroid Build Coastguard Worker }
209