Empress
Technical News – July 2009
Empress API Cancel Functionality–
Allows Fast Interactive Application Response
 
Introduction
Empress
Ultra Embedded 10.20 offers many useful features for application developers.
One of those features is the Cancel Functionality for Empress C/C++ Kernel
Level API mr routines
Empress
Cancel Functionality
How many
times you found yourself in the situation when you had just started an
interactive database task and realized it was taking too long to finish? How
many times have you found yourself in the situation where you selected and
sorted 20GB of Wikipedia data on a PDA without the right index and were waiting
forever? How many times you found yourself in the situation when you invoked the
wrong task by accident and could not stop it unless you pressed “FACTORY RESET”?
All those situations can be under your control by using the new Empress Cancel Functionality.
Empress
Ultra Embedded V10.20 Cancel Functionality powers-up application developers to
implement an effective interactive response for their real-time applications.
All
Empress Kernel Level API mr routines are synchronous in   After an application calls a mr
routine, it has to wait until the Empress database engine completes all
internal operations in regards to that specific routine. Then the
question arises: how one can cancel a synchronous processing of any mr routine?
Let’s
assume that an application performs database tasks using Empress routines
API   in one thread of execution – we will
call this thread a worker thread. Empress new Cancel Functionality utilizes
another thread of execution to check   routine executing in the worker
thread and cancel its operation.
The Cancel
Functionality has been developed as an additional set of Empress C/C++ Kernel
Level API mr routines
Empress Cancel
Functionality mr C API
The
Empress cancel functionality is developed via the following set of additional Empress
C/C++ Kernel Level API – mr routines:
mrenableconn()-
turn off Cancel flag for that task
mrdisableconn()-
turn on Cancel flag for that task
mrgetdefaultconn()-
get info on mr task to set Cancel flag above
Example
Pseudo Code Using Cancel Functionality
In the
following pseudo code example cancel_db_task starts two threads,
a worker thread where all database tasks are performed and a main thread used
for canceling mr routines in the worker thread. Cancel activity is triggered
by invoking the routine mrdisableconn().
The pseudo
code example cancel_db_task is as follows:
/**** cancel_db_task ****/
Main(UI) Thread:
..
void* mrconnection =
NULL
Loop_on_UI_events()
{
 
 
 
 
 
 
 
 
 
if
(Button_Start_Pressed)
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if
(Worker_Thread_Not_Created)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Create_Worker_Thread()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (mrconnection !=
NULL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrenableconn(mrconnection)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Wake_Up_Worker_Thread()
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
if
(Button_Cancel_Pressed)
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cancelThread
= TRUE
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrdisableconn(mrconnection)
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
if
(Button_Exit_Pressed)
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrdisableconn(mrconnection)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cancelThread
= TRUE
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Set_Kill_Thread()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Wake_Up_Worker_Thread()
 
 
 
 
 
 
 
 
 
}
}
int
Worker_Thread_Func():
{
 
 
 
 
 
 
 
 
 
mstask_hdr      mtask
 
 
 
 
 
 
 
 
 
void*  mr = NULL
 
 
 
 
 
 
 
 
 
void*  mra = NULL
 
 
 
 
 
 
 
 
 
void*  mrr = NULL
 
 
 
 
 
 
 
 
 
void*  g = NULL
 
 
 
 
 
 
 
 
 
....
 
 
 
 
 
 
 
 
 
if
(!mstask_init_set_task (& task))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
if (!msinit())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
mrconnection =
mrgetdefaultconn
 
 
 
 
 
 
 
 
 
mr =
mrmktmpview("
db"
, " select id,
name from big_table" )
 
 
 
 
 
 
 
 
 
if (mr == NULL)
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
mrr =
mrmkrec(mr)
 
 
 
 
 
 
 
 
 
if (mrr == NULL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
mra =
mrngeta(mr, " name" )
 
 
 
 
 
 
 
 
 
if (mra == NULL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
Loop()
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Wait_for_Wakeup()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Enable_Cancel_Button()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (Kill_Thread)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
g =
mrsrtbegin(0, , 0, mrr, 0, mra, 0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (cancelThread ||
mroperr == MSMR_ERR_CONN_DISABLED)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
continue
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
else if (g == NULL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
while (TRUE)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (cancelThread)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
i
= mrget(g)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (cancelThread ||
mroperr == SMR_ERR_CONN_DISABLED)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (i != 1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
value
= mrgetvs(mrr, mra)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (cancelThread ||
mroperr == SMR_ERR_CONN_DISABLED)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
break
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (value == (void*)-1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
goto cleanup
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
process_valule()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if (g != NULL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
disable_cancel_button()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrenableconn(mrconnection)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrgetend(g)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
g
= NULL
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
enable_cancel_button()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}
 
 
 
 
 
 
 
 
 
}
cleanup:
 
 
 
 
 
 
 
 
 
/* Prevent cleanup code from being canceled */
 
 
 
 
 
 
 
 
 
Disable_Cancel_Button()
 
 
 
 
 
 
 
 
 
/* Re-enable MR connection to execute cleanup code */
 
 
 
 
 
 
 
 
 
if (mrconnection !=
NULL)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrenableconn(mrconnection)
 
 
 
 
 
 
 
 
 
if (mrr)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrfrrec(mrr)
 
 
 
 
 
 
 
 
 
if (mr)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrclose(mr)
 
 
 
 
 
 
 
 
 
if (g)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mrgetend(g)
 
 
 
 
 
 
 
 
 
msend()
 
 
 
 
 
 
 
 
 
mstask_end_task
(&
task)
 
 
 
 
 
 
 
 
 
mrconnection =
0
 
 
 
 
 
 
 
 
 
enable_cancel_button()
 
 
 
 
 
 
 
 
 
....
}  
Thediagram in the Fig 1 shows the simplified flow of activities in the
pseudo code example
Fig 1: Empress Cancel Functionality
 
Instead of Summary
Empress Cancel functionality can be  useful for developers of interactive
applications.
On the other hand, developers may
find that Empress Timeout functionality may be more convenient for those
applications that run without user interaction.
It’s your choice!!!
Empress
Software Inc.
www.empress.com
|