diff -r 773449708c84 -r 4ad59aaee882 javauis/javalegacyutils/src/eventserver/J9MIDEventServer.cpp --- a/javauis/javalegacyutils/src/eventserver/J9MIDEventServer.cpp Thu Sep 02 20:20:40 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,268 +0,0 @@ -/* -* Copyright (c) 2006-2006 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - - -#include - -#include -#include - -#include "eventserverglobals.h" -#include "CJavaEventServer.h" -#include "com_nokia_mj_impl_rt_legacy_MemoryUtil.h" -#include "com_nokia_mj_impl_rt_legacy_EventProcessor.h" - -RArray& EventServerHandles(); //Must be consistent with implementation -//in MIDEventServer.cpp in jniutils - - -const TInt KQueueGranularity = 100; // Define iQueue default granularity -const TInt KCompressThreshold = 100; // Define number of processed events - - -void InitEventServer() -{ - TRAPD(err, CEventQueue::InitL()); - if (err != KErrNone) - { - User::Panic(_L("EventServer::can't initialize event queue"), err); - } -} - -// Cleanup the event server; called from Java event dispatch thread -void CleanupEventServer() -{ - CJavaEventServer::Cleanup(EventServerHandles()); -} - -// Dispatch event to Java, called from Java event dispatch thread -void RunJavaEventServer(JNIEnv* aJni, TInt aServer) -{ - CJavaEventBase* ev = (CJavaEventBase*) aServer; - if (aServer != KErrServerTerminated) - { - ev->Run(*aJni); - } -} - - -JNIEXPORT jlong JNICALL Java_com_nokia_mj_impl_rt_legacy_MemoryUtil__1getFreeRAMInKB(JNIEnv*, jclass) -{ - TInt mem = 0; - TInt err = HAL::Get(HALData::EMemoryRAMFree, mem); - if (err == KErrNone) - { - return mem / 1024; - } - else - { - return err; - } -} - -JNIEXPORT void JNICALL Java_com_nokia_mj_impl_rt_legacy_EventProcessor__1dispatchCallbacks(JNIEnv* aJni, jclass /*aClass*/, jint aThread) -{ - TInt eventServer; - // Loop for event dispatching - InitEventServer(); - while ((eventServer = CEventQueue::GetQueue(aThread)->GetNext()) != 0) - { - RunJavaEventServer(aJni, eventServer); - } -} - -JNIEXPORT void JNICALL Java_com_nokia_mj_impl_rt_legacy_EventProcessor__1exitThreads(JNIEnv*, jclass) -{ - CEventQueue::OnCloseThreads(); -} -// class CIntQueue -CIntQueue::CIntQueue() : iQueue(KQueueGranularity), iCompressCounter(0) -{ -} - -CIntQueue* CIntQueue::NewL() -{ - CIntQueue* self = NewLC(); - CleanupStack::Pop(self); - return self; -} - -CIntQueue* CIntQueue::NewLC() -{ - CIntQueue* self = new(ELeave) CIntQueue(); - CleanupStack::PushL(self); - self->ConstructL(); - - return self; -} - -void CIntQueue::ConstructL() -{ - iMutex.CreateLocal(); - iFull.CreateLocal(0); -} - -CIntQueue::~CIntQueue() -{ - iMutex.Close(); - iFull.Close(); - iQueue.Close(); -} - -// Add integer to the end of the queue -void CIntQueue::Enqueue(TInt aValue) -{ - iMutex.Wait(); // enter critical region - PutItem(aValue); // put new item to the buffer - iMutex.Signal(); // leave critical region - iFull.Signal(); // inform dispatcher about new event -} - -// Return integer from the beginning of the queue -TInt CIntQueue::Dequeue() -{ - iFull.Wait(); // decrement count of full slots - iMutex.Wait(); // enter critical region - TInt ret = RemoveItem(); // take item from the buffer - iMutex.Signal(); // leave critical region - - return ret; -} - -void CIntQueue::PutItem(TInt aValue) -{ - TInt err = iQueue.Append(aValue); // put new item to the buffer - __ASSERT_ALWAYS((err == KErrNone), User::Invariant()); -} - -TInt CIntQueue::RemoveItem() -{ - TInt ret = iQueue[0]; // take item from the buffer - iQueue.Remove(0); - - iCompressCounter++; - if (iCompressCounter == KCompressThreshold) - { - iQueue.GranularCompress(); - iCompressCounter = 0; - } - - return ret; -} - -TBool CIntQueue::IsEmpty() -{ - return (iQueue.Count() == 0); -} - -/* ******************************************** */ - -CEventQueue* CEventQueue::GetQueue(TInt aThread) -{ - return getEsStaticData()->mLocks[aThread]; -} - -CEventQueue::CEventQueue() -{ -} - -void CEventQueue::ConstructL() -{ - iEventQueue = CIntQueue::NewL(); -} - -CEventQueue::~CEventQueue() -{ - while (!iEventQueue->IsEmpty()) - { - TInt event = GetNext(); - if (event != KErrServerTerminated) - { - CJavaEventBase* ev = reinterpret_cast(event); - CJavaEventSourceBase& source = ev->Object(); - - if (ev->IsDisposable()) - { - delete ev; - } - source.OnVmClose(); - } - } - delete iEventQueue; -} - -// Notify that new event has been posted. Called from the native code. -// aEventServer is C++ pointer to event server object and aThreadNumber indicates the event type -// and therefore which dispatcher thread should handle it - -void CEventQueue::NotifyServer(TInt aEventServer, TInt aThreadNumber) -{ - ASSERT(aThreadNumber < KDispatchThreads); - - // Add event server of an event to the queue - GetQueue(aThreadNumber)->iEventQueue->Enqueue(aEventServer); - -} - -// Get the next event server from the queue; wait if there are no events to be dispatched -TInt CEventQueue::GetNext() -{ - return iEventQueue->Dequeue(); -} - -void CEventQueue::OnCloseThreads() -{ - //sends fake zero events to exit from native loop back to java - for (int i = 0; i < KDispatchThreads; i++) - { - GetQueue(i)->NewEvent(0); - } -} - -// Add event server of an event to the queue -void CEventQueue::NewEvent(TInt aEventServer) -{ - iEventQueue->Enqueue(aEventServer); -} - - -void CEventQueue::Cleanup() -{ - EventServerGlobals* esd = getEsStaticData(); - for (int i = 0; i < KDispatchThreads; i++) - { - delete esd->mLocks[i]; - esd->mLocks[i] = 0; - } -} - -void CEventQueue::InitL() -{ - EventServerGlobals* esd = getEsStaticData(); - for (int i = 0; i < KDispatchThreads; i++) - { - if (esd->mLocks[i] == 0) - { - CEventQueue* self = new(ELeave) CEventQueue(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(); - esd->mLocks[i] = self; - } - } -} -