Commit:    70f1cd9dc52b8b2b3e69274e4acee9448e3fdfb4
Author:    Dmitry Stogov <dmi...@zend.com>         Mon, 25 Feb 2013 16:35:44 
+0400
Parents:   f463abc5082dcc3e11da45bfe7e04dd90b3ac426
Branches:  PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=70f1cd9dc52b8b2b3e69274e4acee9448e3fdfb4

Log:
Execute shared memory initialization/deinitialization under exclusive lock

Changed paths:
  M  shared_alloc_win32.c


Diff:
diff --git a/shared_alloc_win32.c b/shared_alloc_win32.c
index 2b65487..dc2bfd7 100644
--- a/shared_alloc_win32.c
+++ b/shared_alloc_win32.c
@@ -181,6 +181,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
        void **wanted_mapping_base = default_mapping_base_set;
        TSRMLS_FETCH();
 
+       zend_shared_alloc_lock_win32();
        /* Mapping retries: When Apache2 restarts, the parent process startup 
routine
           can be called before the child process is killed. In this case, the 
map will fail
           and we have to sleep some time (until the child releases the mapping 
object) and retry.*/
@@ -199,11 +200,13 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
                        memfile = NULL;
                        Sleep(1000 * (map_retries + 1));
                } else {
+                       zend_shared_alloc_unlock_win32();
                        return ret;
                }
        } while (++map_retries < MAX_MAP_RETRIES);
 
        if (map_retries == MAX_MAP_RETRIES) {
+               zend_shared_alloc_unlock_win32();
                zend_win_error_message(ACCEL_LOG_FATAL, "Unable to open file 
mapping", err);
                *error_in = "OpenFileMapping";
                return ALLOC_FAILURE;
@@ -213,6 +216,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
        *shared_segments_count = 1;
        *shared_segments_p = (zend_shared_segment **) calloc(1, 
sizeof(zend_shared_segment)+sizeof(void *));
        if (!*shared_segments_p) {
+               zend_shared_alloc_unlock_win32();
                zend_win_error_message(ACCEL_LOG_FATAL, "calloc() failed", 
GetLastError());
                *error_in = "calloc";
                return ALLOC_FAILURE;
@@ -224,6 +228,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
                                                                
create_name_with_username(ACCEL_FILEMAP_NAME));
        err = GetLastError();
        if (memfile == NULL) {
+               zend_shared_alloc_unlock_win32();
                zend_win_error_message(ACCEL_LOG_FATAL, "Unable to create file 
mapping", err);
                *error_in = "CreateFileMapping";
                return ALLOC_FAILURE;
@@ -269,6 +274,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
                        s += 2;
                }
                if (sscanf(s, "%p", &default_mapping_base_set[0]) != 1) {
+                       zend_shared_alloc_unlock_win32();
                        zend_win_error_message(ACCEL_LOG_FATAL, "Bad mapping 
address specified in zend_optimizerplus.mmap_base", err);
                        return ALLOC_FAILURE;
                }
@@ -284,6 +290,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
 
        err = GetLastError();
        if (mapping_base == NULL) {
+               zend_shared_alloc_unlock_win32();
                zend_win_error_message(ACCEL_LOG_FATAL, "Unable to create view 
for file mapping", err);
                *error_in = "MapViewOfFile";
                return ALLOC_FAILURE;
@@ -292,6 +299,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
                FILE *fp = fopen(mmap_base_file, "w");
                err = GetLastError();
                if (!fp) {
+                       zend_shared_alloc_unlock_win32();
                        zend_win_error_message(ACCEL_LOG_WARNING, 
mmap_base_file, err);
                        zend_win_error_message(ACCEL_LOG_FATAL, "Unable to 
write base address", err);
                        return ALLOC_FAILURE;
@@ -303,16 +311,19 @@ static int create_segments(size_t requested_size, 
zend_shared_segment ***shared_
        shared_segment->pos = 0;
        shared_segment->size = requested_size;
 
+       zend_shared_alloc_unlock_win32();
+
        return ALLOC_SUCCESS;
 }
 
 static int detach_segment(zend_shared_segment *shared_segment)
 {
+       zend_shared_alloc_lock_win32();
        if (mapping_base) {
                UnmapViewOfFile(mapping_base);
        }
        CloseHandle(memfile);
-       ReleaseMutex(memory_mutex);
+       zend_shared_alloc_unlock_win32();
        CloseHandle(memory_mutex);
        return 0;
 }


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to