apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Graham Leggett <minf...@sharp.fm>
Subject Re: apr_file_open() and non blocking IO
Date Sat, 27 Feb 2010 22:12:25 GMT
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
--


Mime
View raw message