diff options
author | Raimo Niskanen <[email protected]> | 2011-12-08 13:32:09 +0100 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2011-12-20 12:07:41 +0100 |
commit | b3db46435e2d32aa4197753bc95a81648f794021 (patch) | |
tree | c79295468315656a94f86f816ed914bdd830b312 /erts/emulator/drivers/common | |
parent | d34e248f0913a337f1662e07b15298f9a082834b (diff) | |
download | otp-b3db46435e2d32aa4197753bc95a81648f794021.tar.gz otp-b3db46435e2d32aa4197753bc95a81648f794021.tar.bz2 otp-b3db46435e2d32aa4197753bc95a81648f794021.zip |
erts: rewrite efile_writev to handle partial writes correctly
Diffstat (limited to 'erts/emulator/drivers/common')
-rw-r--r-- | erts/emulator/drivers/common/efile_drv.c | 8 | ||||
-rw-r--r-- | erts/emulator/drivers/common/erl_efile.h | 2 |
2 files changed, 7 insertions, 3 deletions
diff --git a/erts/emulator/drivers/common/efile_drv.c b/erts/emulator/drivers/common/efile_drv.c index b132991a3b..36ed108b76 100644 --- a/erts/emulator/drivers/common/efile_drv.c +++ b/erts/emulator/drivers/common/efile_drv.c @@ -1385,7 +1385,11 @@ static void invoke_writev(void *data) { size = d->c.writev.size; } - /* Copy the io vector to avoid locking the port que while writing */ + /* Copy the io vector to avoid locking the port que while writing, + * also, both we and efile_writev might/will change the SysIOVec + * when segmenting or due to partial write and we do not want to + * tamper with the actual queue that we get from driver_peekq + */ MUTEX_LOCK(d->c.writev.q_mtx); /* Lock before accessing the port queue */ iov0 = driver_peekq(d->c.writev.port, &iovlen); @@ -1424,7 +1428,7 @@ static void invoke_writev(void *data) { } else { d->result_ok = efile_writev(&d->errInfo, d->flags, (int) d->fd, - iov, iovcnt, size); + iov, iovcnt); } } else if (iovlen == 0) { d->result_ok = 1; diff --git a/erts/emulator/drivers/common/erl_efile.h b/erts/emulator/drivers/common/erl_efile.h index 3868b38137..69ad02633c 100644 --- a/erts/emulator/drivers/common/erl_efile.h +++ b/erts/emulator/drivers/common/erl_efile.h @@ -162,7 +162,7 @@ int efile_write_info(Efile_error* errInfo, Efile_info* pInfo, char *name); int efile_write(Efile_error* errInfo, int flags, int fd, char* buf, size_t count); int efile_writev(Efile_error* errInfo, int flags, int fd, - SysIOVec* iov, int iovcnt, size_t size); + SysIOVec* iov, int iovcnt); int efile_read(Efile_error* errInfo, int flags, int fd, char* buf, size_t count, size_t* pBytesRead); int efile_seek(Efile_error* errInfo, int fd, |