On 27 Feb 2010, at 11:08 PM, William A. Rowe Jr. wrote:
Does anyone know of any reason why this wouldn't work?
Yes - principal of least surprise. You cannot deprecate an API in
this way,
and the patch deprecating that flag would be rejected anyways. When
you
modify a library, please try to observe your design from several
perspectives
at the same time.
Apply the patch, then read the code, don't just look at the patch :)
It looks like this in situ:
/**
* @defgroup apr_file_open_flags File Open Flags/Routines
* @{
*/
/* Note to implementors: Values in the range 0x00100000--0x80000000
are reserved for platform-specific values. */
#define APR_FOPEN_READ 0x00001 /**< Open the file for reading */
#define APR_FOPEN_WRITE 0x00002 /**< Open the file for writing */
#define APR_FOPEN_CREATE 0x00004 /**< Create the file if not
there */
#define APR_FOPEN_APPEND 0x00008 /**< Append to the end of the
file */
#define APR_FOPEN_TRUNCATE 0x00010 /**< Open the file and truncate
to 0 length */
#define APR_FOPEN_BINARY 0x00020 /**< Open the file in binary
mode */
#define APR_FOPEN_EXCL 0x00040 /**< Open should fail if
APR_CREATE
and file exists. */
#define APR_FOPEN_BUFFERED 0x00080 /**< Open the file for buffered
I/O */
#define APR_FOPEN_DELONCLOSE 0x00100 /**< Delete the file after close
*/
#define APR_FOPEN_XTHREAD 0x00200 /**< Platform dependent tag to
open
the file for use across
multiple
threads */
#define APR_FOPEN_SHARELOCK 0x00400 /**< Platform dependent support
for
higher level locked read/write
access to support writes
across
process/machines */
#define APR_FOPEN_NOCLEANUP 0x00800 /**< Do not register a cleanup
when the file is opened */
#define APR_FOPEN_SENDFILE_ENABLED 0x01000 /**< Advisory flag that this
file should support
apr_socket_sendfile
operation */
#define APR_FOPEN_LARGEFILE 0x04000 /**< Platform dependent flag to
enable
* large file support, see
WARNING below
*/
#define APR_FOPEN_SPARSE 0x08000 /**< Platform dependent flag to
enable
* sparse file support, see
WARNING below
*/
#define APR_FOPEN_ROTATING 0x10000 /**< Do file file rotation
checking */
#define APR_FOPEN_MANUAL_ROTATE 0x20000 /**< Enable Manual rotation */
#define APR_FOPEN_NONBLOCK 0x40000 /**< Platform dependent flag to
enable
* non blocking file io */
/* backcompat */
#define APR_READ APR_FOPEN_READ /**< @deprecated
@see APR_FOPEN_READ */
#define APR_WRITE APR_FOPEN_WRITE /**< @deprecated
@see APR_FOPEN_WRITE */
#define APR_CREATE APR_FOPEN_CREATE /**< @deprecated
@see APR_FOPEN_CREATE */
#define APR_APPEND APR_FOPEN_APPEND /**< @deprecated
@see APR_FOPEN_APPEND */
#define APR_TRUNCATE APR_FOPEN_TRUNCATE /**< @deprecated
@see APR_FOPEN_TRUNCATE */
#define APR_BINARY APR_FOPEN_BINARY /**< @deprecated
@see APR_FOPEN_BINARY */
#define APR_EXCL APR_FOPEN_EXCL /**< @deprecated
@see APR_FOPEN_EXCL */
#define APR_BUFFERED APR_FOPEN_BUFFERED /**< @deprecated
@see APR_FOPEN_BUFFERED */
#define APR_DELONCLOSE APR_FOPEN_DELONCLOSE /**< @deprecated
@see APR_FOPEN_DELONCLOSE */
#define APR_XTHREAD APR_FOPEN_XTHREAD /**< @deprecated
@see APR_FOPEN_XTHREAD */
#define APR_SHARELOCK APR_FOPEN_SHARELOCK /**< @deprecated
@see APR_FOPEN_SHARELOCK */
#define APR_FILE_NOCLEANUP APR_FOPEN_NOCLEANUP /**< @deprecated
@see APR_FOPEN_NOCLEANUP */
#define APR_SENDFILE_ENABLED APR_FOPEN_SENDFILE_ENABLED /**<
@deprecated @see APR_FOPEN_SENDFILE_ENABLED */
#define APR_LARGEFILE APR_FOPEN_LARGEFILE /**< @deprecated
@see APR_FOPEN_LARGEFILE */
#define APR_NONBLOCK APR_FOPEN_NONBLOCK /**< @deprecated
@see APR_FOPEN_NONBLOCK */
I could leave off the last deprecated value, but my expectation was
that the whole api would be deprecated in one go, not in dribs and
drabs. That's my principle of least surprise.
If you wanted to submit an acceptable patch, APR would be aware of
the file
handle's blocking state, and still respect the requested blocking/
nonblocking
nature of the actual IO and poll/select calls.
Can you give more details?
On Unix the non blocking behaviour is specified at the opening of the
pipe, and poll/select and friends work as they normally would. It is
read and write that aren't blocking, not poll/select, and these are
already supported by APR in the form of APR_EAGAIN and friends.
The key problem right now is we cannot turn it on.
I am only familiar with the Windows interface via reading the APIs, I
don't have access to any Windows machines so can't try it out, and
your help would be appreciated.
Regards,
Graham
--