[svn-commits] dvossel: trunk r291228 - in /trunk: ./ main/manager.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Oct 12 11:00:08 CDT 2010


Author: dvossel
Date: Tue Oct 12 11:00:06 2010
New Revision: 291228

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=291228
Log:
Merged revisions 291227 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r291227 | dvossel | 2010-10-12 10:58:56 -0500 (Tue, 12 Oct 2010) | 16 lines
  
  Fixes manager.c crash.
  
  This issue was caused by improper use of the mansession lock and
  manession_session lock.  These two structures are confusing to begin
  with so I'm not surprised this occurred.  I fixed this by consistently
  making sure we use each of these locks only to protect the data
  in the corresponding structure.  We had mismatched usage of these
  locks which resulted in no mutual exclusivity occurring at all.
  
  
  (closes issue #17994)
  Reported by: vrban
  Patches:
        mansession_locking_fix.diff uploaded by dvossel (license 671)
  Tested by: vrban
........

Modified:
    trunk/   (props changed)
    trunk/main/manager.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/manager.c?view=diff&rev=291228&r1=291227&r2=291228
==============================================================================
--- trunk/main/manager.c (original)
+++ trunk/main/manager.c Tue Oct 12 11:00:06 2010
@@ -1972,11 +1972,11 @@
 {
 	int maskint = strings_to_mask(eventmask);
 
-	mansession_lock(s);
+	ao2_lock(s->session);
 	if (maskint >= 0) {
 		s->session->send_events = maskint;
 	}
-	mansession_unlock(s);
+	ao2_unlock(s->session);
 
 	return maskint;
 }
@@ -2765,7 +2765,7 @@
 		/* XXX maybe put an upper bound, or prevent the use of 0 ? */
 	}
 
-	mansession_lock(s);
+	ao2_lock(s->session);
 	if (s->session->waiting_thread != AST_PTHREADT_NULL) {
 		pthread_kill(s->session->waiting_thread, SIGURG);
 	}
@@ -2789,14 +2789,14 @@
 			s->session->send_events = -1;
 		}
 	}
-	mansession_unlock(s);
+	ao2_unlock(s->session);
 
 	/* XXX should this go inside the lock ? */
 	s->session->waiting_thread = pthread_self();	/* let new events wake up this thread */
 	ast_debug(1, "Starting waiting for an event!\n");
 
 	for (x = 0; x < timeout || timeout < 0; x++) {
-		mansession_lock(s);
+		ao2_lock(s->session);
 		if (AST_RWLIST_NEXT(s->session->last_ev, eq_next)) {
 			needexit = 1;
 		}
@@ -2810,7 +2810,7 @@
 		if (s->session->needdestroy) {
 			needexit = 1;
 		}
-		mansession_unlock(s);
+		ao2_unlock(s->session);
 		if (needexit) {
 			break;
 		}
@@ -2824,7 +2824,7 @@
 	}
 	ast_debug(1, "Finished waiting for an event!\n");
 
-	mansession_lock(s);
+	ao2_lock(s->session);
 	if (s->session->waiting_thread == pthread_self()) {
 		struct eventqent *eqe = s->session->last_ev;
 		astman_send_response(s, m, "Success", "Waiting for Event completed.");
@@ -2845,7 +2845,8 @@
 	} else {
 		ast_debug(1, "Abandoning event request!\n");
 	}
-	mansession_unlock(s);
+	ao2_unlock(s->session);
+
 	return 0;
 }
 
@@ -4538,21 +4539,20 @@
 	}
 	res = 0;
 	while (res == 0) {
-		/* XXX do we really need this locking ? */
-		mansession_lock(s);
+		ao2_lock(s->session);
 		if (s->session->pending_event) {
 			s->session->pending_event = 0;
-			mansession_unlock(s);
+			ao2_unlock(s->session);
 			return 0;
 		}
 		s->session->waiting_thread = pthread_self();
-		mansession_unlock(s);
+		ao2_unlock(s->session);
 
 		res = ast_wait_for_input(s->session->fd, -1);	/* return 0 on timeout ? */
 
-		mansession_lock(s);
+		ao2_lock(s->session);
 		s->session->waiting_thread = AST_PTHREADT_NULL;
-		mansession_unlock(s);
+		ao2_unlock(s->session);
 	}
 	if (res < 0) {
 		/* If we get a signal from some other thread (typically because
@@ -4565,7 +4565,7 @@
 		return -1;
 	}
 
-	mansession_lock(s);
+	ao2_lock(s->session);
 	res = fread(src + s->session->inlen, 1, maxlen - s->session->inlen, s->session->f);
 	if (res < 1) {
 		res = -1;	/* error return */
@@ -4574,7 +4574,7 @@
 		src[s->session->inlen] = '\0';
 		res = 0;
 	}
-	mansession_unlock(s);
+	ao2_unlock(s->session);
 	return res;
 }
 




More information about the svn-commits mailing list