The sample at the thread start is correct. just try it and you should see.
I have free 5min and just tried your sample:
Code:
INT32 firenumber = 0;

function inc_firenumber()
{
	++firenumber;
	DBG_INFO1("firenumber:%d.", firenumber)
}

function clear_firenumber()
{
	firenumber = 0;
	DBG_INFO1("firenumber:%d.", firenumber)
}

void main()
{
	on_i = inc_firenumber;
	on_c = clear_firenumber;
	while(firenumber<5)
	{
		DBG_INFO1("inside loop - firenumber:%d.", firenumber)
		wait(-1);
	} 
	DBG_INFO1("EXIT firenumber:%d.", firenumber)
}



this is the console output (I pressed the 'I' key periodically):
Code:
[INF|temp_test.c|main] inside loop - firenumber:0.
[INF|temp_test.c|inc_firenumber] firenumber:1.
[INF|temp_test.c|main] inside loop - firenumber:1.
[INF|temp_test.c|main] inside loop - firenumber:1.
[INF|temp_test.c|inc_firenumber] firenumber:2.
[INF|temp_test.c|main] inside loop - firenumber:2.
[INF|temp_test.c|main] inside loop - firenumber:2.
[INF|temp_test.c|main] inside loop - firenumber:2.
[INF|temp_test.c|inc_firenumber] firenumber:3.
[INF|temp_test.c|main] inside loop - firenumber:3.
[INF|temp_test.c|inc_firenumber] firenumber:4.
[INF|temp_test.c|main] inside loop - firenumber:4.
[INF|temp_test.c|main] inside loop - firenumber:4.
[INF|temp_test.c|inc_firenumber] firenumber:5.
[INF|temp_test.c|main] EXIT firenumber:5.


there are few reason to get failed with your loop:
- a global variable modified suddenly (somewhere in your code); for example, inside an action of many concurrent entities;
- global variable has wrong type (comparing with 'while' statement); for example using signed or high precision var to test smth like: "x == .5"
- wrong 'while' statement;

suggestions:
- at first, search over your files for the 'firenumber' to see, where you try to modify it.
- at second, add more debug printouts to see the execution flow.
- try to debug.