mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Data stores do not need a lock. As well change the way they are removed from the channel when it is destroyed (thanks Russell Wussell) and finally... because C++ is silly... change our list macro info thing to be "entry" instead of "list".
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@19062 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -1 +1 @@ | ||||
| 14 | ||||
| 15 | ||||
|   | ||||
							
								
								
									
										26
									
								
								channel.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								channel.c
									
									
									
									
									
								
							| @@ -984,16 +984,10 @@ void ast_channel_free(struct ast_channel *chan) | ||||
| 	} | ||||
| 	 | ||||
| 	/* Get rid of each of the data stores on the channel */ | ||||
| 	AST_LIST_LOCK(&chan->datastores); | ||||
| 	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) { | ||||
| 		/* Remove from the list */ | ||||
| 		AST_LIST_REMOVE_CURRENT(&chan->datastores, list); | ||||
| 	while ((datastore = AST_LIST_REMOVE_HEAD(&chan->datastores, entry))) | ||||
| 		/* Free the data store */ | ||||
| 		ast_channel_datastore_free(datastore); | ||||
| 	} | ||||
| 	AST_LIST_TRAVERSE_SAFE_END | ||||
| 	AST_LIST_UNLOCK(&chan->datastores); | ||||
| 	AST_LIST_HEAD_DESTROY(&chan->datastores); | ||||
| 	AST_LIST_HEAD_INIT_NOLOCK(&chan->datastores); | ||||
|  | ||||
| 	/* loop over the variables list, freeing all data and deleting list items */ | ||||
| 	/* no need to lock the list, as the channel is already locked */ | ||||
| @@ -1059,9 +1053,7 @@ int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *da | ||||
| { | ||||
| 	int res = 0; | ||||
|  | ||||
| 	AST_LIST_LOCK(&chan->datastores); | ||||
| 	AST_LIST_INSERT_HEAD(&chan->datastores, datastore, list); | ||||
| 	AST_LIST_UNLOCK(&chan->datastores); | ||||
| 	AST_LIST_INSERT_HEAD(&chan->datastores, datastore, entry); | ||||
|  | ||||
| 	return res; | ||||
| } | ||||
| @@ -1072,16 +1064,14 @@ int ast_channel_datastore_remove(struct ast_channel *chan, struct ast_datastore | ||||
| 	int res = -1; | ||||
|  | ||||
| 	/* Find our position and remove ourselves */ | ||||
| 	AST_LIST_LOCK(&chan->datastores); | ||||
| 	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, list) { | ||||
| 	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore2, entry) { | ||||
| 		if (datastore2 == datastore) { | ||||
| 			AST_LIST_REMOVE_CURRENT(&chan->datastores, list); | ||||
| 			AST_LIST_REMOVE_CURRENT(&chan->datastores, entry); | ||||
| 			res = 0; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	AST_LIST_TRAVERSE_SAFE_END | ||||
| 	AST_LIST_UNLOCK(&chan->datastores); | ||||
|  | ||||
| 	return res; | ||||
| } | ||||
| @@ -1093,8 +1083,7 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const | ||||
| 	if (info == NULL) | ||||
| 		return NULL; | ||||
|  | ||||
| 	AST_LIST_LOCK(&chan->datastores); | ||||
| 	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, list) { | ||||
| 	AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->datastores, datastore, entry) { | ||||
| 		if (datastore->info == info) { | ||||
| 			if (uid != NULL && datastore->uid != NULL) { | ||||
| 				if (!strcasecmp(uid, datastore->uid)) { | ||||
| @@ -1108,7 +1097,6 @@ struct ast_datastore *ast_channel_datastore_find(struct ast_channel *chan, const | ||||
| 		} | ||||
| 	} | ||||
| 	AST_LIST_TRAVERSE_SAFE_END | ||||
| 	AST_LIST_UNLOCK(&chan->datastores); | ||||
|  | ||||
| 	return datastore; | ||||
| } | ||||
| @@ -3169,7 +3157,7 @@ int ast_do_masquerade(struct ast_channel *original) | ||||
| 	} | ||||
| 	/* Move data stores over */ | ||||
| 	if (AST_LIST_FIRST(&clone->datastores)) | ||||
|                 AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), list); | ||||
|                 AST_LIST_INSERT_TAIL(&original->datastores, AST_LIST_FIRST(&clone->datastores), entry); | ||||
| 	AST_LIST_HEAD_INIT_NOLOCK(&clone->datastores); | ||||
|  | ||||
| 	clone_variables(original, clone); | ||||
|   | ||||
| @@ -161,7 +161,7 @@ struct ast_datastore { | ||||
| 	/*! Data store type information */ | ||||
| 	const struct ast_datastore_info *info; | ||||
| 	/*! Used for easy linking */ | ||||
| 	AST_LIST_ENTRY(ast_datastore) list; | ||||
| 	AST_LIST_ENTRY(ast_datastore) entry; | ||||
| }; | ||||
|  | ||||
| /*! Structure for all kinds of caller ID identifications */ | ||||
| @@ -444,7 +444,7 @@ struct ast_channel { | ||||
| 	struct ast_channel_spy_list *spies; | ||||
|  | ||||
| 	/*! Data stores on the channel */ | ||||
| 	AST_LIST_HEAD(datastores, ast_datastore) datastores; | ||||
| 	AST_LIST_HEAD_NOLOCK(datastores, ast_datastore) datastores; | ||||
|  | ||||
| 	/*! For easy linking */ | ||||
| 	AST_LIST_ENTRY(ast_channel) chan_list; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user