Skip to content

Commit

Permalink
Unlock of shared memory zones on process crash.
Browse files Browse the repository at this point in the history
If process exited abnormally while holding lock on some shared memory zone -
unlock it.  It may be not safe thing to do (as crash with lock held may
result in corrupted shared memory structure, and other processes will
subsequently crash while trying to access shared data), therefore complain
loudly if unlock succeeds.
  • Loading branch information
mdounin committed Nov 23, 2011
1 parent ddb7cd1 commit 13717da
Showing 1 changed file with 50 additions and 11 deletions.
61 changes: 50 additions & 11 deletions src/os/unix/ngx_process.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ typedef struct {
static void ngx_execute_proc(ngx_cycle_t *cycle, void *data);
static void ngx_signal_handler(int signo);
static void ngx_process_get_status(void);
static void ngx_unlock_mutexes(ngx_pid_t pid);


int ngx_argc;
Expand Down Expand Up @@ -497,17 +498,6 @@ ngx_process_get_status(void)
}


if (ngx_accept_mutex_ptr) {

/*
* unlock the accept mutex if the abnormally exited process
* held it
*/

ngx_shmtx_force_unlock(&ngx_accept_mutex, pid);
}


one = 1;
process = "unknown process";

Expand Down Expand Up @@ -545,6 +535,55 @@ ngx_process_get_status(void)
process, pid, WEXITSTATUS(status));
ngx_processes[i].respawn = 0;
}

ngx_unlock_mutexes(pid);
}
}


static void
ngx_unlock_mutexes(ngx_pid_t pid)
{
ngx_uint_t i;
ngx_shm_zone_t *shm_zone;
ngx_list_part_t *part;
ngx_slab_pool_t *sp;

/*
* unlock the accept mutex if the abnormally exited process
* held it
*/

if (ngx_accept_mutex_ptr) {
ngx_shmtx_force_unlock(&ngx_accept_mutex, pid);
}

/*
* unlock shared memory mutexes if held by the abnormally exited
* process
*/

part = (ngx_list_part_t *) &ngx_cycle->shared_memory.part;
shm_zone = part->elts;

for (i = 0; /* void */ ; i++) {

if (i >= part->nelts) {
if (part->next == NULL) {
break;
}
part = part->next;
shm_zone = part->elts;
i = 0;
}

sp = (ngx_slab_pool_t *) shm_zone[i].shm.addr;

if (ngx_shmtx_force_unlock(&sp->mutex, pid)) {
ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
"shared memory zone \"%V\" was locked by %P",
&shm_zone[i].shm.name, pid);
}
}
}

Expand Down

0 comments on commit 13717da

Please sign in to comment.