diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2022-04-19 00:34:07 +0100 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2022-04-19 00:34:07 +0100 | 
| commit | 9c434e791e3982386d601c5cf4c9407ec6841f79 (patch) | |
| tree | 2a5f5731a633b2716756df101b0d241b2b5c1cf6 | |
| parent | Move construct ReqEnv from mapper values (diff) | |
| download | netfs-9c434e791e3982386d601c5cf4c9407ec6841f79.tar.bz2 netfs-9c434e791e3982386d601c5cf4c9407ec6841f79.tar.xz netfs-9c434e791e3982386d601c5cf4c9407ec6841f79.zip  | |
Use cpp:array on write data, prevents copying
| -rw-r--r-- | netfs/daemon/daemonFile.cpp | 8 | ||||
| -rw-r--r-- | netfs/daemon/daemonFile.h | 3 | ||||
| -rw-r--r-- | netfs/fuse/fuseFiles.cpp | 7 | ||||
| -rw-r--r-- | netfs/ice/file.ice | 2 | 
4 files changed, 12 insertions, 8 deletions
diff --git a/netfs/daemon/daemonFile.cpp b/netfs/daemon/daemonFile.cpp index 7b2dd8e..d9f5105 100644 --- a/netfs/daemon/daemonFile.cpp +++ b/netfs/daemon/daemonFile.cpp @@ -59,10 +59,11 @@ FileServer::read(Ice::Long offset, Ice::Long size, const Ice::Current &)  }  void -FileServer::write(Ice::Long offset, Ice::Long size, const NetFS::Buffer data, const Ice::Current &) +FileServer::write(Ice::Long offset, Ice::Long size, const ::std::pair<const ::Ice::Byte *, const ::Ice::Byte *> data, +		const Ice::Current &)  {  	errno = 0; -	if (pwrite(fd, &data.front(), safe {size}, offset) != size) { +	if (pwrite(fd, data.first, safe {size}, offset) != size) {  		throw NetFS::SystemError(errno);  	}  } @@ -80,7 +81,8 @@ FileServer::copyrange(NetFS::FilePrxPtr to, Ice::Long offsrc, Ice::Long offdst,  		throw NetFS::SystemError(errno);  	}  	else { -		to->write(offdst, size, read(offsrc, size, ice)); +		const auto bytes = read(offsrc, size, ice); +		to->write(offdst, size, {bytes.data(), bytes.data() + size});  		return size;  	}  } diff --git a/netfs/daemon/daemonFile.h b/netfs/daemon/daemonFile.h index 2da4c6f..e1c6c06 100644 --- a/netfs/daemon/daemonFile.h +++ b/netfs/daemon/daemonFile.h @@ -12,7 +12,8 @@ public:  	NetFS::Attr fgetattr(const NetFS::ReqEnv, const Ice::Current &) override;  	NetFS::Buffer read(Ice::Long offset, Ice::Long size, const Ice::Current &) override; -	void write(Ice::Long offset, Ice::Long size, const NetFS::Buffer data, const Ice::Current &) override; +	void write(Ice::Long offset, Ice::Long size, const ::std::pair<const ::Ice::Byte *, const ::Ice::Byte *> data, +			const Ice::Current &) override;  	Ice::Long copyrange(NetFS::FilePrxPtr, Ice::Long, Ice::Long, Ice::Long, Ice::Int, const Ice::Current &) override;  private: diff --git a/netfs/fuse/fuseFiles.cpp b/netfs/fuse/fuseFiles.cpp index 9f7bf5e..6b1ad1a 100644 --- a/netfs/fuse/fuseFiles.cpp +++ b/netfs/fuse/fuseFiles.cpp @@ -171,11 +171,12 @@ namespace NetFS {  		try {  			auto of = getProxy<OpenFilePtr>(fi->fh);  			auto remote = of->remote; +			auto bytes = reinterpret_cast<const ::Ice::Byte *>(buf);  			if (fcr->Async) { -				waitOnWriteRangeAndThen<void>(s, o, of, [o, s, buf, &of, remote](const auto & key) { +				waitOnWriteRangeAndThen<void>(s, o, of, [o, s, bytes, &of, remote](const auto & key) {  					auto p = std::make_shared<OpenFile::WriteState>();  					remote->writeAsync( -							o, safe {s}, Buffer(buf, buf + s), +							o, safe {s}, std::make_pair(bytes, bytes + s),  							[p, of, key]() {  								p->promise.set_value();  								ScopeLock(of->mutex) { @@ -192,7 +193,7 @@ namespace NetFS {  				});  			}  			else { -				remote->write(o, safe {s}, Buffer(buf, buf + s)); +				remote->write(o, safe {s}, std::make_pair(bytes, bytes + s));  			}  			return safe {s};  		} diff --git a/netfs/ice/file.ice b/netfs/ice/file.ice index fba14df..45241f9 100644 --- a/netfs/ice/file.ice +++ b/netfs/ice/file.ice @@ -10,7 +10,7 @@ module NetFS {  		idempotent Attr fgetattr(ReqEnv env) throws AuthError, SystemError;  		idempotent Buffer read(long offset, long size) throws AuthError, SystemError;  		idempotent void ftruncate(ReqEnv env, long size) throws AuthError, SystemError; -		idempotent void write(long offset, long size, Buffer data) throws AuthError, SystemError; +		idempotent void write(long offset, long size, ["cpp:array"] Buffer data) throws AuthError, SystemError;  		idempotent long copyrange(File * to, long offsetsrc, long offsetdest, long size, int flags) throws AuthError, SystemError;  	};  };  | 
