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
--

Reply via email to