Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// Purpose: Implementation of static functions for use by debug driver classes
//
#include "debug_logging.h"
#include "debug_utils.h"
/**
* Given a thread ID, return a handle to the corresponding DThread. If the returned
* pointer is non-NULL, it is the responsibility of the caller to close the handle.
*
* @post if a non-NULL value is returned then a handle to the thread has been
* opened on the callers behalf
* @param aThreadId ID of the thread to return a handle for
* @return a DThread* to the appropriate thread, or NULL if a handle could not be
* opened to the specified thread
*/
DThread* DebugUtils::OpenThreadHandle(const TUint64 aThreadId)
{
LOG_MSG("DebugUtils::OpenThreadHandle()");
NKern::ThreadEnterCS(); // Prevent us from dying or suspending whilst holding a DMutex
DObjectCon& threads = *Kern::Containers()[EThread]; // Get containing holding threads
threads.Wait(); // Obtain the container mutex so the list does get changed under us
DThread* thread = Kern::ThreadFromId(aThreadId);
// Open a handle to the thread so that it doesn't exit while we are processing
if (thread)
{
// if opening a handle fails then set thread to NULL
if(KErrNone != thread->Open())
{
LOG_MSG2("\tCould not open handle to thread %d", (TUint32)aThreadId);
thread = NULL;
}
}
else
{
LOG_MSG2("\tThread with ID %d is NULL", (TUint32)aThreadId);
}
threads.Signal(); // Release the container mutex
NKern::ThreadLeaveCS(); // End of critical section
return thread;
}
/**
* Given a process ID, return a handle to the corresponding DProcess. If the returned
* pointer is non-NULL, it is the responsibility of the caller to close the handle.
*
* @post if a non-NULL value is returned then a handle to the process has been
* opened on the callers behalf
* @param aProcessId ID of the process to return a handle for
* @return a DProcess* to the appropriate process, or NULL if a handle could not be
* opened to the specified process
*/
DProcess* DebugUtils::OpenProcessHandle(const TUint64 aProcessId)
{
// Commenting out this message as it gets printed out every time a RDebug::Printf statement is caught by the driver,
// which makes looking at the serial cable output irritating. Replaced it with LOG_MSG statements below to indicate if
// something amiss happened. By default then this function prints nothing out.
//LOG_MSG("DebugUtils::OpenProcessHandle()");
NKern::ThreadEnterCS(); // Prevent us from dying or suspending whilst holding a DMutex
DObjectCon& processes = *Kern::Containers()[EProcess]; // Get containing holding threads
processes.Wait(); // Obtain the container mutex so the list does get changed under us
DProcess* process = Kern::ProcessFromId(aProcessId);
// Open a handle to the process so that it doesn't exit while we are processing
if (process)
{
// if opening a handle fails then set process to NULL
if(KErrNone != process->Open())
{
LOG_MSG2("DebugUtils::OpenProcessHandle(): Could not open handle for 0x%016lx", aProcessId);
process = NULL;
}
}
else
{
LOG_MSG2("DebugUtils::OpenProcessHandle(): Could not find process for 0x%016lx", aProcessId);
}
processes.Signal(); // Release the container mutex
NKern::ThreadLeaveCS(); // End of critical section
return process;
}