Mercurial > hg > nginx
view src/core/ngx_open_file_cache.h @ 4576:876e6b0814a5
Fixed signed integer overflows in timer code (ticket #145).
Integer overflow is undefined behaviour in C and this indeed caused
problems on Solaris/SPARC (at least in some cases). Fix is to
subtract unsigned integers instead, and then cast result to a signed
one, which is implementation-defined behaviour and used to work.
Strictly speaking, we should compare (unsigned) result with the maximum
value of the corresponding signed integer type instead, this will be
defined behaviour. This will require much more changes though, and
considered to be overkill for now.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 06 Apr 2012 23:46:09 +0000 |
parents | 47ece8818978 |
children |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> #ifndef _NGX_OPEN_FILE_CACHE_H_INCLUDED_ #define _NGX_OPEN_FILE_CACHE_H_INCLUDED_ #define NGX_OPEN_FILE_DIRECTIO_OFF NGX_MAX_OFF_T_VALUE typedef struct { ngx_fd_t fd; ngx_file_uniq_t uniq; time_t mtime; off_t size; off_t fs_size; off_t directio; size_t read_ahead; ngx_err_t err; char *failed; time_t valid; ngx_uint_t min_uses; #if (NGX_HAVE_OPENAT) size_t disable_symlinks_from; unsigned disable_symlinks:2; #endif unsigned test_dir:1; unsigned test_only:1; unsigned log:1; unsigned errors:1; unsigned events:1; unsigned is_dir:1; unsigned is_file:1; unsigned is_link:1; unsigned is_exec:1; unsigned is_directio:1; } ngx_open_file_info_t; typedef struct ngx_cached_open_file_s ngx_cached_open_file_t; struct ngx_cached_open_file_s { ngx_rbtree_node_t node; ngx_queue_t queue; u_char *name; time_t created; time_t accessed; ngx_fd_t fd; ngx_file_uniq_t uniq; time_t mtime; off_t size; ngx_err_t err; uint32_t uses; #if (NGX_HAVE_OPENAT) size_t disable_symlinks_from; unsigned disable_symlinks:2; #endif unsigned count:24; unsigned close:1; unsigned use_event:1; unsigned is_dir:1; unsigned is_file:1; unsigned is_link:1; unsigned is_exec:1; unsigned is_directio:1; ngx_event_t *event; }; typedef struct { ngx_rbtree_t rbtree; ngx_rbtree_node_t sentinel; ngx_queue_t expire_queue; ngx_uint_t current; ngx_uint_t max; time_t inactive; } ngx_open_file_cache_t; typedef struct { ngx_open_file_cache_t *cache; ngx_cached_open_file_t *file; ngx_uint_t min_uses; ngx_log_t *log; } ngx_open_file_cache_cleanup_t; typedef struct { /* ngx_connection_t stub to allow use c->fd as event ident */ void *data; ngx_event_t *read; ngx_event_t *write; ngx_fd_t fd; ngx_cached_open_file_t *file; ngx_open_file_cache_t *cache; } ngx_open_file_cache_event_t; ngx_open_file_cache_t *ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive); ngx_int_t ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name, ngx_open_file_info_t *of, ngx_pool_t *pool); #endif /* _NGX_OPEN_FILE_CACHE_H_INCLUDED_ */