Mercurial > hg > nginx
comparison src/core/ngx_cycle.c @ 6133:af7eba90645d
Win32: shared memory base addresses and remapping.
Two mechanisms are implemented to make it possible to store pointers
in shared memory on Windows, in particular on Windows Vista and later
versions with ASLR:
- The ngx_shm_remap() function added to allow remapping of a shared memory
zone to the address originally used for it in the master process. While
important, it doesn't solve the problem by itself as in many cases it's
not possible to use the address because of conflicts with other
allocations.
- We now create mappings at the same address in all processes by starting
mappings at predefined addresses normally unused by newborn processes.
These two mechanisms combined allow to use shared memory on Windows
almost without problems, including reloads.
Based on the patch by Sergey Brester:
http://mailman.nginx.org/pipermail/nginx-devel/2015-April/006836.html
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 27 Apr 2015 18:25:42 +0300 |
parents | 859ce1c41f64 |
children | 4f6efabcb09b |
comparison
equal
deleted
inserted
replaced
6132:859ce1c41f64 | 6133:af7eba90645d |
---|---|
861 | 861 |
862 if (sp == sp->addr) { | 862 if (sp == sp->addr) { |
863 return NGX_OK; | 863 return NGX_OK; |
864 } | 864 } |
865 | 865 |
866 #if (NGX_WIN32) | |
867 | |
868 /* remap at the required address */ | |
869 | |
870 if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK) { | |
871 return NGX_ERROR; | |
872 } | |
873 | |
874 sp = (ngx_slab_pool_t *) zn->shm.addr; | |
875 | |
876 if (sp == sp->addr) { | |
877 return NGX_OK; | |
878 } | |
879 | |
880 #endif | |
881 | |
866 ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, | 882 ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, |
867 "shared zone \"%V\" has no equal addresses: %p vs %p", | 883 "shared zone \"%V\" has no equal addresses: %p vs %p", |
868 &zn->shm.name, sp->addr, sp); | 884 &zn->shm.name, sp->addr, sp); |
869 return NGX_ERROR; | 885 return NGX_ERROR; |
870 } | 886 } |