Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / renderfarmfsclient.h
diff --git a/cinelerra-5.1/cinelerra/renderfarmfsclient.h b/cinelerra-5.1/cinelerra/renderfarmfsclient.h
new file mode 100644 (file)
index 0000000..b94415e
--- /dev/null
@@ -0,0 +1,118 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#ifndef RENDERFARMFSCLIENT_H
+#define RENDERFARMFSCLIENT_H
+
+#include "mutex.inc"
+#include "renderfarmclient.inc"
+#include "renderfarmfsclient.inc"
+
+
+// This should override the stdio commands and inderect operations on any file
+// starting with RENDERFARM_FS_PREFIX to the network.
+
+// The server runs on the master node.
+// The client runs on the client.
+
+// The traffic shares the same socket as the rest of the rendering traffic
+// so the server and client command loops have to give control to the 
+// VFS objects when they get a VFS command.
+
+// Only one RenderFarmClient can exist per image because the stdio operations 
+// don't allow pointers to local storage.  Fortunately only one
+// RenderFarmClient exists per image by default.  The RenderFarmClient just needs
+// to wait until it's forked before creating RenderFarmFSClient.
+// The RenderFarmClient is a mutual 
+// exclusion lock and table of file descriptors.  
+// It searches through the table to see if the file descriptor is virtual.
+// Then it translates a single stdio call at a time to and from 
+// network commands, complete with the original parameters and return values.
+
+// The RenderFarmFSServer takes one command from the network at a time and passes 
+// it directly to the stdio call.  If call has a buffer, the buffer is
+// created by the RenderFarmFSServer and streamed over the network.  
+// The return values are passed untouched back through the network.
+
+// FILE* and int on RenderFarmClient are meaningless.
+// They can't be dereferenced.
+// Unfortunately, nothing else in Cinelerra can override stdio now.
+
+// All the stdio functions are transferred in endian independant ways except
+// stat, stat64.
+
+extern RenderFarmFSClient *renderfarm_fs_global;
+
+class RenderFarmFSClient
+{
+public:
+       RenderFarmFSClient(RenderFarmClientThread *client);
+       ~RenderFarmFSClient();
+
+       void initialize();
+
+// Called by the overloaded C library functions.
+// There may be more.
+       FILE* fopen(const char *path, const char *mode);
+       int fclose(FILE *file);
+       int remove (__const char *__filename);
+       int rename (__const char *__old, __const char *__new);
+       int fgetc (FILE *__stream);
+       int fputc (int __c, FILE *__stream);
+       size_t fread (void *__restrict __ptr, size_t __size,
+                        size_t __n, FILE *__restrict __stream);
+       size_t fwrite (__const void *__restrict __ptr, size_t __size,
+                         size_t __n, FILE *__restrict __s);
+       int fseek (FILE *__stream, int64_t __off, int __whence);
+       int64_t ftell (FILE *__stream);
+       int stat64 (__const char *__restrict __file,
+                          struct stat64 *__restrict __buf);
+       int stat (__const char *__restrict __file,
+                        struct stat *__restrict __buf);
+       char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream);
+       int fileno(FILE *file);
+       int fscanf(FILE *__restrict stream, const char *__restrict format, va_list ap);
+
+// Locking order:
+// 1) RenderFarmFSClient
+// 2) RenderFarmClient
+       void lock();
+       void unlock();
+       int is_open(FILE *ptr);
+// The 64 bit argument is ignored in 64 bit architectures
+       void set_open(FILE *ptr, int64_t pointer);
+       void unset_open(FILE *ptr, int64_t pointer);
+// Used in place of Units::ptr_to_int64 in case the pointer is only 32 bits.
+       int64_t get_64(FILE *ptr);
+
+       Mutex *mutex_lock;
+       ArrayList<FILE*> files;
+// In 32 bit mode, this stores the 64 bit equivalents of the file handles.
+// The 64 bit values are ignored in 64 bit architectures
+       ArrayList<int64_t> pointers;
+       RenderFarmClientThread *client;
+};
+
+
+
+
+
+#endif