Sun Microsystems 2 Wireless Office Headset User Manual


 
Chapter 2 Multitasking Safety 15
{
if (initialized == 0) {
initialized = 1;
mw_init();
}
KNI_ReturnVoid();
}
Note that no mutual exclusion is necessary in native methods. The CLDC HotSpot
Implementation has a single thread that runs all Java threads and all native methods.
This thread can run at most one native method at a time. The system cannot context-
switch to another Java thread while it is in the midst of a native method. Therefore,
in the CLDC HotSpot Implementation, all native methods are essentially critical
sections. This makes it possible to write native code without many concurrency
considerations.
Note Your system might employ multiple native threads. If this is the case, you
might need to employ native-level mutual exclusion facilities such as Pthreads
mutexes.
While it is convenient to treat each native method as a critical section, one must
ensure that data access and updates are done within a single native method. If any
logic about updating native state is performed by Java code, such as mixing Java and
native methods, or by making multiple native method calls, this creates race
conditions. Running any Java code provides an opportunity for Java threads to be
context switched, and conditions established by code before the context switch
might be invalid after the context switch. The example from
CODE EXAMPLE 2-6
suffers from exactly this problem.
Establishing Per-Task Context
Migrating Java platform data to native can work well for global singletons, but it
doesn’t work for other situations. In the case of the cook operation, the data is built
using a sequence of setup calls to mw_settime() and mw_setpower(), followed
by a call to mw_cook() that initiates the operation using the parameters previously
set up. The library implicitly stores this information in its internal static data. Thus,
it’s effectively global.
But no global data exists because the data really belongs to the thread that’s setting
up to initiate the cooking operation. In this case, the data needs to be migrated
upward to be closer to the calling thread. The setup data doesn’t need to be sent to
the microwave library until immediately prior to the call to the mw_cook() function.