Hi Julien,

On Fri, June 13, 2014 16:20, Julien Pauli wrote:
> Hi,
>
>
> I just wrote a patch to add fallocate() syscall support for streams.
> It relies on posix_fallocate(), so that it should support many Unixes.
> Linux's got a specification with a fallocate() function, more powerful
> than the posix call.
>
> fallocate() does write blocks to the underlying filesystem (not so many
> are supported, but the ones not supported should proxy to ftruncate()) and
> prevents sparse file creation whereas ftruncate() just updates inode
> information, leading to possible future out of space errors.
>
> I got a POC showing the diffs between both calls here :
> https://gist.github.com/jpauli/8afec7c4fc2b38f8ff27
>
>
> I propose two APIs for PHP :
> - One that adds a function : fallocate()
> https://github.com/jpauli/php-src/tree/fallocate
>
>
> - One that relies on ftruncate() , and adds a <bool>$use_fallocate
> flag https://github.com/jpauli/php-src/tree/fallocate_flag
>
> Please, note that the latest proposal requires patches in different
> extensions, as I changed a PHP_API function signature.
>
> I don't know if Windows can support that. Pierre, Anatol ? :-)
>
>
> Tests are beeing written at the moment.
>
>
> I didn't implement this is user stream handlers, as this really is a
> low level implementation design that is kind of useless for usage in user
> streams.
>
> Thoughts ?
>
I've found this code

http://hg.mozilla.org/mozilla-central/file/3d846420a907/xpcom/glue/FileUtils.cpp#l61

On windows there's no such syscalls. All the data is however buffered, as
usual. An emulation could be of course implemented for Windows and other
unsupported platforms. However it probably wouldn't mimic the exact
behavior.

But besides writing in blocks (fallocate) and fast truncating - there are
some other useful things i see on the man page. I mean checking for the
free space or all those flags like zeroing file space. Actually, maybe
it'd be even more useful to put it into user space, maybe as normal
functions? Otherwise, if you think it's too low level, one could go two
ways - ether implement an emulation, or just use HAVE_FALLOCATE and a
configure switch to activate it manually.

Regards

Anatol

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to