(svn r2338) - CodeChange: only call the variable hooks when you set their value not when you query them
- Fix: typo in pool.c "Cleaing up" --> "Cleaning up"
This commit is contained in:
		
							
								
								
									
										175
									
								
								console.c
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								console.c
									
									
									
									
									
								
							| @@ -472,6 +472,88 @@ bool GetArgumentInteger(uint32 *value, const char *arg) | |||||||
| 	return (arg == endptr) ? false : true; | 	return (arg == endptr) ? false : true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // * ************************* * // | ||||||
|  | // * hooking code              * // | ||||||
|  | // * ************************* * // | ||||||
|  | /** | ||||||
|  |  * General internal hooking code that is the same for both commands and variables | ||||||
|  |  * @param hooks @IConsoleHooks structure that will be set according to | ||||||
|  |  * @param type type access trigger | ||||||
|  |  * @param proc function called when the hook criteria is met | ||||||
|  |  */ | ||||||
|  | static void IConsoleHookAdd(IConsoleHooks *hooks, IConsoleHookTypes type, IConsoleHook *proc) | ||||||
|  | { | ||||||
|  | 	if (hooks == NULL || proc == NULL) return; | ||||||
|  |  | ||||||
|  | 	switch (type) { | ||||||
|  | 		case ICONSOLE_HOOK_ACCESS: | ||||||
|  | 			hooks->access = proc; | ||||||
|  | 			break; | ||||||
|  | 		case ICONSOLE_HOOK_PRE_ACTION: | ||||||
|  | 			hooks->pre = proc; | ||||||
|  | 			break; | ||||||
|  | 		case ICONSOLE_HOOK_POST_ACTION: | ||||||
|  | 			hooks->post = proc; | ||||||
|  | 			break; | ||||||
|  | 			default: NOT_REACHED(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Handle any special hook triggers. If the hook type is met check if | ||||||
|  |  * there is a function associated with that and if so, execute it | ||||||
|  |  * @param hooks @IConsoleHooks structure that will be checked | ||||||
|  |  * @param type type of hook, trigger that needs to be activated | ||||||
|  |  * @return true on a successfull execution of the hook command or if there | ||||||
|  |  * is no hook/trigger present at all. False otherwise | ||||||
|  |  */ | ||||||
|  | static bool IConsoleHookHandle(const IConsoleHooks *hooks, IConsoleHookTypes type) | ||||||
|  | { | ||||||
|  | 	IConsoleHook *proc = NULL; | ||||||
|  | 	if (hooks == NULL) return false; | ||||||
|  |  | ||||||
|  | 	switch (type) { | ||||||
|  | 		case ICONSOLE_HOOK_ACCESS: | ||||||
|  | 			proc = hooks->access; | ||||||
|  | 			break; | ||||||
|  | 		case ICONSOLE_HOOK_PRE_ACTION: | ||||||
|  | 			proc = hooks->pre; | ||||||
|  | 			break; | ||||||
|  | 		case ICONSOLE_HOOK_POST_ACTION: | ||||||
|  | 			proc = hooks->post; | ||||||
|  | 			break; | ||||||
|  | 			default: NOT_REACHED(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return (proc == NULL) ? true : proc(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Add a hook to a command that will be triggered at certain points | ||||||
|  |  * @param name name of the command that the hook is added to | ||||||
|  |  * @param type type of hook that is added (ACCESS, BEFORE and AFTER change) | ||||||
|  |  * @param proc function called when the hook criteria is met | ||||||
|  |  */ | ||||||
|  | void IConsoleCmdHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc) | ||||||
|  | { | ||||||
|  | 	IConsoleCmd *cmd = IConsoleCmdGet(name); | ||||||
|  | 	if (cmd == NULL) return; | ||||||
|  | 	IConsoleHookAdd(&cmd->hook, type, proc); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Add a hook to a variable that will be triggered at certain points | ||||||
|  |  * @param name name of the variable that the hook is added to | ||||||
|  |  * @param type type of hook that is added (ACCESS, BEFORE and AFTER change) | ||||||
|  |  * @param proc function called when the hook criteria is met | ||||||
|  |  */ | ||||||
|  | void IConsoleVarHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc) | ||||||
|  | { | ||||||
|  | 	IConsoleVar *var = IConsoleVarGet(name); | ||||||
|  | 	if (var == NULL) return; | ||||||
|  | 	IConsoleHookAdd(&var->hook, type, proc); | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Perhaps ugly macro, but this saves us the trouble of writing the same function |  * Perhaps ugly macro, but this saves us the trouble of writing the same function | ||||||
|  * three types, just with different variables. Yes, templates would be handy. It was |  * three types, just with different variables. Yes, templates would be handy. It was | ||||||
| @@ -729,6 +811,7 @@ IConsoleVar *IConsoleVarGet(const char *name) | |||||||
|  */ |  */ | ||||||
| static void IConsoleVarSetValue(const IConsoleVar *var, uint32 value) | static void IConsoleVarSetValue(const IConsoleVar *var, uint32 value) | ||||||
| { | { | ||||||
|  | 	IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION); | ||||||
| 	switch (var->type) { | 	switch (var->type) { | ||||||
| 		case ICONSOLE_VAR_BOOLEAN: | 		case ICONSOLE_VAR_BOOLEAN: | ||||||
| 			*(bool*)var->addr = (value != 0); | 			*(bool*)var->addr = (value != 0); | ||||||
| @@ -751,6 +834,7 @@ static void IConsoleVarSetValue(const IConsoleVar *var, uint32 value) | |||||||
| 		default: NOT_REACHED(); | 		default: NOT_REACHED(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION); | ||||||
| 	IConsoleVarPrintSetValue(var); | 	IConsoleVarPrintSetValue(var); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -764,7 +848,9 @@ static void IConsoleVarSetStringvalue(const IConsoleVar *var, char *value) | |||||||
| { | { | ||||||
| 	if (var->type != ICONSOLE_VAR_STRING || var->addr == NULL) return; | 	if (var->type != ICONSOLE_VAR_STRING || var->addr == NULL) return; | ||||||
|  |  | ||||||
|  | 	IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION); | ||||||
| 	ttd_strlcpy((char*)var->addr, (char*)value, var->size); | 	ttd_strlcpy((char*)var->addr, (char*)value, var->size); | ||||||
|  | 	IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION); | ||||||
| 	IConsoleVarPrintSetValue(var); // print out the new value, giving feedback | 	IConsoleVarPrintSetValue(var); // print out the new value, giving feedback | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| @@ -918,88 +1004,6 @@ void IConsoleVarExec(const IConsoleVar *var, byte tokencount, char *token[ICON_T | |||||||
| 	IConsoleError("invalid variable assignment"); | 	IConsoleError("invalid variable assignment"); | ||||||
| } | } | ||||||
|  |  | ||||||
| // * ************************* * // |  | ||||||
| // * hooking code              * // |  | ||||||
| // * ************************* * // |  | ||||||
| /** |  | ||||||
|  * General internal hooking code that is the same for both commands and variables |  | ||||||
|  * @param hooks @IConsoleHooks structure that will be set according to |  | ||||||
|  * @param type type access trigger |  | ||||||
|  * @param proc function called when the hook criteria is met |  | ||||||
|  */ |  | ||||||
| static void IConsoleHookAdd(IConsoleHooks *hooks, IConsoleHookTypes type, IConsoleHook *proc) |  | ||||||
| { |  | ||||||
| 	if (hooks == NULL || proc == NULL) return; |  | ||||||
|  |  | ||||||
| 	switch (type) { |  | ||||||
| 	case ICONSOLE_HOOK_ACCESS: |  | ||||||
| 		hooks->access = proc; |  | ||||||
| 		break; |  | ||||||
| 	case ICONSOLE_HOOK_PRE_ACTION: |  | ||||||
| 		hooks->pre = proc; |  | ||||||
| 		break; |  | ||||||
| 	case ICONSOLE_HOOK_POST_ACTION: |  | ||||||
| 		hooks->post = proc; |  | ||||||
| 		break; |  | ||||||
| 	default: NOT_REACHED(); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Handle any special hook triggers. If the hook type is met check if |  | ||||||
|  * there is a function associated with that and if so, execute it |  | ||||||
|  * @param hooks @IConsoleHooks structure that will be checked |  | ||||||
|  * @param type type of hook, trigger that needs to be activated |  | ||||||
|  * @return true on a successfull execution of the hook command or if there |  | ||||||
|  * is no hook/trigger present at all. False otherwise |  | ||||||
|  */ |  | ||||||
| static bool IConsoleHookHandle(IConsoleHooks *hooks, IConsoleHookTypes type) |  | ||||||
| { |  | ||||||
| 	IConsoleHook *proc = NULL; |  | ||||||
| 	if (hooks == NULL) return false; |  | ||||||
|  |  | ||||||
| 	switch (type) { |  | ||||||
| 	case ICONSOLE_HOOK_ACCESS: |  | ||||||
| 		proc = hooks->access; |  | ||||||
| 		break; |  | ||||||
| 	case ICONSOLE_HOOK_PRE_ACTION: |  | ||||||
| 		proc = hooks->pre; |  | ||||||
| 		break; |  | ||||||
| 	case ICONSOLE_HOOK_POST_ACTION: |  | ||||||
| 		proc = hooks->post; |  | ||||||
| 		break; |  | ||||||
| 	default: NOT_REACHED(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return (proc == NULL) ? true : proc(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Add a hook to a command that will be triggered at certain points |  | ||||||
|  * @param name name of the command that the hook is added to |  | ||||||
|  * @param type type of hook that is added (ACCESS, BEFORE and AFTER change) |  | ||||||
|  * @param proc function called when the hook criteria is met |  | ||||||
|  */ |  | ||||||
| void IConsoleCmdHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc) |  | ||||||
| { |  | ||||||
| 	IConsoleCmd *cmd = IConsoleCmdGet(name); |  | ||||||
| 	if (cmd == NULL) return; |  | ||||||
| 	IConsoleHookAdd(&cmd->hook, type, proc); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Add a hook to a variable that will be triggered at certain points |  | ||||||
|  * @param name name of the variable that the hook is added to |  | ||||||
|  * @param type type of hook that is added (ACCESS, BEFORE and AFTER change) |  | ||||||
|  * @param proc function called when the hook criteria is met |  | ||||||
|  */ |  | ||||||
| void IConsoleVarHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *proc) |  | ||||||
| { |  | ||||||
| 	IConsoleVar *var = IConsoleVarGet(name); |  | ||||||
| 	if (var == NULL) return; |  | ||||||
| 	IConsoleHookAdd(&var->hook, type, proc); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Add a callback function to the variable. Some variables need |  * Add a callback function to the variable. Some variables need | ||||||
|  * very special processing, which can only be done with custom code |  * very special processing, which can only be done with custom code | ||||||
| @@ -1109,12 +1113,9 @@ void IConsoleCmdExec(const char *cmdstr) | |||||||
|  |  | ||||||
| 	 var = IConsoleVarGet(tokens[0]); | 	 var = IConsoleVarGet(tokens[0]); | ||||||
| 	 if (var != NULL) { | 	 if (var != NULL) { | ||||||
| 	 	if (IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_ACCESS)) { | 	 	if (IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_ACCESS)) | ||||||
| 	 		IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION); |  | ||||||
| 	 		IConsoleVarExec(var, t_index, &tokens[1]); | 	 		IConsoleVarExec(var, t_index, &tokens[1]); | ||||||
| 	 		if (t_index != 0) // value has indeed been changed |  | ||||||
| 	 			IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION); |  | ||||||
| 	 	} |  | ||||||
| 	 	return; | 	 	return; | ||||||
| 	 } | 	 } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1115,7 +1115,7 @@ DEF_CONSOLE_HOOK(ConHookServerName) | |||||||
|  |  | ||||||
| DEF_CONSOLE_HOOK(ConHookServerAdvertise) | DEF_CONSOLE_HOOK(ConHookServerAdvertise) | ||||||
| { | { | ||||||
| 	if (!_network_advertise) | 	if (!_network_advertise) // remove us from advertising | ||||||
| 		NetworkUDPRemoveAdvertise(); | 		NetworkUDPRemoveAdvertise(); | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								pool.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pool.c
									
									
									
									
									
								
							| @@ -10,7 +10,7 @@ void CleanPool(MemoryPool *pool) | |||||||
| { | { | ||||||
| 	uint i; | 	uint i; | ||||||
|  |  | ||||||
| 	DEBUG(misc, 4)("[Pool] (%s) Cleaing pool..", pool->name); | 	DEBUG(misc, 4)("[Pool] (%s) Cleaning pool..", pool->name); | ||||||
|  |  | ||||||
| 	/* Free all blocks */ | 	/* Free all blocks */ | ||||||
| 	for (i = 0; i < pool->current_blocks; i++) | 	for (i = 0; i < pool->current_blocks; i++) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Darkvater
					Darkvater