mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	lock.c: Add AMI event for deadlocks.
Adds an AMI event to indicate that a deadlock has likely started, when Asterisk is compiled with DETECT_DEADLOCKS enabled. This can make it easier to perform automated deadlock detection and take appropriate action (such as doing a core dump). Unlike the deadlock warnings, the AMI event is emitted only once per deadlock. ASTERISK-30161 #close Change-Id: Ifc6ed3e390f8b4cff7f8077a50e4d7a5b54e42fb
This commit is contained in:
		
				
					committed by
					
						 Friendly Automation
						Friendly Automation
					
				
			
			
				
	
			
			
			
						parent
						
							f4ea243e49
						
					
				
				
					commit
					1456dc757b
				
			
							
								
								
									
										5
									
								
								doc/CHANGES-staging/lock_deadlock.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								doc/CHANGES-staging/lock_deadlock.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Subject: locks | ||||
|  | ||||
| A new AMI event, DeadlockStart, is now available | ||||
| when Asterisk is compiled with DETECT_DEADLOCKS, | ||||
| and can indicate that a deadlock has occured. | ||||
							
								
								
									
										21
									
								
								main/lock.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								main/lock.c
									
									
									
									
									
								
							| @@ -38,6 +38,7 @@ static void __attribute__((constructor)) __mtx_init(void) | ||||
|  | ||||
| #include "asterisk/utils.h" | ||||
| #include "asterisk/lock.h" | ||||
| #include "asterisk/manager.h" | ||||
|  | ||||
| /* Allow direct use of pthread_mutex_* / pthread_cond_* */ | ||||
| #undef pthread_mutex_init | ||||
| @@ -311,6 +312,26 @@ int __ast_pthread_mutex_lock(const char *filename, int lineno, const char *func, | ||||
| 						ast_reentrancy_unlock(lt); | ||||
| 					} | ||||
| 					reported_wait = wait_time; | ||||
| 					if ((int) wait_time < 10) { /* Only emit an event when a deadlock starts, not every 5 seconds */ | ||||
| 						/*** DOCUMENTATION | ||||
| 							<managerEvent language="en_US" name="DeadlockStart"> | ||||
| 								<managerEventInstance class="EVENT_FLAG_SYSTEM"> | ||||
| 									<synopsis>Raised when a probable deadlock has started. | ||||
| 									Delivery of this event is attempted but not guaranteed, | ||||
|                                                                         and could fail for example if the manager itself is deadlocked. | ||||
|                                                                         </synopsis> | ||||
| 										<syntax> | ||||
| 											<parameter name="Mutex"> | ||||
| 												<para>The mutex involved in the deadlock.</para> | ||||
| 											</parameter> | ||||
| 										</syntax> | ||||
| 								</managerEventInstance> | ||||
| 							</managerEvent> | ||||
| 						***/ | ||||
| 						manager_event(EVENT_FLAG_SYSTEM, "DeadlockStart", | ||||
| 							"Mutex: %s\r\n", | ||||
| 							mutex_name); | ||||
| 					} | ||||
| 				} | ||||
| 				usleep(200); | ||||
| 			} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user