0
|
1 |
// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
2 |
// All rights reserved.
|
|
3 |
// This component and the accompanying materials are made available
|
|
4 |
// under the terms of the License "Eclipse Public License v1.0"
|
|
5 |
// which accompanies this distribution, and is available
|
|
6 |
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
7 |
//
|
|
8 |
// Initial Contributors:
|
|
9 |
// Nokia Corporation - initial contribution.
|
|
10 |
//
|
|
11 |
// Contributors:
|
|
12 |
//
|
|
13 |
// Description:
|
|
14 |
// e32\euser\us_ksvr.cpp
|
|
15 |
//
|
|
16 |
//
|
|
17 |
|
|
18 |
#include "us_std.h"
|
|
19 |
#include "us_data.h"
|
|
20 |
#include <e32svr.h>
|
|
21 |
#include <e32uid.h>
|
|
22 |
#include <e32ldr.h>
|
|
23 |
|
|
24 |
//#define __DEBUG_IMAGE__ 1
|
|
25 |
#if defined(__DEBUG_IMAGE__) && defined (__EPOC32__)
|
|
26 |
#define __IF_DEBUG(t) {RDebug::t;}
|
|
27 |
#else
|
|
28 |
#define __IF_DEBUG(t)
|
|
29 |
#endif
|
|
30 |
|
|
31 |
//
|
|
32 |
// class RNotifier
|
|
33 |
//
|
|
34 |
|
|
35 |
/**
|
|
36 |
Requests the extended notifier server to start the notifier identified by
|
|
37 |
the specified UID.
|
|
38 |
|
|
39 |
The request is synchronous; the call returns when the request is complete.
|
|
40 |
|
|
41 |
The notifier may not be started immediately if a higher priority notifier is
|
|
42 |
already active. In this case, the notifier is queued until it has the highest
|
|
43 |
priority outstanding request for the channel(s) it operates on.
|
|
44 |
|
|
45 |
@param aNotifierUid The UID identifying the notifier.
|
|
46 |
@param aBuffer Data that can be passed to the notifier; the format and meaning
|
|
47 |
of this depends on the notifier.
|
|
48 |
|
|
49 |
@return KErrNone, if successful;
|
|
50 |
KErrNotFound, if there is no notifier matching the specified UID;
|
|
51 |
KErrAlreadyExists, if the notifier has already been started, or has
|
|
52 |
an outstanding start request. It may also return with one of the other
|
|
53 |
system-wide error codes, if the notifier cannot be started by
|
|
54 |
the server due to low memory or it leaves from its server side
|
|
55 |
call to StartL().
|
|
56 |
|
|
57 |
@see CServer
|
|
58 |
*/
|
|
59 |
EXPORT_C TInt RNotifier::StartNotifier(TUid aNotifierUid, const TDesC8& aBuffer)
|
|
60 |
{
|
|
61 |
return SendReceive(EStartNotifier, TIpcArgs(
|
|
62 |
(TInt)aNotifierUid.iUid,
|
|
63 |
&aBuffer,
|
|
64 |
(TAny*)NULL // No resonse required
|
|
65 |
));
|
|
66 |
}
|
|
67 |
|
|
68 |
|
|
69 |
|
|
70 |
|
|
71 |
/**
|
|
72 |
Requests the extended notifier server to start the notifier identified by
|
|
73 |
the specified UID.
|
|
74 |
|
|
75 |
The request is synchronous; the call returns when the request is complete.
|
|
76 |
|
|
77 |
The notifier may not start immediately if a higher priority notifier is
|
|
78 |
already active. In this case, the notifier is queued until it has the highest
|
|
79 |
priority outstanding request for the channel(s) it operates on.
|
|
80 |
This can also cause unexpected behaviour: the function can return
|
|
81 |
before the notifier has been started with the added consequence that no response
|
|
82 |
data is written.
|
|
83 |
|
|
84 |
For this reason, this function has been deprecated. Instead, use
|
|
85 |
RNotifier::StartNotifierAndGetResponse(), or if there is no need to wait for a
|
|
86 |
response, use the two argument overload of RNotifier::StartNotifier().
|
|
87 |
|
|
88 |
@param aNotifierUid The UID identifying the notifier.
|
|
89 |
@param aBuffer Data that can be passed to the notifier; the format and meaning
|
|
90 |
of this depends on the notifier.
|
|
91 |
@param aResponse Response data; the format
|
|
92 |
and meaning of this depends on the notifier.
|
|
93 |
|
|
94 |
@return KErrNone, if successful;
|
|
95 |
KErrNotFound, if there is no notifier matching the specified UID;
|
|
96 |
KErrAlreadyExists, if the notifier has already been started, or has
|
|
97 |
an outstanding start request. It may also return with one of the other
|
|
98 |
system-wide error codes, if the notifier cannot be started by
|
|
99 |
the server due to low memory or it leaves from its server side
|
|
100 |
call to StartL().
|
|
101 |
|
|
102 |
@see CServer
|
|
103 |
|
|
104 |
@deprecated use RNotifier::StartNotifierAndGetResponse(), or if there is no
|
|
105 |
need to wait for a response, use the two argument overload
|
|
106 |
of RNotifier::StartNotifier()
|
|
107 |
*/
|
|
108 |
EXPORT_C TInt RNotifier::StartNotifier(TUid aNotifierUid, const TDesC8& aBuffer, TDes8& aResponse)
|
|
109 |
{
|
|
110 |
return SendReceive(EStartNotifier, TIpcArgs(
|
|
111 |
(TInt)aNotifierUid.iUid,
|
|
112 |
&aBuffer,
|
|
113 |
&aResponse
|
|
114 |
));
|
|
115 |
}
|
|
116 |
|
|
117 |
/*
|
|
118 |
This function has never been implemented on any Symbian OS version.
|
|
119 |
It always returns KErrNotSupported.
|
|
120 |
@publishedPartner
|
|
121 |
@removed
|
|
122 |
*/
|
|
123 |
EXPORT_C TInt RNotifier::StartNotifier(TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse)
|
|
124 |
{
|
|
125 |
return SendReceive(EStartNotifierFromSpecifiedDll, TIpcArgs(
|
|
126 |
(TInt)aNotifierUid.iUid,
|
|
127 |
&aBuffer,
|
|
128 |
&aResponse,
|
|
129 |
(TInt)aNotifierDllUid.iUid
|
|
130 |
));
|
|
131 |
}
|
|
132 |
|
|
133 |
/**
|
|
134 |
Requests the extended notifier server to cancel the notifier identified by
|
|
135 |
the specified UID.
|
|
136 |
|
|
137 |
The request is synchronous; the call returns when the request is complete.
|
|
138 |
|
|
139 |
Any notifier that was queued pending the completion of aNotifierUid will be
|
|
140 |
automatically started.
|
|
141 |
|
|
142 |
@param aNotifierUid The UID identifying the notifier.
|
|
143 |
|
|
144 |
@return KErrNone, if successful;
|
|
145 |
KErrNotFound, if there is no notifier matching the specified UID.
|
|
146 |
*/
|
|
147 |
EXPORT_C TInt RNotifier::CancelNotifier(TUid aNotifierUid)
|
|
148 |
{
|
|
149 |
return SendReceive(ECancelNotifier, TIpcArgs( (TInt)aNotifierUid.iUid ));
|
|
150 |
}
|
|
151 |
|
|
152 |
/**
|
|
153 |
Requests the extended notifier server to update the active notifier identified by
|
|
154 |
the specified UID.
|
|
155 |
|
|
156 |
The request is synchronous; the call returns when the request is complete.
|
|
157 |
|
|
158 |
@param aNotifierUid The UID identifying the notifier.
|
|
159 |
@param aBuffer Data that can be passed to the notifier; the format and meaning
|
|
160 |
of this depends on the notifier.
|
|
161 |
@param aResponse Reserved for future use.
|
|
162 |
|
|
163 |
@return KErrNone, if successful;
|
|
164 |
KErrNotFound, if there is no notifier matching the specified UID.
|
|
165 |
*/
|
|
166 |
EXPORT_C TInt RNotifier::UpdateNotifier(TUid aNotifierUid, const TDesC8& aBuffer,TDes8& aResponse)
|
|
167 |
{
|
|
168 |
return SendReceive(EUpdateNotifier, TIpcArgs(
|
|
169 |
(TInt)aNotifierUid.iUid,
|
|
170 |
&aBuffer,
|
|
171 |
&aResponse
|
|
172 |
));
|
|
173 |
}
|
|
174 |
|
|
175 |
/**
|
|
176 |
Requests the extended notifier server to update the active notifier identified by
|
|
177 |
the specified UID.
|
|
178 |
|
|
179 |
This is an asynchronous request.It may be called multiple times for
|
|
180 |
some notifier implementations; see specific notifier documentation for exact details.
|
|
181 |
|
|
182 |
@param aRs The request status. On request completion, contains:
|
|
183 |
KErrNone, if successful; otherwise, one of the other system
|
|
184 |
wide error codes.
|
|
185 |
@param aNotifierUid The UID identifying the notifier.
|
|
186 |
@param aBuffer Data that can be passed to the notifier; the format and meaning
|
|
187 |
of this depends on the notifier.
|
|
188 |
@param aResponse Reserved for future use.
|
|
189 |
|
|
190 |
*/
|
|
191 |
EXPORT_C void RNotifier::UpdateNotifierAndGetResponse(TRequestStatus& aRs, TUid aNotifierUid, const TDesC8& aBuffer, TDes8& aResponse)
|
|
192 |
{
|
|
193 |
SendReceive(EUpdateNotifierAndGetResponse, TIpcArgs(
|
|
194 |
(TInt)aNotifierUid.iUid,
|
|
195 |
&aBuffer,
|
|
196 |
&aResponse
|
|
197 |
), aRs);
|
|
198 |
}
|
|
199 |
|
|
200 |
/**
|
|
201 |
Requests the extended notifier server to start the notifier identified by
|
|
202 |
the specified UID.
|
|
203 |
|
|
204 |
This is an asynchronous request.It may be called multiple times for
|
|
205 |
some notifier implementations; see specific notifier documentation for exact details.
|
|
206 |
|
|
207 |
@param aRs The request status. On request completion, contains:
|
|
208 |
KErrNone, if successful; otherwise, one of the other system
|
|
209 |
wide error codes.
|
|
210 |
@param aNotifierUid The UID identifying the notifier.
|
|
211 |
@param aBuffer Data that can be passed to the notifier; the format
|
|
212 |
and meaning of this depends on the notifier.
|
|
213 |
@param aResponse Response data; the format
|
|
214 |
and meaning of this depends on the notifier.
|
|
215 |
*/
|
|
216 |
EXPORT_C void RNotifier::StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse)
|
|
217 |
{
|
|
218 |
SendReceive(EStartNotifierAndGetResponse, TIpcArgs(
|
|
219 |
(TInt)aNotifierUid.iUid,
|
|
220 |
&aBuffer,
|
|
221 |
&aResponse
|
|
222 |
), aRs);
|
|
223 |
}
|
|
224 |
|
|
225 |
|
|
226 |
|
|
227 |
|
|
228 |
/**
|
|
229 |
@publishedPartner
|
|
230 |
@removed
|
|
231 |
|
|
232 |
This function has never been implemented on any Symbian OS version.
|
|
233 |
The request always completes with KErrNotSupported.
|
|
234 |
*/
|
|
235 |
EXPORT_C void RNotifier::StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse)
|
|
236 |
{
|
|
237 |
SendReceive(EStartNotifierFromSpecifiedDllAndGetResponse, TIpcArgs(
|
|
238 |
(TInt)aNotifierUid.iUid,
|
|
239 |
&aBuffer,
|
|
240 |
&aResponse,
|
|
241 |
(TInt)aNotifierDllUid.iUid
|
|
242 |
), aRs);
|
|
243 |
}
|
|
244 |
|
|
245 |
|
|
246 |
|
|
247 |
|
|
248 |
/**
|
|
249 |
@publishedPartner
|
|
250 |
@removed
|
|
251 |
|
|
252 |
This function has never been implemented on any Symbian OS version.
|
|
253 |
It always returns KErrNotSupported.
|
|
254 |
*/
|
|
255 |
EXPORT_C TInt RNotifier::UnloadNotifiers(TUid /*aNotifierUid*/)
|
|
256 |
{
|
|
257 |
return KErrNotSupported;
|
|
258 |
}
|
|
259 |
|
|
260 |
|
|
261 |
|
|
262 |
|
|
263 |
/**
|
|
264 |
@publishedPartner
|
|
265 |
@removed
|
|
266 |
|
|
267 |
This function has never been implemented on any Symbian OS version.
|
|
268 |
It always returns KErrNotSupported.
|
|
269 |
*/
|
|
270 |
EXPORT_C TInt RNotifier::LoadNotifiers(TUid /*aNotifierUid*/)
|
|
271 |
{
|
|
272 |
return KErrNotSupported;
|
|
273 |
}
|
|
274 |
|
|
275 |
|
|
276 |
|
|
277 |
|
|
278 |
/**
|
|
279 |
Default constructor.
|
|
280 |
*/
|
|
281 |
EXPORT_C RNotifier::RNotifier()
|
|
282 |
: iButtonVal(NULL,0),
|
|
283 |
iCombinedBuffer(NULL)
|
|
284 |
{}
|
|
285 |
|
|
286 |
|
|
287 |
|
|
288 |
|
|
289 |
/**
|
|
290 |
Connects to the extended notifier server, creating a session with that server.
|
|
291 |
Note: Notifier server is started during window server start-up sequence.
|
|
292 |
|
|
293 |
The function must be called before any other function.
|
|
294 |
|
|
295 |
@return KErrNone, if successful, otherwise one of the other system-wide error codes
|
|
296 |
*/
|
|
297 |
EXPORT_C TInt RNotifier::Connect()
|
|
298 |
{
|
|
299 |
return CreateSession(__NOTIFIER_NAME,TVersion(KNotifierMajorVersionNumber,KNotifierMinorVersionNumber,KNotifierBuildVersionNumber),-1);
|
|
300 |
}
|
|
301 |
|
|
302 |
|
|
303 |
|
|
304 |
|
|
305 |
/**
|
|
306 |
Launches a simple two line dialog that displays two lines of text.
|
|
307 |
|
|
308 |
This is an asynchronous request that completes when the dialog exits.
|
|
309 |
|
|
310 |
@param aLine1 A descriptor containing the first line of text to be displayed.
|
|
311 |
@param aLine2 A descriptor containing the second line of text to be displayed.
|
|
312 |
@param aBut1 A descriptor containing text to be displayed in the first button.
|
|
313 |
@param aBut2 A descriptor containing text to be displayed in the (optional) second button.
|
|
314 |
@param aButtonVal An integer value which is set when the dialog exits. It is set to:
|
|
315 |
0, if the first button is selected;
|
|
316 |
1, if the second button is selected.
|
|
317 |
@param aStatus The request status object. If the request completes normally, this is set to KErrNone.
|
|
318 |
*/
|
|
319 |
EXPORT_C void RNotifier::Notify(const TDesC& aLine1,const TDesC& aLine2,const TDesC& aBut1,const TDesC& aBut2, TInt& aButtonVal, TRequestStatus& aStatus)
|
|
320 |
{
|
|
321 |
const TInt requiredLengthOfCombinedBuffer=aLine1.Length()+aLine2.Length()+aBut1.Length()+aBut2.Length();
|
|
322 |
if ((iCombinedBuffer!=NULL) && (iCombinedBuffer->Des().MaxLength()<requiredLengthOfCombinedBuffer))
|
|
323 |
{
|
|
324 |
delete iCombinedBuffer;
|
|
325 |
iCombinedBuffer=NULL;
|
|
326 |
}
|
|
327 |
if (iCombinedBuffer==NULL)
|
|
328 |
{
|
|
329 |
iCombinedBuffer=HBufC::New(requiredLengthOfCombinedBuffer);
|
|
330 |
}
|
|
331 |
if (iCombinedBuffer==NULL)
|
|
332 |
{
|
|
333 |
// report the error back via the TRequestStatus
|
|
334 |
TRequestStatus* status=&aStatus;
|
|
335 |
User::RequestComplete(status,KErrNoMemory);
|
|
336 |
}
|
|
337 |
else
|
|
338 |
{
|
|
339 |
TPtr combinedBufferForNotify(iCombinedBuffer->Des());
|
|
340 |
combinedBufferForNotify = aLine1;
|
|
341 |
combinedBufferForNotify.Append(aLine2);
|
|
342 |
combinedBufferForNotify.Append(aBut1);
|
|
343 |
combinedBufferForNotify.Append(aBut2);
|
|
344 |
iButtonVal.Set(REINTERPRET_CAST(TUint8*,&aButtonVal),sizeof(TInt),sizeof(TInt));
|
|
345 |
__ASSERT_ALWAYS(((aLine1.Length()|aLine2.Length()|aBut1.Length()|aBut2.Length())&~KMaxTUint16)==0,Panic(ENotifierTextTooLong)); // check that all of the descriptor lengths are less than or equal to KMaxTUint16
|
|
346 |
SendReceive(ENotifierNotify,TIpcArgs(&iButtonVal,iCombinedBuffer,(aLine1.Length()<<16)|aLine2.Length(),(aBut1.Length()<<16)|aBut2.Length()),aStatus);
|
|
347 |
}
|
|
348 |
}
|
|
349 |
|
|
350 |
|
|
351 |
|
|
352 |
|
|
353 |
/**
|
|
354 |
Not implemented by the server.
|
|
355 |
*/
|
|
356 |
EXPORT_C void RNotifier::NotifyCancel()
|
|
357 |
{
|
|
358 |
SendReceive(ENotifierNotifyCancel,TIpcArgs()); // ignores any returned error
|
|
359 |
}
|
|
360 |
|
|
361 |
|
|
362 |
|
|
363 |
|
|
364 |
/**
|
|
365 |
Closes the notifier.
|
|
366 |
*/
|
|
367 |
EXPORT_C void RNotifier::Close()
|
|
368 |
{
|
|
369 |
delete iCombinedBuffer;
|
|
370 |
iCombinedBuffer=NULL;
|
|
371 |
RSessionBase::Close();
|
|
372 |
}
|
|
373 |
|
|
374 |
|
|
375 |
|
|
376 |
|
|
377 |
/**
|
|
378 |
@internalAll
|
|
379 |
*/
|
|
380 |
EXPORT_C TInt RNotifier::InfoPrint(const TDesC& aDes)
|
|
381 |
{
|
|
382 |
return SendReceive(ENotifierInfoPrint, TIpcArgs(&aDes));
|
|
383 |
}
|
|
384 |
|
|
385 |
|
|
386 |
//
|
|
387 |
// Class TChunkCreateInfo
|
|
388 |
//
|
|
389 |
|
|
390 |
/**
|
|
391 |
Default constructor.
|
|
392 |
|
|
393 |
This defaults the chunk to be created to be local, to have no attributes set
|
|
394 |
and to use the default clear byte.
|
|
395 |
|
|
396 |
A local chunk is private to the process creating it and is not
|
|
397 |
intended for access by other user processes.
|
|
398 |
*/
|
|
399 |
EXPORT_C TChunkCreateInfo::TChunkCreateInfo() :
|
|
400 |
// Specifing individual initialisers for members instead of using memclear
|
|
401 |
// so that Coverity doesn't complain about uninitialised local variables in
|
|
402 |
// calls to e.g., TChunkCreateInfo::SetPaging().
|
|
403 |
iVersionNumber(0),
|
|
404 |
iType(TChunkCreate::ENormal),
|
|
405 |
iGlobal(EFalse),
|
|
406 |
iMaxSize(0),
|
|
407 |
iOwnerType(EOwnerProcess),
|
|
408 |
iName(NULL),
|
|
409 |
iInitialBottom(0),
|
|
410 |
iInitialTop(0),
|
|
411 |
iAttributes(TChunkCreate::EPagingUnspec),
|
|
412 |
iClearByte(KChunkClearByteDefault)
|
|
413 |
{
|
|
414 |
}
|
|
415 |
|
|
416 |
|
|
417 |
/**
|
|
418 |
Sets the chunk to be created to have a committed region that always starts at the
|
|
419 |
bottom of the reserved region.
|
|
420 |
|
|
421 |
|
|
422 |
@param aSize The number of bytes committed to this chunk.
|
|
423 |
@param aMaxSize The maximum size to which the reserved region of this chunk
|
|
424 |
can grow.
|
|
425 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
426 |
chunk handle. If not explicitly specified, EOwnerProcess is
|
|
427 |
taken as default.
|
|
428 |
@see RChunk::CreateLocal()
|
|
429 |
*/
|
|
430 |
EXPORT_C void TChunkCreateInfo::SetNormal(TInt aInitialSize, TInt aMaxSize)
|
|
431 |
{
|
|
432 |
iType = TChunkCreate::ENormal | TChunkCreate::EData;
|
|
433 |
iInitialBottom = 0;
|
|
434 |
iInitialTop = aInitialSize;
|
|
435 |
iMaxSize = aMaxSize;
|
|
436 |
}
|
|
437 |
|
|
438 |
|
|
439 |
/**
|
|
440 |
Sets the chunk to be created to be user writable and to be marked by the kernel
|
|
441 |
as containing code.
|
|
442 |
This can only be set on local chunks.
|
|
443 |
|
|
444 |
@param aInitialSize The number of bytes committed to this chunk.
|
|
445 |
@param aMaxSize The maximum size to which the reserved region of this chunk
|
|
446 |
can grow.
|
|
447 |
@see RChunk::CreateLocalCode()
|
|
448 |
*/
|
|
449 |
EXPORT_C void TChunkCreateInfo::SetCode(TInt aInitialSize, TInt aMaxSize)
|
|
450 |
{
|
|
451 |
iType = TChunkCreate::ENormal | TChunkCreate::ECode;
|
|
452 |
iInitialBottom = 0;
|
|
453 |
iInitialTop = aInitialSize;
|
|
454 |
iMaxSize = aMaxSize;
|
|
455 |
}
|
|
456 |
|
|
457 |
|
|
458 |
/**
|
|
459 |
Sets the chunk to be created to have a commited region that that can be any
|
|
460 |
contiguous subset of the reserved region.
|
|
461 |
|
|
462 |
@param aInitialBottom The offset of the bottom of the new committed region
|
|
463 |
from the base of the chunk's reserved region.
|
|
464 |
@param aInitialTop The offset of the top of the new committed region from
|
|
465 |
the base of the chunk's reserved region.
|
|
466 |
@param aMaxSize The maximum size to which the reserved region of
|
|
467 |
this chunk can grow.
|
|
468 |
@see RChunk::CreateDoubleEndedLocal()
|
|
469 |
*/
|
|
470 |
EXPORT_C void TChunkCreateInfo::SetDoubleEnded(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize)
|
|
471 |
{
|
|
472 |
iType = TChunkCreate::EDoubleEnded | TChunkCreate::EData;
|
|
473 |
iInitialBottom = aInitialBottom;
|
|
474 |
iInitialTop = aInitialTop;
|
|
475 |
iMaxSize = aMaxSize;
|
|
476 |
}
|
|
477 |
|
|
478 |
/**
|
|
479 |
Set the chunk to be created to have a committed region consisting of an
|
|
480 |
arbitrary set of MMU pages within the reserved region.
|
|
481 |
|
|
482 |
@param aInitialBottom The offset of the bottom of the new committed region
|
|
483 |
from the base of the chunk's reserved region.
|
|
484 |
@param aInitialTop The offset of the top of the new committed region
|
|
485 |
from the base of the chunk's reserved region.
|
|
486 |
@param aMaxSize The maximum size to which the reserved region of
|
|
487 |
this chunk can grow.
|
|
488 |
@see RChunk::CreateDisconnectedLocal()
|
|
489 |
*/
|
|
490 |
EXPORT_C void TChunkCreateInfo::SetDisconnected(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize)
|
|
491 |
{
|
|
492 |
iType = TChunkCreate::EDisconnected | TChunkCreate::EData;
|
|
493 |
iInitialBottom = aInitialBottom;
|
|
494 |
iInitialTop = aInitialTop;
|
|
495 |
iMaxSize = aMaxSize;
|
|
496 |
}
|
|
497 |
|
|
498 |
|
|
499 |
/**
|
|
500 |
Sets the chunk to be created to be a thread heap chunk.
|
|
501 |
For internal use only.
|
|
502 |
|
|
503 |
@param aInitialSize The number of bytes committed to this chunk.
|
|
504 |
@param aMaxSize The maximum size to which the reserved region of this chunk
|
|
505 |
can grow.
|
|
506 |
@param aName The name to be given to the chunk to be created
|
|
507 |
@internalComponent
|
|
508 |
*/
|
|
509 |
void TChunkCreateInfo::SetThreadHeap(TInt aInitialSize, TInt aMaxSize, const TDesC& aName)
|
|
510 |
{
|
|
511 |
iType = TChunkCreate::ENormal | TChunkCreate::EData;
|
|
512 |
iInitialBottom = 0;
|
|
513 |
iInitialTop = aInitialSize;
|
|
514 |
iMaxSize = aMaxSize;
|
|
515 |
iAttributes |= TChunkCreate::ELocalNamed;
|
|
516 |
iName = &aName;
|
|
517 |
iOwnerType = EOwnerThread;
|
|
518 |
}
|
|
519 |
|
|
520 |
/**
|
|
521 |
Sets the owner of the chunk to be created.
|
|
522 |
@param aType The owner of the chunk to be created.
|
|
523 |
*/
|
|
524 |
EXPORT_C void TChunkCreateInfo::SetOwner(TOwnerType aType)
|
|
525 |
{
|
|
526 |
iOwnerType = aType;
|
|
527 |
}
|
|
528 |
|
|
529 |
/**
|
|
530 |
Sets the chunk to be created to be global, i.e. it is potentially visible
|
|
531 |
to all processes and is intended for access by other user processes.
|
|
532 |
|
|
533 |
@param aName A reference to a descriptor containing the name to be
|
|
534 |
assigned to the global chunk. The length of
|
|
535 |
the descriptor must be no greater than that allowed for
|
|
536 |
a TKName type.
|
|
537 |
*/
|
|
538 |
EXPORT_C void TChunkCreateInfo::SetGlobal(const TDesC& aName)
|
|
539 |
{
|
|
540 |
iName = &aName;
|
|
541 |
iGlobal = ETrue;
|
|
542 |
}
|
|
543 |
|
|
544 |
/**
|
|
545 |
Sets the byte value that all memory committed to the chunk will be cleared to.
|
|
546 |
@param TUint8 aClearByte.
|
|
547 |
*/
|
|
548 |
EXPORT_C void TChunkCreateInfo::SetClearByte(TUint8 aClearByte)
|
|
549 |
{
|
|
550 |
iClearByte = aClearByte;
|
|
551 |
}
|
|
552 |
|
|
553 |
|
|
554 |
/**
|
|
555 |
Sets the data paging attributes for the chunk to be created. Any previous calls
|
|
556 |
to this method will be overridden for this TChunkCreateInfo object.
|
|
557 |
|
|
558 |
@param aPaging The data paging attributes of the chunk to be created.
|
|
559 |
|
|
560 |
@prototype
|
|
561 |
*/
|
|
562 |
EXPORT_C void TChunkCreateInfo::SetPaging(const TChunkPagingAtt aPaging)
|
|
563 |
{
|
|
564 |
__ASSERT_COMPILE(TChunkCreate::EPagingUnspec == 0);
|
|
565 |
iAttributes &= ~TChunkCreate::EPagingMask;
|
|
566 |
if (aPaging == EPaged)
|
|
567 |
iAttributes |= TChunkCreate::EPaged;
|
|
568 |
if (aPaging == EUnpaged)
|
|
569 |
iAttributes |= TChunkCreate::EUnpaged;
|
|
570 |
}
|
|
571 |
|
|
572 |
|
|
573 |
EXPORT_C void TChunkCreateInfo::SetCache(TInt aMaxSize)
|
|
574 |
{
|
|
575 |
iType = TChunkCreate::ECache | TChunkCreate::EData;
|
|
576 |
iInitialBottom = 0;
|
|
577 |
iInitialTop = 0;
|
|
578 |
iMaxSize = aMaxSize;
|
|
579 |
SetPaging(EUnpaged);
|
|
580 |
}
|
|
581 |
|
|
582 |
|
|
583 |
//
|
|
584 |
// class RChunk
|
|
585 |
//
|
|
586 |
|
|
587 |
EXPORT_C TInt RChunk::CreateLocal(TInt aSize,TInt aMaxSize,TOwnerType aType)
|
|
588 |
/**
|
|
589 |
Creates a local chunk.
|
|
590 |
|
|
591 |
The chunk is local to the process creating it; i.e. it is private to the process
|
|
592 |
creating it and is not intended for access by other user processes.
|
|
593 |
|
|
594 |
aMaxSize specifies the maximum size of the chunk and aSize specifies the number
|
|
595 |
of bytes to be committed on creation of the chunk. Both values are rounded
|
|
596 |
up to the next nearest processor page boundary value if they are not already
|
|
597 |
on a processor page boundary.
|
|
598 |
|
|
599 |
The committed region always starts at the bottom of the reserved region.
|
|
600 |
|
|
601 |
By default, ownership of this chunk handle is vested in the current process.
|
|
602 |
Ownership of the chunk handle can be vested in the current thread by passing
|
|
603 |
EOwnerThread as the third parameter to this function.
|
|
604 |
|
|
605 |
@param aSize The number of bytes committed to this chunk.
|
|
606 |
@param aMaxSize The maximum size to which the reserved region of this chunk
|
|
607 |
can grow.
|
|
608 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
609 |
chunk handle. If not explicitly specified, EOwnerProcess is
|
|
610 |
taken as default.
|
|
611 |
|
|
612 |
@return KErrNone if successful, otherwise another of the system-wide error
|
|
613 |
codes.
|
|
614 |
|
|
615 |
@panic USER 99 if aMaxSize is negative.
|
|
616 |
@panic USER 100 if aSize is negative.
|
|
617 |
@panic USER 101 if aSize is greater than or equal to the supplied
|
|
618 |
value of aMaxSize.
|
|
619 |
*/
|
|
620 |
{
|
|
621 |
TChunkCreateInfo createInfo;
|
|
622 |
createInfo.SetNormal(aSize, aMaxSize);
|
|
623 |
createInfo.SetOwner(aType);
|
|
624 |
return Create(createInfo);
|
|
625 |
}
|
|
626 |
|
|
627 |
|
|
628 |
|
|
629 |
|
|
630 |
EXPORT_C TInt RChunk::CreateLocalCode(TInt aSize,TInt aMaxSize,TOwnerType aType)
|
|
631 |
/**
|
|
632 |
Creates a user writable chunk that is marked by the kernel as containing code.
|
|
633 |
|
|
634 |
The chunk is local to the process creating it, i.e. it is private to the process
|
|
635 |
creating it and is not intended for access by other user processes.
|
|
636 |
|
|
637 |
On systems using a Harvard cache, this type of chunk removes the need to flush
|
|
638 |
the instruction cache (I-Cache) on a context switch. However, the instruction
|
|
639 |
Translation Look-aside Buffer (ITLB) still needs to be flushed when switching
|
|
640 |
to or from a process with one of these chunks in its address space. Systems with
|
|
641 |
a dynamic branch predictor may also need to flush their branch target buffer when
|
|
642 |
switching from one process using this type of chunk to another.
|
|
643 |
|
|
644 |
@param aSize The number of bytes committed to this chunk.
|
|
645 |
@param aMaxSize The maximum size to which the reserved region of this chunk
|
|
646 |
can grow.
|
|
647 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
648 |
chunk handle. If not explicitly specified, EOwnerProcess is
|
|
649 |
taken as default.
|
|
650 |
|
|
651 |
@return KErrNone if successful, otherwise another of the system-wide error
|
|
652 |
codes.
|
|
653 |
|
|
654 |
@panic USER 99 if aMaxSize is negative.
|
|
655 |
@panic USER 100 if aSize is negative.
|
|
656 |
@panic USER 101 if aSize is greater than or equal to the supplied
|
|
657 |
value of aMaxSize.
|
|
658 |
|
|
659 |
@see UserHeap::ChunkHeap
|
|
660 |
@see User::IMB_Range
|
|
661 |
*/
|
|
662 |
{
|
|
663 |
TChunkCreateInfo createInfo;
|
|
664 |
createInfo.SetCode(aSize, aMaxSize);
|
|
665 |
createInfo.SetOwner(aType);
|
|
666 |
return Create(createInfo);
|
|
667 |
}
|
|
668 |
|
|
669 |
|
|
670 |
|
|
671 |
|
|
672 |
EXPORT_C TInt RChunk::CreateGlobal(const TDesC &aName,TInt aSize,TInt aMaxSize,TOwnerType aType)
|
|
673 |
/**
|
|
674 |
Creates a global chunk.
|
|
675 |
|
|
676 |
The chunk is global; i.e. it is potentially visible to all processes and is
|
|
677 |
intended for access by other user processes.
|
|
678 |
|
|
679 |
aMaxSize specifies the maximum size of the chunk and aSize specifies the number
|
|
680 |
of bytes to be committed on creation of the chunk. Both values are rounded
|
|
681 |
up to the next nearest processor page boundary value ,if they are not already
|
|
682 |
on a processor page boundary value.
|
|
683 |
|
|
684 |
The committed region always starts at the bottom of the reserved region.
|
|
685 |
|
|
686 |
The descriptor aName contains the name to be assigned to this global chunk. If
|
|
687 |
this name is empty, the chunk will be anonymous. Anonymous chunks cannot be
|
|
688 |
accessed by other processes unless the creator explicitly passes them a handle
|
|
689 |
to the chunk - this can be used to transfer large amounts of data between
|
|
690 |
processes in a secure fashion.
|
|
691 |
|
|
692 |
By default, ownership of this chunk handle is vested in the current process.
|
|
693 |
Ownership of the chunk handle can be vested in the current thread by passing
|
|
694 |
EOwnerThread as the third parameter to this function.
|
|
695 |
|
|
696 |
@param aName A reference to a descriptor containing the name to be assigned
|
|
697 |
to this global chunk. The length of the descriptor must be no
|
|
698 |
greater than that allowed for a TKName type.
|
|
699 |
@param aSize The number of bytes committed to this chunk.
|
|
700 |
@param aMaxSize The maximum size to which the reserved region of this chunk
|
|
701 |
can grow.
|
|
702 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
703 |
chunk handle. If not explicitly specified, EOwnerProcess is taken
|
|
704 |
as default.
|
|
705 |
|
|
706 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
707 |
|
|
708 |
@panic USER 99 if aMaxSize is negative.
|
|
709 |
@panic USER 100 if aSize is negative.
|
|
710 |
@panic USER 101 if aSize is greater than or equal to the supplied
|
|
711 |
value of aMaxSize.
|
|
712 |
*/
|
|
713 |
{
|
|
714 |
TChunkCreateInfo createInfo;
|
|
715 |
createInfo.SetNormal(aSize, aMaxSize);
|
|
716 |
createInfo.SetGlobal(aName);
|
|
717 |
createInfo.SetOwner(aType);
|
|
718 |
return Create(createInfo);
|
|
719 |
}
|
|
720 |
|
|
721 |
|
|
722 |
|
|
723 |
|
|
724 |
EXPORT_C TInt RChunk::CreateDoubleEndedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType)
|
|
725 |
/**
|
|
726 |
Creates a local, double ended, chunk.
|
|
727 |
|
|
728 |
The chunk is local to the process creating it; i.e. it is private to
|
|
729 |
the process creating it and is not intended for access by other
|
|
730 |
user processes.
|
|
731 |
|
|
732 |
The committed region of a double ended chunk can be any contiguous subset
|
|
733 |
of the reserved region.
|
|
734 |
|
|
735 |
aMaxSize specifies the maximum size of the chunk.
|
|
736 |
|
|
737 |
The difference between aInitialTop and aInitialBottom gives the number of
|
|
738 |
bytes to be committed, on creation of the chunk; aInitialBottom gives the
|
|
739 |
offset of the bottom of the committed region from the base of the chunk's
|
|
740 |
reserved region; aInitialTop gives the offset of the top of the committed
|
|
741 |
region from the base of the chunk's reserved region.
|
|
742 |
|
|
743 |
Both aInitialBottom and aInitialTop are rounded up to the next nearest
|
|
744 |
processor page boundary value, if they are not already on
|
|
745 |
a processor page boundary value.
|
|
746 |
|
|
747 |
By default, ownership of this chunk handle is vested in the current process.
|
|
748 |
Ownership of the chunk handle can be vested in the current thread by passing
|
|
749 |
EOwnerThread as the third parameter to this function.
|
|
750 |
|
|
751 |
Note that:
|
|
752 |
|
|
753 |
1. the lowest valid address in a double ended chunk is the sum of the base of
|
|
754 |
the chunk's reserved region plus the adjusted value of aInitialBottom
|
|
755 |
|
|
756 |
2. the highest valid address in a double ended chunk is the the sum of the base
|
|
757 |
of the chunk's reserved region plus the adjusted value of aInitialTop - 1.
|
|
758 |
|
|
759 |
@param aInitialBottom The offset of the bottom of the new committed region
|
|
760 |
from the base of the chunk's reserved region.
|
|
761 |
@param aInitialTop The offset of the top of the new committed region from
|
|
762 |
the base of the chunk's reserved region.
|
|
763 |
@param aMaxSize The maximum size to which the reserved region of
|
|
764 |
this chunk can grow.
|
|
765 |
@param aType An enumeration whose enumerators define the ownership of
|
|
766 |
this chunk handle. If not explicitly specified,
|
|
767 |
EOwnerProcess is taken as default.
|
|
768 |
|
|
769 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
770 |
|
|
771 |
@panic USER 99 if aMaxSize is negative.
|
|
772 |
@panic USER 120 if aInitialBottom is negative.
|
|
773 |
@panic USER 121 if aInitialTop is negative.
|
|
774 |
@panic USER 122 if aInitialBottom is greater than the supplied value
|
|
775 |
of aInitialTop.
|
|
776 |
@panic USER 123 if aInitialTop is greater than the supplied value of aMaxSize.
|
|
777 |
*/
|
|
778 |
{
|
|
779 |
TChunkCreateInfo createInfo;
|
|
780 |
createInfo.SetDoubleEnded(aInitialBottom, aInitialTop, aMaxSize);
|
|
781 |
createInfo.SetOwner(aType);
|
|
782 |
return Create(createInfo);
|
|
783 |
}
|
|
784 |
|
|
785 |
|
|
786 |
|
|
787 |
|
|
788 |
EXPORT_C TInt RChunk::CreateDoubleEndedGlobal(const TDesC &aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType)
|
|
789 |
/**
|
|
790 |
Creates a global, double ended, chunk.
|
|
791 |
|
|
792 |
The chunk is global; i.e. it is visible to all processes and is intended
|
|
793 |
for access by other user processes.
|
|
794 |
|
|
795 |
The committed region of a double ended chunk can be any contiguous subset
|
|
796 |
of the reserved region.
|
|
797 |
|
|
798 |
aMaxSize specifies the maximum size of the chunk.
|
|
799 |
|
|
800 |
The difference between aInitialTop and aInitialBottom gives the number of
|
|
801 |
bytes to be committed, on creation of the chunk; aInitialBottom gives the
|
|
802 |
offset of the bottom of the committed region from the base of the chunk's
|
|
803 |
reserved region; aInitialTop gives the offset of the top of the committed
|
|
804 |
region from the base of the chunk's reserved region.
|
|
805 |
|
|
806 |
Both aInitialBottom and aInitialTop are rounded up to the next nearest
|
|
807 |
processor page boundary value, if they are not already on a processor page
|
|
808 |
boundary value.
|
|
809 |
|
|
810 |
The descriptor aName contains the name to be assigned to this global chunk.
|
|
811 |
|
|
812 |
By default, ownership of this chunk handle is vested in the current process.
|
|
813 |
Ownership of the chunk handle can be vested in the current thread by passing
|
|
814 |
EOwnerThread as the third parameter to this function.
|
|
815 |
|
|
816 |
Note that:
|
|
817 |
|
|
818 |
1. the lowest valid address in a double ended chunk is the sum of the base of
|
|
819 |
the chunk's reserved region plus the adjusted value of aInitialBottom
|
|
820 |
|
|
821 |
2. the highest valid address in a double ended chunk is the the sum of the base
|
|
822 |
of the chunk's reserved region plus the adjusted value of aInitialTop - 1.
|
|
823 |
|
|
824 |
@param aName A reference to a descriptor containing the name to be
|
|
825 |
assigned to this global chunk. The length of
|
|
826 |
the descriptor must be no greater than that allowed for
|
|
827 |
a TKName type.
|
|
828 |
@param aInitialBottom The offset of the bottom of the new committed region
|
|
829 |
from the base of the chunk's reserved region.
|
|
830 |
@param aInitialTop The offset of the top of the new committed region from
|
|
831 |
the base of the chunk's reserved region.
|
|
832 |
@param aMaxSize The maximum size to which the reserved region of
|
|
833 |
this chunk can grow.
|
|
834 |
@param aType An enumeration whose enumerators define the ownership of
|
|
835 |
this chunk handle. If not explicitly specified,
|
|
836 |
EOwnerProcess is taken as default.
|
|
837 |
|
|
838 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
839 |
|
|
840 |
@panic USER 99 if aMaxSize is negative.
|
|
841 |
@panic USER 120 if aInitialBottom is negative.
|
|
842 |
@panic USER 121 if aInitialTop is negative.
|
|
843 |
@panic USER 122 if aInitialBottom is greater than the supplied value
|
|
844 |
of aInitialTop.
|
|
845 |
@panic USER 123 if aInitialTop is greater than the supplied value of aMaxSize.
|
|
846 |
@panic USER 163 if aName is empty.
|
|
847 |
*/
|
|
848 |
{
|
|
849 |
TChunkCreateInfo createInfo;
|
|
850 |
createInfo.SetDoubleEnded(aInitialBottom, aInitialTop, aMaxSize);
|
|
851 |
createInfo.SetGlobal(aName);
|
|
852 |
createInfo.SetOwner(aType);
|
|
853 |
return Create(createInfo);
|
|
854 |
}
|
|
855 |
|
|
856 |
|
|
857 |
|
|
858 |
|
|
859 |
EXPORT_C TInt RChunk::CreateDisconnectedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType)
|
|
860 |
/**
|
|
861 |
Creates a local, disconnected chunk.
|
|
862 |
|
|
863 |
The chunk is local to the process creating it; i.e. it is private to
|
|
864 |
the process creating it and is not intended for access by other
|
|
865 |
user processes.
|
|
866 |
|
|
867 |
A disconnected chunk has a committed region consisting of an arbitrary set
|
|
868 |
of MMU pages within the reserved region, i.e. each page-sized address range
|
|
869 |
within the reserved region which begins on a page boundary may be committed
|
|
870 |
independently.
|
|
871 |
|
|
872 |
aMaxSize specifies the maximum size of the chunk.
|
|
873 |
|
|
874 |
The difference between aInitialTop and aInitialBottom gives the number of
|
|
875 |
bytes to be committed, on creation of the chunk; aInitialBottom gives the
|
|
876 |
offset of the bottom of the committed region from the base of the chunk's
|
|
877 |
reserved region; aInitialTop gives the offset of the top of the committed
|
|
878 |
region from the base of the chunk's reserved region.
|
|
879 |
|
|
880 |
Both aInitialBottom and aInitialTop are rounded up to the next nearest
|
|
881 |
processor page boundary value, if they are not already on
|
|
882 |
a processor page boundary value.
|
|
883 |
|
|
884 |
By default, ownership of this chunk handle is vested in the current process.
|
|
885 |
Ownership of the chunk handle can be vested in the current thread by passing
|
|
886 |
EOwnerThread as the third parameter to this function.
|
|
887 |
|
|
888 |
@param aInitialBottom The offset of the bottom of the new committed region
|
|
889 |
from the base of the chunk's reserved region.
|
|
890 |
@param aInitialTop The offset of the top of the new committed region from
|
|
891 |
the base of the chunk's reserved region.
|
|
892 |
@param aMaxSize The maximum size to which the reserved region of
|
|
893 |
this chunk can grow.
|
|
894 |
@param aType An enumeration whose enumerators define the ownership of
|
|
895 |
this chunk handle. If not explicitly specified,
|
|
896 |
EOwnerProcess is taken as default.
|
|
897 |
|
|
898 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
899 |
|
|
900 |
@panic USER 99 if aMaxSize is negative.
|
|
901 |
@panic USER 120 if aInitialBottom is negative.
|
|
902 |
@panic USER 121 if aInitialTop is negative.
|
|
903 |
@panic USER 122 if aInitialBottom is greater than the supplied value
|
|
904 |
of aInitialTop.
|
|
905 |
@panic USER 123 if aInitialTop is greater than the supplied value of aMaxSize.
|
|
906 |
*/
|
|
907 |
{
|
|
908 |
TChunkCreateInfo createInfo;
|
|
909 |
createInfo.SetDisconnected(aInitialBottom, aInitialTop, aMaxSize);
|
|
910 |
createInfo.SetOwner(aType);
|
|
911 |
return Create(createInfo);
|
|
912 |
}
|
|
913 |
|
|
914 |
|
|
915 |
|
|
916 |
|
|
917 |
EXPORT_C TInt RChunk::CreateDisconnectedGlobal(const TDesC &aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType)
|
|
918 |
/**
|
|
919 |
Creates a global, disconnected, chunk.
|
|
920 |
|
|
921 |
The chunk is global; i.e. it is visible to all processes and is intended
|
|
922 |
for access by other user processes.
|
|
923 |
|
|
924 |
A disconnected chunk has a committed region consisting of an arbitrary set
|
|
925 |
of MMU pages within the reserved region, i.e. each page-sized address range
|
|
926 |
within the reserved region which begins on a page boundary may be committed
|
|
927 |
independently.
|
|
928 |
|
|
929 |
aMaxSize specifies the maximum size of the chunk.
|
|
930 |
|
|
931 |
The difference between aInitialTop and aInitialBottom gives the number of
|
|
932 |
bytes to be committed, on creation of the chunk; aInitialBottom gives the
|
|
933 |
offset of the bottom of the committed region from the base of the chunk's
|
|
934 |
reserved region; aInitialTop gives the offset of the top of the committed
|
|
935 |
region from the base of the chunk's reserved region.
|
|
936 |
|
|
937 |
Both aInitialBottom and aInitialTop are rounded up to the next nearest
|
|
938 |
processor page boundary value, if they are not already on a processor page
|
|
939 |
boundary value.
|
|
940 |
|
|
941 |
The descriptor aName contains the name to be assigned to this global chunk.
|
|
942 |
|
|
943 |
By default, ownership of this chunk handle is vested in the current process.
|
|
944 |
Ownership of the chunk handle can be vested in the current thread by passing
|
|
945 |
EOwnerThread as the third parameter to this function.
|
|
946 |
|
|
947 |
@param aName A reference to a descriptor containing the name to be
|
|
948 |
assigned to this global chunk. The length of
|
|
949 |
the descriptor must be no greater than that allowed for
|
|
950 |
a TKName type.
|
|
951 |
@param aInitialBottom The offset of the bottom of the new committed region
|
|
952 |
from the base of the chunk's reserved region.
|
|
953 |
@param aInitialTop The offset of the top of the new committed region from
|
|
954 |
the base of the chunk's reserved region.
|
|
955 |
@param aMaxSize The maximum size to which the reserved region of
|
|
956 |
this chunk can grow.
|
|
957 |
@param aType An enumeration whose enumerators define the ownership of
|
|
958 |
this chunk handle. If not explicitly specified,
|
|
959 |
EOwnerProcess is taken as default.
|
|
960 |
|
|
961 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
962 |
|
|
963 |
@panic USER 99 if aMaxSize is negative.
|
|
964 |
@panic USER 120 if aInitialBottom is negative.
|
|
965 |
@panic USER 121 if aInitialTop is negative.
|
|
966 |
@panic USER 122 if aInitialBottom is greater than the supplied value
|
|
967 |
of aInitialTop.
|
|
968 |
@panic USER 123 if aInitialTop is greater than the supplied value of aMaxSize.
|
|
969 |
*/
|
|
970 |
{
|
|
971 |
TChunkCreateInfo createInfo;
|
|
972 |
createInfo.SetDisconnected(aInitialBottom, aInitialTop, aMaxSize);
|
|
973 |
createInfo.SetGlobal(aName);
|
|
974 |
createInfo.SetOwner(aType);
|
|
975 |
return Create(createInfo);
|
|
976 |
}
|
|
977 |
|
|
978 |
|
|
979 |
/**
|
|
980 |
Creates a chunk of the type specified by the parameter aCreateInfo.
|
|
981 |
|
|
982 |
@param aCreate A reference to a TChunkCreateInfo object specifying the type of
|
|
983 |
chunk to create.
|
|
984 |
|
|
985 |
@return KErrNone on success, otherwise on of the system wide error codes.
|
|
986 |
|
|
987 |
@panic USER 99 if the specified maximum size is negative.
|
|
988 |
@panic USER 120 if any specified initial bottom is negative.
|
|
989 |
@panic USER 121 if any specified initial top is negative.
|
|
990 |
@panic USER 122 if any specified initial bottom is greater than the supplied value
|
|
991 |
for the intial top.
|
|
992 |
@panic USER 123 if any specified initial top is greater than the supplied value for the maximum size.
|
|
993 |
@panic USER 214 if any of the specified attributes is invalid.
|
|
994 |
@panic USER 215 if the version number of aCreateInfo is invalid.
|
|
995 |
*/
|
|
996 |
EXPORT_C TInt RChunk::Create(TChunkCreateInfo& aCreateInfo)
|
|
997 |
{
|
|
998 |
// Verify the version number of TChunkCreateInfo is supported
|
|
999 |
__ASSERT_ALWAYS(aCreateInfo.iVersionNumber < TChunkCreateInfo::ESupportedVersions,
|
|
1000 |
Panic(EChkCreateInvalidVersion));
|
|
1001 |
|
|
1002 |
TUint mapping = aCreateInfo.iType & ~TChunkCreate::ECode;
|
|
1003 |
TBool shouldBeNamed = aCreateInfo.iGlobal ||
|
|
1004 |
(aCreateInfo.iAttributes & TChunkCreate::ELocalNamed);
|
|
1005 |
__ASSERT_ALWAYS(mapping <= (TUint)TChunkCreate::ECache, Panic(EChkCreateInvalidType));
|
|
1006 |
__ASSERT_ALWAYS(!(aCreateInfo.iType & TChunkCreate::ECode) || !aCreateInfo.iGlobal,
|
|
1007 |
Panic(EChkCreateInvalidType));
|
|
1008 |
__ASSERT_ALWAYS((!shouldBeNamed && aCreateInfo.iName == NULL) ||
|
|
1009 |
(shouldBeNamed && aCreateInfo.iName),
|
|
1010 |
Panic(EChkCreateInvalidName));
|
|
1011 |
__ASSERT_ALWAYS(aCreateInfo.iMaxSize >= 0, Panic(EChkCreateMaxSizeNegative));
|
|
1012 |
__ASSERT_ALWAYS(!(aCreateInfo.iAttributes & ~TChunkCreate::EChunkCreateAttMask), Panic(EChkCreateInvalidAttribute));
|
|
1013 |
if(mapping == TChunkCreate::ENormal)
|
|
1014 |
{
|
|
1015 |
// 'normal' chunks have different semantics for the meanings of
|
|
1016 |
// aInitialBottom and aInitialTop
|
|
1017 |
__ASSERT_ALWAYS(!aCreateInfo.iInitialBottom, Panic(EChkCreateInvalidBottom));
|
|
1018 |
__ASSERT_ALWAYS(aCreateInfo.iInitialTop >= 0, Panic(EChkCreateSizeNotPositive));
|
|
1019 |
__ASSERT_ALWAYS(aCreateInfo.iInitialTop <= aCreateInfo.iMaxSize, Panic(EChkCreateMaxLessThanMin));
|
|
1020 |
}
|
|
1021 |
else
|
|
1022 |
{
|
|
1023 |
__ASSERT_ALWAYS(aCreateInfo.iInitialBottom >= 0, Panic(EChkCreateBottomNegative));
|
|
1024 |
__ASSERT_ALWAYS(aCreateInfo.iInitialTop >= 0, Panic(EChkCreateTopNegative));
|
|
1025 |
__ASSERT_ALWAYS(aCreateInfo.iInitialTop >= aCreateInfo.iInitialBottom, Panic(EChkCreateTopLessThanBottom));
|
|
1026 |
__ASSERT_ALWAYS(aCreateInfo.iInitialTop <= aCreateInfo.iMaxSize, Panic(EChkCreateTopBiggerThanMax));
|
|
1027 |
}
|
|
1028 |
|
|
1029 |
TChunkCreate info;
|
|
1030 |
info.iAtt = aCreateInfo.iAttributes | (TUint)aCreateInfo.iType;
|
|
1031 |
info.iAtt |= (aCreateInfo.iGlobal)? TChunkCreate::EGlobal : TChunkCreate::ELocal; // Add the global attribute
|
|
1032 |
info.iForceFixed = EFalse;
|
|
1033 |
info.iInitialBottom = aCreateInfo.iInitialBottom;
|
|
1034 |
info.iInitialTop = aCreateInfo.iInitialTop;
|
|
1035 |
info.iMaxSize = aCreateInfo.iMaxSize;
|
|
1036 |
info.iClearByte = aCreateInfo.iClearByte;
|
|
1037 |
|
|
1038 |
TDesC8* ptrName = NULL;
|
|
1039 |
TBuf8<KMaxKernelName> name8;
|
|
1040 |
if(aCreateInfo.iName)
|
|
1041 |
{
|
|
1042 |
TInt r = User::ValidateName(*aCreateInfo.iName);
|
|
1043 |
if(KErrNone!=r)
|
|
1044 |
return r;
|
|
1045 |
name8.Copy(*aCreateInfo.iName);
|
|
1046 |
ptrName = &name8;
|
|
1047 |
}
|
|
1048 |
|
|
1049 |
return SetReturnedHandle(Exec::ChunkCreate(aCreateInfo.iOwnerType, ptrName, info),*this);
|
|
1050 |
}
|
|
1051 |
|
|
1052 |
|
|
1053 |
EXPORT_C TInt RChunk::OpenGlobal(const TDesC &aName,TBool isReadOnly,TOwnerType aType)
|
|
1054 |
/**
|
|
1055 |
Opens a handle to a specific named global chunk.
|
|
1056 |
|
|
1057 |
Full read/write access can be allowed or access can be limited to read only.
|
|
1058 |
|
|
1059 |
By default, ownership of this process handle is vested in the current process,
|
|
1060 |
but can be vested in the current thread by passing EOwnerThread as the second
|
|
1061 |
parameter to this function.
|
|
1062 |
|
|
1063 |
@param aName A reference to the descriptor containing the name of
|
|
1064 |
the chunk to be opened.
|
|
1065 |
@param isReadOnly This is currently not implemented and setting it to ETrue
|
|
1066 |
will have no effect.
|
|
1067 |
(Intended implementation will be as below:
|
|
1068 |
Defines the type of access to the chunk: Specify ETrue if
|
|
1069 |
access is limited to read only, otherwise specify EFalse
|
|
1070 |
for full read/write access.)
|
|
1071 |
@param aType An enumeration whose enumerators define ownership of
|
|
1072 |
this chunk handle. If not explicitly specified,
|
|
1073 |
EOwnerProcess is taken as default.
|
|
1074 |
|
|
1075 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1076 |
*/
|
|
1077 |
{
|
|
1078 |
(void) isReadOnly; // This is not currently used
|
|
1079 |
return OpenByName(aName,aType,EChunk);
|
|
1080 |
}
|
|
1081 |
|
|
1082 |
|
|
1083 |
|
|
1084 |
|
|
1085 |
/**
|
|
1086 |
Opens a handle to a chunk using a handle number sent by a client
|
|
1087 |
to a server.
|
|
1088 |
|
|
1089 |
This function is called by the server.
|
|
1090 |
|
|
1091 |
@param aMessage The message pointer.
|
|
1092 |
@param aParam An index specifying which of the four message arguments
|
|
1093 |
contains the handle number.
|
|
1094 |
@param isReadOnly This is currently not implemented and setting it to ETrue
|
|
1095 |
will have no effect.
|
|
1096 |
(Intended implementation will be as below:
|
|
1097 |
Defines the type of access to the chunk: Specify ETrue if
|
|
1098 |
access is limited to read only, otherwise specify EFalse
|
|
1099 |
for full read/write access.)
|
|
1100 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
1101 |
chunk handle. If not explicitly specified, EOwnerProcess is
|
|
1102 |
taken as default.
|
|
1103 |
|
|
1104 |
@return KErrNone, if successful;
|
|
1105 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
1106 |
KErrBadHandle, if not a valid handle;
|
|
1107 |
otherwise one of the other system-wide error codes.
|
|
1108 |
*/
|
|
1109 |
EXPORT_C TInt RChunk::Open(RMessagePtr2 aMessage,TInt aParam,TBool isReadOnly,TOwnerType aType)
|
|
1110 |
{
|
|
1111 |
(void) isReadOnly; // This is not currently used
|
|
1112 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(),EChunk,aParam,aType));
|
|
1113 |
}
|
|
1114 |
|
|
1115 |
|
|
1116 |
|
|
1117 |
|
|
1118 |
/**
|
|
1119 |
Opens a handle to a chunk using a handle number passed as an
|
|
1120 |
environment data item to the child process during the creation of
|
|
1121 |
that child process.
|
|
1122 |
|
|
1123 |
Note that this function can only be called successfully once.
|
|
1124 |
|
|
1125 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
1126 |
environment data that contains the handle number. This is
|
|
1127 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
1128 |
This can range from 0 to 15.
|
|
1129 |
|
|
1130 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
1131 |
this chunk handle. If not explicitly specified,
|
|
1132 |
EOwnerProcess is taken as default.
|
|
1133 |
|
|
1134 |
@return KErrNone, if successful;
|
|
1135 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
1136 |
KErrArgument, if the slot does not contain a Semaphore handle;
|
|
1137 |
otherwise one of the other system-wide error codes.
|
|
1138 |
|
|
1139 |
@see RProcess::SetParameter()
|
|
1140 |
*/
|
|
1141 |
EXPORT_C TInt RChunk::Open(TInt aArgumentIndex, TOwnerType aOwnerType)
|
|
1142 |
{
|
|
1143 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, EChunk, aOwnerType));
|
|
1144 |
}
|
|
1145 |
|
|
1146 |
|
|
1147 |
|
|
1148 |
|
|
1149 |
|
|
1150 |
EXPORT_C TInt RChunk::SetRestrictions(TUint aFlags)
|
|
1151 |
/**
|
|
1152 |
Sets or removes restrictions on the ability of the chunk to change.
|
|
1153 |
|
|
1154 |
For example, to adjust, commit etc
|
|
1155 |
|
|
1156 |
@param aFlags One of the values defined by TRestrictions.
|
|
1157 |
|
|
1158 |
@see RChunk::TRestrictions()
|
|
1159 |
*/
|
|
1160 |
{
|
|
1161 |
return Exec::ChunkSetRestrictions(iHandle,aFlags);
|
|
1162 |
}
|
|
1163 |
|
|
1164 |
|
|
1165 |
|
|
1166 |
|
|
1167 |
EXPORT_C TInt RChunk::Adjust(TInt aNewSize) const
|
|
1168 |
/**
|
|
1169 |
Changes the number of bytes committed to the chunk.
|
|
1170 |
|
|
1171 |
This value is always rounded up to the next nearest processor page boundary.
|
|
1172 |
|
|
1173 |
@param aNewSize The number of bytes to be committed to this chunk.
|
|
1174 |
|
|
1175 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1176 |
|
|
1177 |
@panic USER 102 if aNewSize is negative.
|
|
1178 |
*/
|
|
1179 |
{
|
|
1180 |
|
|
1181 |
__ASSERT_ALWAYS(aNewSize>=0,Panic(EChkAdjustNewSizeNegative));
|
|
1182 |
return Exec::ChunkAdjust(iHandle,EChunkAdjust,aNewSize,0);
|
|
1183 |
}
|
|
1184 |
|
|
1185 |
|
|
1186 |
|
|
1187 |
|
|
1188 |
EXPORT_C TInt RChunk::AdjustDoubleEnded(TInt aBottom, TInt aTop) const
|
|
1189 |
/**
|
|
1190 |
Changes the number of bytes and the position of this double ended
|
|
1191 |
chunk's committed region.
|
|
1192 |
|
|
1193 |
The difference between aTop and aBottom gives the new size of the committed
|
|
1194 |
region; aBottom gives the offset of the bottom of the committed region from
|
|
1195 |
the base of the chunk's reserved region.
|
|
1196 |
|
|
1197 |
Both aBottom and aTop are rounded up to the next nearest processor
|
|
1198 |
page boundary.
|
|
1199 |
|
|
1200 |
The function fails if this chunk is not a double ended chunk; for a standard
|
|
1201 |
chunk, use the Adjust() function.
|
|
1202 |
|
|
1203 |
Note that if the initial and final committed regions intersect, the contents
|
|
1204 |
of the intersection are unchanged. Other parts of the committed region have
|
|
1205 |
undefined contents.
|
|
1206 |
|
|
1207 |
Note also that:
|
|
1208 |
|
|
1209 |
1. the lowest valid address in a double ended chunk is the sum of the base of
|
|
1210 |
the chunk's reserved region plus the adjusted value of aBottom
|
|
1211 |
|
|
1212 |
2. the highest valid address in a double ended chunk is the the sum of the base
|
|
1213 |
of the chunk's reserved region plus the adjusted value of aTop - 1.
|
|
1214 |
|
|
1215 |
@param aBottom The offset from the base of the chunk of the bottom of the
|
|
1216 |
committed region.
|
|
1217 |
@param aTop The offset from the base of the chunk of the top of the committed
|
|
1218 |
region.
|
|
1219 |
|
|
1220 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1221 |
|
|
1222 |
@panic USER 124 if aBottom is negative.
|
|
1223 |
@panic USER 125 if aTop is negative.
|
|
1224 |
@panic USER 126 if aBottom is greater than the supplied value of aTop.
|
|
1225 |
*/
|
|
1226 |
{
|
|
1227 |
__ASSERT_ALWAYS(aBottom>=0,Panic(EChkAdjustBottomNegative));
|
|
1228 |
__ASSERT_ALWAYS(aTop>=0,Panic(EChkAdjustTopNegative));
|
|
1229 |
__ASSERT_ALWAYS(aTop>=aBottom,Panic(EChkAdjustTopLessThanBottom));
|
|
1230 |
return Exec::ChunkAdjust(iHandle,EChunkAdjustDoubleEnded,aBottom,aTop);
|
|
1231 |
}
|
|
1232 |
|
|
1233 |
|
|
1234 |
|
|
1235 |
|
|
1236 |
EXPORT_C TInt RChunk::Commit(TInt aOffset, TInt aSize) const
|
|
1237 |
/**
|
|
1238 |
Commits memory to a disconnected chunk.
|
|
1239 |
|
|
1240 |
Memory is committed in blocks of the MMU page size.
|
|
1241 |
E.g. Commit(pageSize-1,2) which asks for the last byte of the first page
|
|
1242 |
and the first byte of the second page and will result in the first 2 pages
|
|
1243 |
in the chunk being committed.
|
|
1244 |
For this reason it is best to only use values for aOffset and aSize which
|
|
1245 |
are multiples of the MMU page size. This size can be obtained with the
|
|
1246 |
following code.
|
|
1247 |
@code
|
|
1248 |
TInt pageSize;
|
|
1249 |
HAL::Get(HAL::EMemoryPageSize,pageSize)
|
|
1250 |
@endcode
|
|
1251 |
|
|
1252 |
@param aOffset The offset of the committed region from the base of the chunk's
|
|
1253 |
reserved region.
|
|
1254 |
@param aSize The size of the committed region.
|
|
1255 |
|
|
1256 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1257 |
|
|
1258 |
@panic USER 157 if anOffset is negative.
|
|
1259 |
@panic USER 158 if aSize is negative.
|
|
1260 |
*/
|
|
1261 |
{
|
|
1262 |
__ASSERT_ALWAYS(aOffset>=0,Panic(EChkCommitOffsetNegative));
|
|
1263 |
__ASSERT_ALWAYS(aSize>=0,Panic(EChkCommitSizeNegative));
|
|
1264 |
return Exec::ChunkAdjust(iHandle,EChunkCommit,aOffset,aSize);
|
|
1265 |
}
|
|
1266 |
|
|
1267 |
|
|
1268 |
|
|
1269 |
|
|
1270 |
EXPORT_C TInt RChunk::Allocate(TInt aSize) const
|
|
1271 |
/**
|
|
1272 |
Allocates and commits to a disconnected chunk.
|
|
1273 |
|
|
1274 |
@param aSize The size of the committed region.
|
|
1275 |
|
|
1276 |
@panic USER 159 if aSize is negative.
|
|
1277 |
*/
|
|
1278 |
{
|
|
1279 |
__ASSERT_ALWAYS(aSize>=0,Panic(EChkAllocateSizeNegative));
|
|
1280 |
return Exec::ChunkAdjust(iHandle,EChunkAllocate,aSize,0);
|
|
1281 |
}
|
|
1282 |
|
|
1283 |
|
|
1284 |
|
|
1285 |
|
|
1286 |
EXPORT_C TInt RChunk::Decommit(TInt aOffset, TInt aSize) const
|
|
1287 |
/**
|
|
1288 |
Decommits memory from a disconnected chunk.
|
|
1289 |
|
|
1290 |
Memory is decommitted in blocks of the MMU page size.
|
|
1291 |
E.g. Decommit(pageSize-1,2) which asks for the last byte of the first page
|
|
1292 |
and the first byte of the second page and will result in the first 2 pages
|
|
1293 |
in the chunk being decommitted.
|
|
1294 |
For this reason it is best to only use values for aOffset and aSize which
|
|
1295 |
are multiples of the MMU page size. This size can be obtained with the
|
|
1296 |
following code.
|
|
1297 |
@code
|
|
1298 |
TInt pageSize;
|
|
1299 |
HAL::Get(HAL::EMemoryPageSize,pageSize)
|
|
1300 |
@endcode
|
|
1301 |
|
|
1302 |
@param aOffset The offset of the committed region from the base of the chunk's
|
|
1303 |
reserved region;
|
|
1304 |
@param aSize The size of the committed region.
|
|
1305 |
|
|
1306 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1307 |
|
|
1308 |
@panic USER 160 if anOffset is negative.
|
|
1309 |
@panic USER 161 if aSize is negative.
|
|
1310 |
*/
|
|
1311 |
{
|
|
1312 |
__ASSERT_ALWAYS(aOffset>=0,Panic(EChkDecommitOffsetNegative));
|
|
1313 |
__ASSERT_ALWAYS(aSize>=0,Panic(EChkDecommitSizeNegative));
|
|
1314 |
return Exec::ChunkAdjust(iHandle,EChunkDecommit,aOffset,aSize);
|
|
1315 |
}
|
|
1316 |
|
|
1317 |
|
|
1318 |
/* THIS IS A DELIBERATE NON DOXGEN STYLE TAG TO EXCLUDE THIS DOC FROM AUTO GENERATED DOCS
|
|
1319 |
|
|
1320 |
Unlocks previously committed memory in a disconnected chunk.
|
|
1321 |
|
|
1322 |
Unlocked memory is an intermediate state between committed and decommitted.
|
|
1323 |
Whilst in this state, the memory must not be accessed in any way, and the
|
|
1324 |
system is free to reclaim this RAM for other purposes, (it counts as free
|
|
1325 |
system memory). A program may attempt to relock the memory with #Lock which,
|
|
1326 |
when it succeeds, returns it to the committed state with its contents unchanged.
|
|
1327 |
|
|
1328 |
This is intended for use in the implementation of memory caches for data
|
|
1329 |
which can be regenerated from other sources. I.e. in situations when the
|
|
1330 |
loss of cache contents is not a fatal condition.
|
|
1331 |
|
|
1332 |
#Unlock may be used on memory which is already unlocked, in which case the memory
|
|
1333 |
state is left unaltered. Attempting to unlock memory which is decommitted results
|
|
1334 |
in an error.
|
|
1335 |
|
|
1336 |
Unlocked memory may decommitted with #Decommit.
|
|
1337 |
|
|
1338 |
Memory is unlocked in blocks of the MMU page size.
|
|
1339 |
E.g. Unlock(pageSize-1,2) which asks for the last byte of the first page
|
|
1340 |
and the first byte of the second page and will result in the first 2 pages
|
|
1341 |
in the chunk being unlocked.
|
|
1342 |
For this reason it is best to only use values for aOffset and aSize which
|
|
1343 |
are multiples of the MMU page size. This size can be obtained with the
|
|
1344 |
following code.
|
|
1345 |
@code
|
|
1346 |
TInt pageSize;
|
|
1347 |
HAL::Get(HAL::EMemoryPageSize,pageSize)
|
|
1348 |
@endcode
|
|
1349 |
|
|
1350 |
@param aOffset The offset of the committed region from the base of the chunk's
|
|
1351 |
reserved region;
|
|
1352 |
@param aSize The size of the committed region.
|
|
1353 |
|
|
1354 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1355 |
|
|
1356 |
@panic USER 160 if anOffset is negative.
|
|
1357 |
@panic USER 161 if aSize is negative.
|
|
1358 |
|
|
1359 |
@see RChunk::Lock
|
|
1360 |
|
|
1361 |
@internalTechnology
|
|
1362 |
*/
|
|
1363 |
EXPORT_C TInt RChunk::Unlock(TInt aOffset, TInt aSize)
|
|
1364 |
{
|
|
1365 |
__ASSERT_ALWAYS(aOffset>=0,Panic(EChkDecommitOffsetNegative));
|
|
1366 |
__ASSERT_ALWAYS(aSize>=0,Panic(EChkDecommitSizeNegative));
|
|
1367 |
return Exec::ChunkAdjust(iHandle,EChunkUnlock,aOffset,aSize);
|
|
1368 |
}
|
|
1369 |
|
|
1370 |
/* THIS IS A DELIBERATE NON DOXGEN STYLE TAG TO EXCLUDE THIS DOC FROM AUTO GENERATED DOCS
|
|
1371 |
|
|
1372 |
Locks memory in a disconnected chunk.
|
|
1373 |
|
|
1374 |
This attempts to reverse the action of #Unlock and return memory to the committed
|
|
1375 |
state. If any RAM in the region had been previously reclaimed by the system,
|
|
1376 |
then this function fails with KErrNotFound and the whole region is decommited.
|
|
1377 |
|
|
1378 |
#Lock may be used on memory which is already committed, in which case the memory
|
|
1379 |
state is left unaltered. Attempting to lock memory which is decommitted results in an
|
|
1380 |
error.
|
|
1381 |
|
|
1382 |
Memory is locked in blocks of the MMU page size.
|
|
1383 |
E.g. Lock(pageSize-1,2) which asks for the last byte of the first page
|
|
1384 |
and the first byte of the second page and will result in the first 2 pages
|
|
1385 |
in the chunk being locked.
|
|
1386 |
For this reason it is best to only use values for aOffset and aSize which
|
|
1387 |
are multiples of the MMU page size. This size can be obtained with the
|
|
1388 |
following code.
|
|
1389 |
@code
|
|
1390 |
TInt pageSize;
|
|
1391 |
HAL::Get(HAL::EMemoryPageSize,pageSize)
|
|
1392 |
@endcode
|
|
1393 |
|
|
1394 |
@param aOffset The offset of the unlocked region from the base of the chunk's
|
|
1395 |
reserved region.
|
|
1396 |
@param aSize The size of the unlocked region.
|
|
1397 |
|
|
1398 |
@return KErrNone if successful, otherwise another of the system error codes.
|
|
1399 |
|
|
1400 |
@panic USER 160 if anOffset is negative.
|
|
1401 |
@panic USER 161 if aSize is negative.
|
|
1402 |
|
|
1403 |
@see RChunk::Unlock
|
|
1404 |
|
|
1405 |
@internalTechnology
|
|
1406 |
*/
|
|
1407 |
EXPORT_C TInt RChunk::Lock(TInt aOffset, TInt aSize)
|
|
1408 |
{
|
|
1409 |
__ASSERT_ALWAYS(aOffset>=0,Panic(EChkDecommitOffsetNegative));
|
|
1410 |
__ASSERT_ALWAYS(aSize>=0,Panic(EChkDecommitSizeNegative));
|
|
1411 |
return Exec::ChunkAdjust(iHandle,EChunkLock,aOffset,aSize);
|
|
1412 |
}
|
|
1413 |
|
|
1414 |
|
|
1415 |
/**
|
|
1416 |
This can be used to determine whether the data for the chunk is demand paged
|
|
1417 |
or not.
|
|
1418 |
|
|
1419 |
@return ETrue if the data for the chunk is demand paged, EFalse otherwise.
|
|
1420 |
*/
|
|
1421 |
EXPORT_C TBool RChunk::IsPaged() const
|
|
1422 |
{
|
|
1423 |
return Exec::ChunkIsPaged(iHandle);
|
|
1424 |
}
|
|
1425 |
|
|
1426 |
|
|
1427 |
/**
|
|
1428 |
Opens a handle to an LDD factory object by name.
|
|
1429 |
|
|
1430 |
@param aName The name of the LDD factory object to be opened.
|
|
1431 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
1432 |
LDD factory object handle.
|
|
1433 |
|
|
1434 |
@return KErrNone, if successful; otherwise one of the other system wide error codes.
|
|
1435 |
*/
|
|
1436 |
EXPORT_C TInt RDevice::Open(const TDesC &aName,TOwnerType aType)
|
|
1437 |
{
|
|
1438 |
return OpenByName(aName,aType,ELogicalDevice);
|
|
1439 |
}
|
|
1440 |
|
|
1441 |
EXPORT_C TInt RBusLogicalChannel::DoCreate(const TDesC& aLogicalDevice, const TVersion& aVer, TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo, TInt aType)
|
|
1442 |
//
|
|
1443 |
// Call the kernel to create a channel on a device.
|
|
1444 |
//
|
|
1445 |
{
|
|
1446 |
TInt r = User::ValidateName(aLogicalDevice);
|
|
1447 |
if(KErrNone!=r)
|
|
1448 |
return r;
|
|
1449 |
TBuf8<KMaxKernelName> name8;
|
|
1450 |
name8.Copy(aLogicalDevice);
|
|
1451 |
|
|
1452 |
TBuf8<KMaxKernelName> physicalDeviceName;
|
|
1453 |
TChannelCreateInfo8 info;
|
|
1454 |
info.iVersion=aVer;
|
|
1455 |
info.iUnit=aUnit;
|
|
1456 |
if(aPhysicalDevice)
|
|
1457 |
{
|
|
1458 |
physicalDeviceName.Copy(*aPhysicalDevice);
|
|
1459 |
info.iPhysicalDevice = &physicalDeviceName;
|
|
1460 |
}
|
|
1461 |
else
|
|
1462 |
info.iPhysicalDevice = NULL;
|
|
1463 |
info.iInfo=anInfo;
|
|
1464 |
|
|
1465 |
return SetReturnedHandle(Exec::ChannelCreate(name8, info, aType),*this);
|
|
1466 |
}
|
|
1467 |
|
|
1468 |
|
|
1469 |
|
|
1470 |
|
|
1471 |
/**
|
|
1472 |
Opens a handle to a logical channel using a handle number sent by a client
|
|
1473 |
to a server.
|
|
1474 |
|
|
1475 |
This function is called by the server.
|
|
1476 |
|
|
1477 |
@param aMessage The message pointer.
|
|
1478 |
@param aParam An index specifying which of the four message arguments
|
|
1479 |
contains the handle number.
|
|
1480 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
1481 |
logical channel handle. If not explicitly specified,
|
|
1482 |
EOwnerProcess is taken as default.
|
|
1483 |
|
|
1484 |
@return KErrNone, if successful;
|
|
1485 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
1486 |
KErrBadHandle, if not a valid handle;
|
|
1487 |
otherwise one of the other system-wide error codes.
|
|
1488 |
*/
|
|
1489 |
EXPORT_C TInt RBusLogicalChannel::Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType)
|
|
1490 |
{
|
|
1491 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(),ELogicalChannel,aParam,aType));
|
|
1492 |
}
|
|
1493 |
|
|
1494 |
|
|
1495 |
|
|
1496 |
|
|
1497 |
/**
|
|
1498 |
Opens a logical channel handle using a handle number passed as an
|
|
1499 |
environment data item to the child process during the creation of
|
|
1500 |
that child process.
|
|
1501 |
|
|
1502 |
Note that this function can only be called successfully once.
|
|
1503 |
|
|
1504 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
1505 |
environment data that contains the handle number. This is
|
|
1506 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
1507 |
This can range from 0 to 15.
|
|
1508 |
|
|
1509 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
1510 |
this logical channel handle. If not explicitly specified,
|
|
1511 |
EOwnerProcess is taken as default.
|
|
1512 |
|
|
1513 |
@return KErrNone, if successful;
|
|
1514 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
1515 |
KErrArgument, if the slot does not contain a logical channel handle;
|
|
1516 |
otherwise one of the other system-wide error codes.
|
|
1517 |
*/
|
|
1518 |
EXPORT_C TInt RBusLogicalChannel::Open(TInt aArgumentIndex, TOwnerType aOwnerType)
|
|
1519 |
{
|
|
1520 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, ELogicalChannel, aOwnerType));
|
|
1521 |
}
|
|
1522 |
|
|
1523 |
|
|
1524 |
|
|
1525 |
|
|
1526 |
EXPORT_C TInt RHandleBase::Duplicate(const RThread &aSrc,TOwnerType aType)
|
|
1527 |
/**
|
|
1528 |
Creates a valid handle to the kernel object for which the specified thread
|
|
1529 |
already has a handle.
|
|
1530 |
|
|
1531 |
The function assumes that this handle has been copy constructed from an existing
|
|
1532 |
handle (or the handle-number has been explicitly copied through calls to Handle()
|
|
1533 |
and SetHandle()).
|
|
1534 |
|
|
1535 |
By default, any thread in the process can use this handle to access the kernel
|
|
1536 |
side object that the handle represents. However, specifying EOwnerThread as
|
|
1537 |
the second parameter to this function, means that only the creating thread
|
|
1538 |
can use this handle to access the kernel side object; any other thread in
|
|
1539 |
this process that wants to access the kernel side object must, again, duplicate
|
|
1540 |
this handle.
|
|
1541 |
|
|
1542 |
@param aSrc A reference to the thread containing the handle which is to be
|
|
1543 |
duplicated for this thread.
|
|
1544 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
1545 |
handle. If not explicitly specified, EOwnerProcess is taken
|
|
1546 |
as default.
|
|
1547 |
|
|
1548 |
@return KErrNone, if successful; otherwise, one of the other system wide error
|
|
1549 |
codes.
|
|
1550 |
*/
|
|
1551 |
{
|
|
1552 |
return Exec::HandleDuplicate(aSrc.Handle(), aType, iHandle);
|
|
1553 |
}
|
|
1554 |
|
|
1555 |
|
|
1556 |
|
|
1557 |
|
|
1558 |
EXPORT_C TInt RHandleBase::Open(const TFindHandleBase& aFindHandle, TOwnerType aType)
|
|
1559 |
/**
|
|
1560 |
Opens a handle to a kernel side object found using a find-handle object.
|
|
1561 |
|
|
1562 |
@param aFindHandle A find-handle object; an object that is used in searching
|
|
1563 |
for kernel side objects.
|
|
1564 |
@param aType An enumeration whose enumerators define the ownership of
|
|
1565 |
this handle. If not explicitly specified, EOwnerProcess
|
|
1566 |
is taken as default, and ownership is vested in the
|
|
1567 |
current process. Ownership can be vested in the current
|
|
1568 |
thread by passing the EOwnerThread enumerator.
|
|
1569 |
@return KErrNone, if successful; otherwise one of the other system wide
|
|
1570 |
error codes.
|
|
1571 |
*/
|
|
1572 |
{
|
|
1573 |
return SetReturnedHandle(Exec::FindHandleOpen(aType, aFindHandle), *this);
|
|
1574 |
}
|
|
1575 |
|
|
1576 |
|
|
1577 |
|
|
1578 |
/**
|
|
1579 |
Implementation for RXxxxx::Open/OpenGlocbal(const TDesC &aName,,TOwnerType aType) functions
|
|
1580 |
@internalComponent
|
|
1581 |
*/
|
|
1582 |
TInt RHandleBase::OpenByName(const TDesC &aName,TOwnerType aOwnerType,TInt aObjectType)
|
|
1583 |
{
|
|
1584 |
TBuf8<KMaxFullName> name8;
|
|
1585 |
name8.Copy(aName);
|
|
1586 |
return SetReturnedHandle(Exec::OpenObject((TObjectType)aObjectType,name8,aOwnerType));
|
|
1587 |
}
|
|
1588 |
|
|
1589 |
TInt RHandleBase::SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle)
|
|
1590 |
//
|
|
1591 |
// Set the handle value or return error
|
|
1592 |
//
|
|
1593 |
{
|
|
1594 |
return aHandle.SetReturnedHandle(aHandleOrError);
|
|
1595 |
}
|
|
1596 |
|
|
1597 |
|
|
1598 |
|
|
1599 |
|
|
1600 |
EXPORT_C void RHandleBase::Close()
|
|
1601 |
/**
|
|
1602 |
Closes the handle.
|
|
1603 |
|
|
1604 |
This has the effect of closing the associated kernel side object.
|
|
1605 |
|
|
1606 |
As the associated object is a reference counting object, it is destroyed if
|
|
1607 |
there are no other open references to it.
|
|
1608 |
|
|
1609 |
@see CObject
|
|
1610 |
*/
|
|
1611 |
{
|
|
1612 |
|
|
1613 |
__IF_DEBUG(Print(_L("RHandleBase::Close")));
|
|
1614 |
TInt h=iHandle;
|
|
1615 |
if (h!=KNullHandle)
|
|
1616 |
{
|
|
1617 |
//
|
|
1618 |
// We take a copy of the handle and set it to zero before the close in case this
|
|
1619 |
// object is actually a Chunk created in its own heap in which case the close
|
|
1620 |
// will destroy the object as well.
|
|
1621 |
//
|
|
1622 |
iHandle=0;
|
|
1623 |
if ((h&CObjectIx::ENoClose)==0 && Exec::HandleClose(h)>0)
|
|
1624 |
DoExtendedClose();
|
|
1625 |
}
|
|
1626 |
}
|
|
1627 |
|
|
1628 |
|
|
1629 |
|
|
1630 |
|
|
1631 |
void RHandleBase::DoExtendedClose()
|
|
1632 |
//
|
|
1633 |
// Call static data destructors following a library handle close
|
|
1634 |
//
|
|
1635 |
{
|
|
1636 |
TRAPD(r,DoExtendedCloseL()); // catch attempts to leave from destructors
|
|
1637 |
__ASSERT_ALWAYS(r==KErrNone, Panic(EDllStaticDestructorLeave));
|
|
1638 |
}
|
|
1639 |
|
|
1640 |
void RHandleBase::DoExtendedCloseL()
|
|
1641 |
//
|
|
1642 |
// Call static data destructors following a library handle close
|
|
1643 |
//
|
|
1644 |
{
|
|
1645 |
TLinAddr ep[KMaxLibraryEntryPoints];
|
|
1646 |
TInt r=KErrNone;
|
|
1647 |
while (r!=KErrEof)
|
|
1648 |
{
|
|
1649 |
TInt numEps=KMaxLibraryEntryPoints;
|
|
1650 |
r=E32Loader::LibraryDetach(numEps, ep);
|
|
1651 |
if (r==KErrEof)
|
|
1652 |
break;
|
|
1653 |
TInt i;
|
|
1654 |
for (i=numEps-1; i>=0; --i)
|
|
1655 |
{
|
|
1656 |
TLibraryEntry f=(TLibraryEntry)ep[i];
|
|
1657 |
(*f)(KModuleEntryReasonProcessDetach);
|
|
1658 |
}
|
|
1659 |
r=E32Loader::LibraryDetached();
|
|
1660 |
}
|
|
1661 |
}
|
|
1662 |
|
|
1663 |
|
|
1664 |
|
|
1665 |
|
|
1666 |
/**
|
|
1667 |
Constructs an RMessage2 from an RMessagePtr2.
|
|
1668 |
|
|
1669 |
@param aPtr A reference to an existing RMessagePtr2 object.
|
|
1670 |
*/
|
|
1671 |
EXPORT_C RMessage2::RMessage2(const RMessagePtr2& aPtr)
|
|
1672 |
{
|
|
1673 |
iHandle = aPtr.Handle();
|
|
1674 |
Exec::MessageConstructFromPtr(iHandle, this);
|
|
1675 |
iFlags = 0;
|
|
1676 |
iSpare3 = 0;
|
|
1677 |
}
|
|
1678 |
|
|
1679 |
/** Sets this message to an authorised state. This is used only by
|
|
1680 |
CPolicyServer. This flags use by the policy server implies two things:
|
|
1681 |
1) That the message has passed any appropriate security checks. (ie. one of the
|
|
1682 |
static policy check, CustomSecurityCheckL, or CustomFailureActionL,
|
|
1683 |
returned ETrue.)
|
|
1684 |
2) That any leaves that occur subsequent to this flag being set happen _only_
|
|
1685 |
in the session's ServiceL. ie. Nothing can leave between this flag being set
|
|
1686 |
and the session's ServiceL being called.
|
|
1687 |
|
|
1688 |
This is labelled as a const functions as everybody handles const RMessage2&'s.
|
|
1689 |
The constness is actually referring to the underlying RMessagePtr2 not the
|
|
1690 |
tranisent RMessage2 class.
|
|
1691 |
|
|
1692 |
@internalComponent
|
|
1693 |
*/
|
|
1694 |
void RMessage2::SetAuthorised() const
|
|
1695 |
{
|
|
1696 |
iFlags = ETrue;
|
|
1697 |
}
|
|
1698 |
|
|
1699 |
/** Sets the authorised flag to a state of not authorised. This is required as
|
|
1700 |
there is a default constructor for RMessage2 and one cannot guarantee that
|
|
1701 |
iFlags was initialised. This is called from CPolicyServer::RunL.
|
|
1702 |
|
|
1703 |
This is labelled as a const functions as everybody handles const RMessage2&'s.
|
|
1704 |
The constness is actually referring to the underlying RMessagePtr2 not the
|
|
1705 |
tranisent RMessage2 class.
|
|
1706 |
|
|
1707 |
@internalComponent
|
|
1708 |
*/
|
|
1709 |
void RMessage2::ClearAuthorised() const
|
|
1710 |
{
|
|
1711 |
iFlags = EFalse;
|
|
1712 |
}
|
|
1713 |
|
|
1714 |
/** Returns whether this message has been authorised by CPolicyServer. See
|
|
1715 |
RMessage2::SetAuthorised for implications of this state.
|
|
1716 |
@internalComponent
|
|
1717 |
*/
|
|
1718 |
TBool RMessage2::Authorised() const
|
|
1719 |
{
|
|
1720 |
return iFlags;
|
|
1721 |
}
|
|
1722 |
|
|
1723 |
|
|
1724 |
|
|
1725 |
|
|
1726 |
/**
|
|
1727 |
Frees this message.
|
|
1728 |
|
|
1729 |
@param aReason The completion code.
|
|
1730 |
*/
|
|
1731 |
EXPORT_C void RMessagePtr2::Complete(TInt aReason) const
|
|
1732 |
//
|
|
1733 |
// Free this message. If it's a disconnect, need to switch to kernel context as we'll be
|
|
1734 |
// freeing the DSession
|
|
1735 |
//
|
|
1736 |
{
|
|
1737 |
TInt h=iHandle;
|
|
1738 |
const_cast<TInt&>(iHandle)=0;
|
|
1739 |
if (h)
|
|
1740 |
Exec::MessageComplete(h,aReason);
|
|
1741 |
else
|
|
1742 |
::Panic(ETMesCompletion);
|
|
1743 |
}
|
|
1744 |
|
|
1745 |
|
|
1746 |
|
|
1747 |
|
|
1748 |
/**
|
|
1749 |
Duplicates the specified handle in the client thread, and returns this
|
|
1750 |
handle as a message completion code
|
|
1751 |
|
|
1752 |
@param aHandle The handle to be duplicated.
|
|
1753 |
*/
|
|
1754 |
EXPORT_C void RMessagePtr2::Complete(RHandleBase aHandle) const
|
|
1755 |
{
|
|
1756 |
TInt h=iHandle;
|
|
1757 |
const_cast<TInt&>(iHandle)=0;
|
|
1758 |
if (h)
|
|
1759 |
Exec::MessageCompleteWithHandle(h,aHandle.Handle());
|
|
1760 |
else
|
|
1761 |
::Panic(ETMesCompletion);
|
|
1762 |
}
|
|
1763 |
|
|
1764 |
|
|
1765 |
|
|
1766 |
|
|
1767 |
/**
|
|
1768 |
Gets the length of a descriptor argument in the client's process.
|
|
1769 |
|
|
1770 |
@param aParam The index value identifying the argument.
|
|
1771 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1772 |
inclusive.
|
|
1773 |
|
|
1774 |
@return The length of the descriptor, if successful.
|
|
1775 |
KErrArgument, if aParam has a value outside the valid range.
|
|
1776 |
KErrBadDescriptor, if the message argument is not a descriptor type.
|
|
1777 |
*/
|
|
1778 |
EXPORT_C TInt RMessagePtr2::GetDesLength(TInt aParam) const
|
|
1779 |
{
|
|
1780 |
return Exec::MessageGetDesLength(iHandle,aParam);
|
|
1781 |
}
|
|
1782 |
|
|
1783 |
|
|
1784 |
|
|
1785 |
|
|
1786 |
/**
|
|
1787 |
Gets the length of a descriptor argument in the client's process,
|
|
1788 |
leaving on failure.
|
|
1789 |
|
|
1790 |
@param aParam The index value identifying the argument.
|
|
1791 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1792 |
inclusive.
|
|
1793 |
|
|
1794 |
@return The length of the descriptor.
|
|
1795 |
|
|
1796 |
@leave KErrArgument if aParam has a value outside the valid range.
|
|
1797 |
@leave KErrBadDescriptor, if the message argument is not a descriptor type.
|
|
1798 |
*/
|
|
1799 |
EXPORT_C TInt RMessagePtr2::GetDesLengthL(TInt aParam) const
|
|
1800 |
{
|
|
1801 |
return User::LeaveIfError(GetDesLength(aParam));
|
|
1802 |
}
|
|
1803 |
|
|
1804 |
|
|
1805 |
|
|
1806 |
|
|
1807 |
/**
|
|
1808 |
Gets the maximum length of a descriptor argument in the client's process.
|
|
1809 |
|
|
1810 |
@param aParam The index value identifying the argument.
|
|
1811 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1812 |
inclusive.
|
|
1813 |
|
|
1814 |
@return The maximum length of the descriptor, if successful.
|
|
1815 |
KErrArgument, if aParam has a value outside the valid range.
|
|
1816 |
KErrBadDescriptor, if the message argument is not a descriptor type.
|
|
1817 |
*/
|
|
1818 |
EXPORT_C TInt RMessagePtr2::GetDesMaxLength(TInt aParam) const
|
|
1819 |
{
|
|
1820 |
return Exec::MessageGetDesMaxLength(iHandle,aParam);
|
|
1821 |
}
|
|
1822 |
|
|
1823 |
|
|
1824 |
|
|
1825 |
|
|
1826 |
/**
|
|
1827 |
Gets the maximum length of a descriptor argument in the client's process,
|
|
1828 |
leaving on failure.
|
|
1829 |
|
|
1830 |
@param aParam The index value identifying the argument.
|
|
1831 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1832 |
inclusive.
|
|
1833 |
|
|
1834 |
@return The length of the descriptor.
|
|
1835 |
|
|
1836 |
@leave KErrArgument if aParam has a value outside the valid range.
|
|
1837 |
@leave KErrBadDescriptor, if the message argument is not a descriptor type.
|
|
1838 |
*/
|
|
1839 |
EXPORT_C TInt RMessagePtr2::GetDesMaxLengthL(TInt aParam) const
|
|
1840 |
{
|
|
1841 |
return User::LeaveIfError(GetDesMaxLength(aParam));
|
|
1842 |
}
|
|
1843 |
|
|
1844 |
|
|
1845 |
|
|
1846 |
|
|
1847 |
/**
|
|
1848 |
Reads data from the specified offset within the 8-bit descriptor
|
|
1849 |
argument, into the specified target descriptor, and leaving on failure.
|
|
1850 |
|
|
1851 |
@param aParam The index value identifying the argument.
|
|
1852 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1853 |
inclusive.
|
|
1854 |
@param aDes The target descriptor into which the client data is
|
|
1855 |
to be written.
|
|
1856 |
@param aOffset The offset from the start of the client's descriptor data.
|
|
1857 |
If not explicitly specified, the offset defaults to zero.
|
|
1858 |
|
|
1859 |
@leave KErrArgument if aParam has a value outside the valid range, or
|
|
1860 |
if aOffset is negative.
|
|
1861 |
@leave KErrBadDescriptor, if the message argument is not an 8-bit descriptor.
|
|
1862 |
*/
|
|
1863 |
EXPORT_C void RMessagePtr2::ReadL(TInt aParam,TDes8& aDes,TInt aOffset) const
|
|
1864 |
{
|
|
1865 |
TInt error = Read(aParam,aDes,aOffset);
|
|
1866 |
User::LeaveIfError(error);
|
|
1867 |
}
|
|
1868 |
|
|
1869 |
|
|
1870 |
|
|
1871 |
|
|
1872 |
/**
|
|
1873 |
Reads data from the specified offset within the 16-bit descriptor
|
|
1874 |
argument, into the specified target descriptor, and leaving on failure.
|
|
1875 |
|
|
1876 |
@param aParam The index value identifying the argument.
|
|
1877 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1878 |
inclusive.
|
|
1879 |
@param aDes The target descriptor into which the client data is
|
|
1880 |
to be written.
|
|
1881 |
@param aOffset The offset from the start of the client's descriptor data.
|
|
1882 |
If not explicitly specified, the offset defaults to zero.
|
|
1883 |
|
|
1884 |
@leave KErrArgument if aParam has a value outside the valid range, or
|
|
1885 |
if aOffset is negative.
|
|
1886 |
@leave KErrBadDescriptor, if the message argument is not a 16-bit descriptor.
|
|
1887 |
*/
|
|
1888 |
EXPORT_C void RMessagePtr2::ReadL(TInt aParam,TDes16 &aDes,TInt aOffset) const
|
|
1889 |
{
|
|
1890 |
TInt error = Read(aParam,aDes,aOffset);
|
|
1891 |
User::LeaveIfError(error);
|
|
1892 |
}
|
|
1893 |
|
|
1894 |
|
|
1895 |
|
|
1896 |
|
|
1897 |
/**
|
|
1898 |
Writes data from the specified source descriptor to the specified offset within
|
|
1899 |
the 8-bit descriptor argument, and leaving on failure.
|
|
1900 |
|
|
1901 |
@param aParam The index value identifying the argument.
|
|
1902 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1903 |
inclusive.
|
|
1904 |
@param aDes The source descriptor containing the data to be written.
|
|
1905 |
@param aOffset The offset from the start of the client's descriptor.
|
|
1906 |
If not explicitly specified, the offset defaults to zero.
|
|
1907 |
|
|
1908 |
@leave KErrArgument if aParam has a value outside the valid range, or
|
|
1909 |
if aOffset is negative.
|
|
1910 |
@leave KErrBadDescriptor, if the message argument is not an 8-bit descriptor.
|
|
1911 |
*/
|
|
1912 |
EXPORT_C void RMessagePtr2::WriteL(TInt aParam,const TDesC8& aDes,TInt aOffset) const
|
|
1913 |
{
|
|
1914 |
TInt error = Write(aParam,aDes,aOffset);
|
|
1915 |
User::LeaveIfError(error);
|
|
1916 |
}
|
|
1917 |
|
|
1918 |
|
|
1919 |
|
|
1920 |
|
|
1921 |
/**
|
|
1922 |
Writes data from the specified source descriptor to the specified offset within
|
|
1923 |
the 16-bit descriptor argument, and leaving on failure.
|
|
1924 |
|
|
1925 |
@param aParam The index value identifying the argument.
|
|
1926 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1927 |
inclusive.
|
|
1928 |
@param aDes The source descriptor containing the data to be written.
|
|
1929 |
@param aOffset The offset from the start of the client's descriptor.
|
|
1930 |
If not explicitly specified, the offset defaults to zero.
|
|
1931 |
|
|
1932 |
@leave KErrArgument if aParam has a value outside the valid range, or
|
|
1933 |
if aOffset is negative.
|
|
1934 |
@leave KErrBadDescriptor, if the message argument is not a 16-bit descriptor.
|
|
1935 |
*/
|
|
1936 |
EXPORT_C void RMessagePtr2::WriteL(TInt aParam,const TDesC16& aDes,TInt aOffset) const
|
|
1937 |
{
|
|
1938 |
TInt error = Write(aParam,aDes,aOffset);
|
|
1939 |
User::LeaveIfError(error);
|
|
1940 |
}
|
|
1941 |
|
|
1942 |
|
|
1943 |
|
|
1944 |
|
|
1945 |
/**
|
|
1946 |
Reads data from the specified offset within the 8-bit descriptor
|
|
1947 |
argument, into the specified target descriptor.
|
|
1948 |
|
|
1949 |
@param aParam The index value identifying the argument.
|
|
1950 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1951 |
inclusive.
|
|
1952 |
@param aDes The target descriptor into which the client data is
|
|
1953 |
to be written.
|
|
1954 |
@param aOffset The offset from the start of the client's descriptor data.
|
|
1955 |
If not explicitly specified, the offset defaults to zero.
|
|
1956 |
|
|
1957 |
@return KErrNone, if successful;
|
|
1958 |
KErrArgument if aParam has a value outside the valid range, or
|
|
1959 |
if aOffset is negative.
|
|
1960 |
KErrBadDescriptor, if the message argument is not an 8-bit descriptor.
|
|
1961 |
*/
|
|
1962 |
EXPORT_C TInt RMessagePtr2::Read(TInt aParam,TDes8& aDes,TInt aOffset) const
|
|
1963 |
{
|
|
1964 |
SIpcCopyInfo info;
|
|
1965 |
info.iFlags=KChunkShiftBy0|KIpcDirRead;
|
|
1966 |
info.iLocalLen=aDes.MaxLength();
|
|
1967 |
info.iLocalPtr=(TUint8*)aDes.Ptr();
|
|
1968 |
TInt r=Exec::MessageIpcCopy(iHandle,aParam,info,aOffset);
|
|
1969 |
if (r<0)
|
|
1970 |
return r;
|
|
1971 |
aDes.SetLength(r);
|
|
1972 |
return KErrNone;
|
|
1973 |
}
|
|
1974 |
|
|
1975 |
|
|
1976 |
|
|
1977 |
|
|
1978 |
/**
|
|
1979 |
Reads data from the specified offset within the 16-bit descriptor
|
|
1980 |
argument, into the specified target descriptor.
|
|
1981 |
|
|
1982 |
@param aParam The index value identifying the argument.
|
|
1983 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
1984 |
inclusive.
|
|
1985 |
@param aDes The target descriptor into which the client data is
|
|
1986 |
to be written.
|
|
1987 |
@param aOffset The offset from the start of the client's descriptor data.
|
|
1988 |
If not explicitly specified, the offset defaults to zero.
|
|
1989 |
|
|
1990 |
@return KErrNone, if successful;
|
|
1991 |
KErrArgument if aParam has a value outside the valid range, or
|
|
1992 |
if aOffset is negative.
|
|
1993 |
KErrBadDescriptor, if the message argument is not a 16-bit descriptor.
|
|
1994 |
*/
|
|
1995 |
EXPORT_C TInt RMessagePtr2::Read(TInt aParam,TDes16 &aDes,TInt aOffset) const
|
|
1996 |
{
|
|
1997 |
SIpcCopyInfo info;
|
|
1998 |
info.iFlags=KChunkShiftBy1|KIpcDirRead;
|
|
1999 |
info.iLocalLen=aDes.MaxLength();
|
|
2000 |
info.iLocalPtr=(TUint8*)aDes.Ptr();
|
|
2001 |
TInt r=Exec::MessageIpcCopy(iHandle,aParam,info,aOffset);
|
|
2002 |
if (r<0)
|
|
2003 |
return r;
|
|
2004 |
aDes.SetLength(r);
|
|
2005 |
return KErrNone;
|
|
2006 |
}
|
|
2007 |
|
|
2008 |
|
|
2009 |
|
|
2010 |
|
|
2011 |
/**
|
|
2012 |
Writes data from the specified source descriptor to the specified offset within
|
|
2013 |
the 8-bit descriptor argument.
|
|
2014 |
|
|
2015 |
@param aParam The index value identifying the argument.
|
|
2016 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
2017 |
inclusive.
|
|
2018 |
@param aDes The source descriptor containing the data to be written.
|
|
2019 |
@param aOffset The offset from the start of the client's descriptor.
|
|
2020 |
If not explicitly specified, the offset defaults to zero.
|
|
2021 |
|
|
2022 |
@return KErrNone, if successful;
|
|
2023 |
KErrArgument if aParam has a value outside the valid range, or
|
|
2024 |
if aOffset is negative.
|
|
2025 |
KErrBadDescriptor, if the message argument is not an 8-bit descriptor;
|
|
2026 |
KErrOverflow, if the target descriptor is too small
|
|
2027 |
to containt the data.
|
|
2028 |
*/
|
|
2029 |
EXPORT_C TInt RMessagePtr2::Write(TInt aParam,const TDesC8& aDes,TInt aOffset) const
|
|
2030 |
{
|
|
2031 |
SIpcCopyInfo info;
|
|
2032 |
info.iFlags=KChunkShiftBy0|KIpcDirWrite;
|
|
2033 |
info.iLocalLen=aDes.Length();
|
|
2034 |
info.iLocalPtr=(TUint8*)aDes.Ptr();
|
|
2035 |
return Exec::MessageIpcCopy(iHandle,aParam,info,aOffset);
|
|
2036 |
}
|
|
2037 |
|
|
2038 |
|
|
2039 |
|
|
2040 |
|
|
2041 |
/**
|
|
2042 |
Writes data from the specified source descriptor to the specified offset within
|
|
2043 |
the 16-bit descriptor argument.
|
|
2044 |
|
|
2045 |
@param aParam The index value identifying the argument.
|
|
2046 |
This is a value in the range 0 to (KMaxMessageArguments-1)
|
|
2047 |
inclusive.
|
|
2048 |
@param aDes The source descriptor containing the data to be written.
|
|
2049 |
@param aOffset The offset from the start of the client's descriptor.
|
|
2050 |
If not explicitly specified, the offset defaults to zero.
|
|
2051 |
|
|
2052 |
@return KErrNone, if successful;
|
|
2053 |
KErrArgument if aParam has a value outside the valid range, or
|
|
2054 |
if aOffset is negative.
|
|
2055 |
KErrBadDescriptor, if the message argument is not an 16-bit descriptor;
|
|
2056 |
KErrOverflow, if the target descriptor is too small
|
|
2057 |
to containt the data.
|
|
2058 |
*/
|
|
2059 |
EXPORT_C TInt RMessagePtr2::Write(TInt aParam,const TDesC16& aDes,TInt aOffset) const
|
|
2060 |
{
|
|
2061 |
SIpcCopyInfo info;
|
|
2062 |
info.iFlags=KChunkShiftBy1|KIpcDirWrite;
|
|
2063 |
info.iLocalLen=aDes.Length();
|
|
2064 |
info.iLocalPtr=(TUint8*)aDes.Ptr();
|
|
2065 |
return Exec::MessageIpcCopy(iHandle,aParam,info,aOffset);
|
|
2066 |
}
|
|
2067 |
|
|
2068 |
|
|
2069 |
|
|
2070 |
|
|
2071 |
/**
|
|
2072 |
Panics the client.
|
|
2073 |
|
|
2074 |
The length of the category name should be no greater than 16; any name with
|
|
2075 |
a length greater than 16 is truncated to 16.
|
|
2076 |
|
|
2077 |
Note that this method also completes the message. A subsequent call to Complete(TInt aReason) would cause a server panic.
|
|
2078 |
|
|
2079 |
@param aCategory The panic category.
|
|
2080 |
@param aReason The panic code.
|
|
2081 |
*/
|
|
2082 |
EXPORT_C void RMessagePtr2::Panic(const TDesC& aCategory,TInt aReason) const
|
|
2083 |
{
|
|
2084 |
TBuf8<KMaxExitCategoryName> cat;
|
|
2085 |
TInt length=aCategory.Length();
|
|
2086 |
if(length>KMaxExitCategoryName)
|
|
2087 |
{
|
|
2088 |
TPtr catPtr((TUint16*)aCategory.Ptr(),KMaxExitCategoryName,KMaxExitCategoryName);
|
|
2089 |
cat.Copy(catPtr);
|
|
2090 |
}
|
|
2091 |
else
|
|
2092 |
{
|
|
2093 |
cat.Copy(aCategory);
|
|
2094 |
}
|
|
2095 |
Exec::MessageKill(iHandle,EExitPanic,aReason,&cat);
|
|
2096 |
Complete(KErrNone);
|
|
2097 |
}
|
|
2098 |
|
|
2099 |
|
|
2100 |
|
|
2101 |
|
|
2102 |
/**
|
|
2103 |
Kills the client.
|
|
2104 |
|
|
2105 |
Note that this method also completes the message. A subsequent call to Complete(TInt aReason) would cause a server panic.
|
|
2106 |
|
|
2107 |
@param aReason The reason code associated with killing the client.
|
|
2108 |
*/
|
|
2109 |
EXPORT_C void RMessagePtr2::Kill(TInt aReason) const
|
|
2110 |
{
|
|
2111 |
Exec::MessageKill(iHandle,EExitKill,aReason,NULL);
|
|
2112 |
Complete(KErrNone);
|
|
2113 |
}
|
|
2114 |
|
|
2115 |
|
|
2116 |
|
|
2117 |
|
|
2118 |
/**
|
|
2119 |
Terminates the client.
|
|
2120 |
|
|
2121 |
Note that this method also completes the message. A subsequent call to Complete(TInt aReason) would cause a server panic.
|
|
2122 |
|
|
2123 |
@param aReason The reason code associated with terminating the client.
|
|
2124 |
*/
|
|
2125 |
EXPORT_C void RMessagePtr2::Terminate(TInt aReason) const
|
|
2126 |
{
|
|
2127 |
Exec::MessageKill(iHandle,EExitTerminate,aReason,NULL);
|
|
2128 |
Complete(KErrNone);
|
|
2129 |
}
|
|
2130 |
|
|
2131 |
|
|
2132 |
|
|
2133 |
|
|
2134 |
/**
|
|
2135 |
Sets the priority of the client's process.
|
|
2136 |
|
|
2137 |
@param aPriority The priority value.
|
|
2138 |
|
|
2139 |
@return KErrNone, if successful, otherwise one of the other system-wide error codes.
|
|
2140 |
*/
|
|
2141 |
EXPORT_C TInt RMessagePtr2::SetProcessPriority(TProcessPriority aPriority) const
|
|
2142 |
{
|
|
2143 |
return Exec::MessageSetProcessPriority(iHandle,aPriority);
|
|
2144 |
}
|
|
2145 |
|
|
2146 |
|
|
2147 |
|
|
2148 |
/**
|
|
2149 |
Opens a handle on the client thread.
|
|
2150 |
|
|
2151 |
@param aClient On successful return, the handle to the client thread.
|
|
2152 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
2153 |
the handle. If not explicitly specified,
|
|
2154 |
EOwnerProcess is taken as default.
|
|
2155 |
|
|
2156 |
@return KErrNone.
|
|
2157 |
*/
|
|
2158 |
EXPORT_C TInt RMessagePtr2::Client(RThread& aClient, TOwnerType aOwnerType) const
|
|
2159 |
{
|
|
2160 |
return aClient.SetReturnedHandle(Exec::MessageClient(iHandle,aOwnerType));
|
|
2161 |
}
|
|
2162 |
|
|
2163 |
EXPORT_C TUint RMessagePtr2::ClientProcessFlags() const
|
|
2164 |
{
|
|
2165 |
return Exec::MessageClientProcessFlags(iHandle);
|
|
2166 |
}
|
|
2167 |
|
|
2168 |
EXPORT_C TBool RMessagePtr2::ClientIsRealtime() const
|
|
2169 |
{
|
|
2170 |
return (Exec::MessageClientProcessFlags(iHandle) & KThreadFlagRealtime) != 0;
|
|
2171 |
}
|
|
2172 |
|
|
2173 |
|
|
2174 |
|
|
2175 |
/**
|
|
2176 |
Returns the pointer to the clients TRequestStatus associated with the message.
|
|
2177 |
|
|
2178 |
The return value is intended to be used as a unique identifier (for example,
|
|
2179 |
to uniquely identify an asynchronous message when cancelling the request).
|
|
2180 |
The memory must never be accessed directly or completed.
|
|
2181 |
|
|
2182 |
@return The clients TRequestStatus (returns NULL if the request is not asynchronous)
|
|
2183 |
*/
|
|
2184 |
EXPORT_C const TRequestStatus* RMessagePtr2::ClientStatus() const
|
|
2185 |
{
|
|
2186 |
return Exec::MessageClientStatus(iHandle);
|
|
2187 |
}
|
|
2188 |
|
|
2189 |
|
|
2190 |
|
|
2191 |
EXPORT_C TInt RServer2::CreateGlobal(const TDesC& aName, TInt aMode, TInt aRole, TInt aOpts)
|
|
2192 |
//
|
|
2193 |
// Create a new server.
|
|
2194 |
//
|
|
2195 |
{
|
|
2196 |
TInt r = User::ValidateName(aName);
|
|
2197 |
if (r != KErrNone)
|
|
2198 |
return r;
|
|
2199 |
TBuf8<KMaxKernelName> name8;
|
|
2200 |
name8.Copy(aName);
|
|
2201 |
r = Exec::ServerCreateWithOptions(&name8, aMode, aRole, aOpts);
|
|
2202 |
return SetReturnedHandle(r, *this);
|
|
2203 |
}
|
|
2204 |
|
|
2205 |
EXPORT_C TInt RServer2::CreateGlobal(const TDesC& aName, TInt aMode)
|
|
2206 |
{
|
|
2207 |
return CreateGlobal(aName, aMode, EServerRole_Default, 0);
|
|
2208 |
}
|
|
2209 |
|
|
2210 |
EXPORT_C TInt RServer2::CreateGlobal(const TDesC& aName)
|
|
2211 |
{
|
|
2212 |
return CreateGlobal(aName, EIpcSession_Sharable);
|
|
2213 |
}
|
|
2214 |
|
|
2215 |
TInt RSessionBase::DoConnect(const TVersion &aVersion,TRequestStatus* aStatus)
|
|
2216 |
{
|
|
2217 |
extern int TVersion_size_assert[sizeof(TVersion)==sizeof(TInt)?1:-1]; // Make sure TVersion is same size as int
|
|
2218 |
(void)TVersion_size_assert;
|
|
2219 |
|
|
2220 |
TIpcArgs p(*(TInt*)&aVersion);
|
|
2221 |
TInt r;
|
|
2222 |
if(aStatus==NULL)
|
|
2223 |
r = SendSync(RMessage2::EConnect, &p);
|
|
2224 |
else
|
|
2225 |
r = SendAsync(RMessage2::EConnect, &p, aStatus);
|
|
2226 |
if (r!=KErrNone)
|
|
2227 |
Close();
|
|
2228 |
return r;
|
|
2229 |
}
|
|
2230 |
|
|
2231 |
|
|
2232 |
|
|
2233 |
|
|
2234 |
/**
|
|
2235 |
Creates a session with a server.
|
|
2236 |
|
|
2237 |
It should be called as part of session initialisation in the derived class.
|
|
2238 |
|
|
2239 |
@param aServer The name of the server with which a session is to
|
|
2240 |
be established.
|
|
2241 |
@param aVersion The lowest version of the server with which this client
|
|
2242 |
is compatible.
|
|
2243 |
@param aAsyncMessageSlots The number of message slots available to this session.
|
|
2244 |
This determines the number of outstanding requests the client
|
|
2245 |
may have with the server at any one time.
|
|
2246 |
The maximum number of slots is 255.
|
|
2247 |
If aAsyncMessageSlots==-1 then this indicates that the session should use
|
|
2248 |
messages from the global free pool of messages.
|
|
2249 |
@param aType The type of session to create. See TIpcSessionType.
|
|
2250 |
@param aPolicy A pointer to a TSecurityPolicy object. If this pointer is not 0 (zero)
|
|
2251 |
then the policy is applied to the process in which the server is running.
|
|
2252 |
If that process doesn't pass this security policy check, then the session
|
|
2253 |
creation will fail with the error KErrPermissionDenied.
|
|
2254 |
This security check allows clients to verify that the server has the expected
|
|
2255 |
Platform Security attributes.
|
|
2256 |
|
|
2257 |
When a check fails the action taken is determined by the system wide Platform Security
|
|
2258 |
configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
|
|
2259 |
If PlatSecEnforcement is OFF, then this function will return KErrNone even though the
|
|
2260 |
check failed.
|
|
2261 |
|
|
2262 |
@param aStatus A pointer to TRequestStatus object which will be signalled when the session
|
|
2263 |
has been created, or in the event of an error.
|
|
2264 |
If aStatus==0 then session creation is done synchronously.
|
|
2265 |
|
|
2266 |
@return KErrNone if successful;
|
|
2267 |
KErrArgument, if an attempt is made to specify more
|
|
2268 |
than 255 message slots;
|
|
2269 |
otherwise one of the other system-wide error codes.
|
|
2270 |
*/
|
|
2271 |
EXPORT_C TInt RSessionBase::CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy, TRequestStatus* aStatus)
|
|
2272 |
{
|
|
2273 |
TInt r = User::ValidateName(aServer);
|
|
2274 |
if(KErrNone!=r)
|
|
2275 |
return r;
|
|
2276 |
TBuf8<KMaxKernelName> name8;
|
|
2277 |
name8.Copy(aServer);
|
|
2278 |
r=SetReturnedHandle(Exec::SessionCreate(name8,aAsyncMessageSlots,aPolicy,aType));
|
|
2279 |
if(r==KErrNone)
|
|
2280 |
r=DoConnect(aVersion,aStatus);
|
|
2281 |
return r;
|
|
2282 |
}
|
|
2283 |
|
|
2284 |
|
|
2285 |
|
|
2286 |
|
|
2287 |
/**
|
|
2288 |
Creates a session with a server.
|
|
2289 |
|
|
2290 |
It should be called as part of session initialisation in the derived class.
|
|
2291 |
|
|
2292 |
@param aServer The name of the server with which a session is to
|
|
2293 |
be established.
|
|
2294 |
@param aVersion The lowest version of the server with which this client
|
|
2295 |
is compatible.
|
|
2296 |
@param aAsyncMessageSlots The number of message slots available to this session.
|
|
2297 |
This determines the number of outstanding requests the client
|
|
2298 |
may have with the server at any one time.
|
|
2299 |
The maximum number of slots is 255.
|
|
2300 |
If aAsyncMessageSlots==-1 then this indicates that the session should use
|
|
2301 |
messages from the global free pool of messages.
|
|
2302 |
|
|
2303 |
@return KErrNone if successful;
|
|
2304 |
KErrArgument, if an attempt is made to specify more
|
|
2305 |
than 255 message slots;
|
|
2306 |
otherwise one of the other system-wide error codes.
|
|
2307 |
*/
|
|
2308 |
EXPORT_C TInt RSessionBase::CreateSession(const TDesC &aServer, const TVersion &aVersion, TInt aAsyncMessageSlots)
|
|
2309 |
{
|
|
2310 |
return RSessionBase::CreateSession(aServer,aVersion,aAsyncMessageSlots,EIpcSession_Unsharable,NULL,0);
|
|
2311 |
}
|
|
2312 |
|
|
2313 |
|
|
2314 |
|
|
2315 |
|
|
2316 |
/**
|
|
2317 |
Creates a session with a server.
|
|
2318 |
|
|
2319 |
It should be called as part of session initialisation in the derived class.
|
|
2320 |
|
|
2321 |
@param aServer A handle to a server with which a session is to be established.
|
|
2322 |
@param aVersion The lowest version of the server with which this client
|
|
2323 |
is compatible.
|
|
2324 |
@param aAsyncMessageSlots The number of message slots available to this session.
|
|
2325 |
This determines the number of outstanding requests the client
|
|
2326 |
may have with the server at any one time.
|
|
2327 |
The maximum number of slots is 255.
|
|
2328 |
If aAsyncMessageSlots==-1 then this indicates that the session should use
|
|
2329 |
messages from the global free pool of messages.
|
|
2330 |
@param aType The type of session to create. See TIpcSessionType.
|
|
2331 |
@param aPolicy A pointer to a TSecurityPolicy object. If this pointer is not 0 (zero)
|
|
2332 |
then the policy is applied to the process in which the server is running.
|
|
2333 |
If that process doesn't pass this security policy check, then the session
|
|
2334 |
creation will fail with the error KErrPermissionDenied.
|
|
2335 |
This security check allows clients to verify that the server has the expected
|
|
2336 |
Platform Security attributes.
|
|
2337 |
|
|
2338 |
When a check fails the action taken is determined by the system wide Platform Security
|
|
2339 |
configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
|
|
2340 |
If PlatSecEnforcement is OFF, then this function will return KErrNone even though the
|
|
2341 |
check failed.
|
|
2342 |
|
|
2343 |
@param aStatus A pointer to TRequestStatus object which will be signalled when the session
|
|
2344 |
has been created, or in the event of an error.
|
|
2345 |
If aStatus==0 then session creation is done synchronously.
|
|
2346 |
|
|
2347 |
@return KErrNone if successful;
|
|
2348 |
KErrArgument, if an attempt is made to specify more
|
|
2349 |
than 255 message slots;
|
|
2350 |
otherwise one of the other system-wide error codes.
|
|
2351 |
*/
|
|
2352 |
EXPORT_C TInt RSessionBase::CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy, TRequestStatus* aStatus)
|
|
2353 |
{
|
|
2354 |
TInt r;
|
|
2355 |
r=SetReturnedHandle(Exec::SessionCreateFromHandle(aServer.Handle(),aAsyncMessageSlots,aPolicy,aType));
|
|
2356 |
if(r==KErrNone)
|
|
2357 |
r=DoConnect(aVersion,aStatus);
|
|
2358 |
return r;
|
|
2359 |
}
|
|
2360 |
|
|
2361 |
|
|
2362 |
|
|
2363 |
|
|
2364 |
/**
|
|
2365 |
Creates a session with a server.
|
|
2366 |
|
|
2367 |
It should be called as part of session initialisation in the derived class.
|
|
2368 |
|
|
2369 |
@param aServer A handle to a server with which a session is to be established.
|
|
2370 |
@param aVersion The lowest version of the server with which this client
|
|
2371 |
is compatible.
|
|
2372 |
@param aAsyncMessageSlots The number of message slots available to this session.
|
|
2373 |
This determines the number of outstanding requests the client
|
|
2374 |
may have with the server at any one time.
|
|
2375 |
The maximum number of slots is 255.
|
|
2376 |
If aAsyncMessageSlots==-1 then this indicates that the session should use
|
|
2377 |
messages from the global free pool of messages.
|
|
2378 |
|
|
2379 |
@return KErrNone if successful;
|
|
2380 |
KErrArgument, if an attempt is made to specify more
|
|
2381 |
than 255 message slots;
|
|
2382 |
otherwise one of the other system-wide error codes.
|
|
2383 |
*/
|
|
2384 |
EXPORT_C TInt RSessionBase::CreateSession(RServer2 aServer, const TVersion &aVersion, TInt aAsyncMessageSlots)
|
|
2385 |
{
|
|
2386 |
return RSessionBase::CreateSession(aServer,aVersion,aAsyncMessageSlots,EIpcSession_Unsharable,NULL,0);
|
|
2387 |
}
|
|
2388 |
|
|
2389 |
|
|
2390 |
|
|
2391 |
|
|
2392 |
/**
|
|
2393 |
Opens a handle to a session using a handle number sent by a client
|
|
2394 |
to a server.
|
|
2395 |
|
|
2396 |
This function is called by the server.
|
|
2397 |
|
|
2398 |
@param aMessage The message pointer.
|
|
2399 |
@param aParam An index specifying which of the four message arguments
|
|
2400 |
contains the handle number.
|
|
2401 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2402 |
session handle. If not explicitly specified, EOwnerProcess
|
|
2403 |
is taken as default.
|
|
2404 |
|
|
2405 |
@return KErrNone, if successful;
|
|
2406 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
2407 |
KErrBadHandle, if not a valid handle;
|
|
2408 |
otherwise one of the other system-wide error codes.
|
|
2409 |
*/
|
|
2410 |
EXPORT_C TInt RSessionBase::Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType)
|
|
2411 |
{
|
|
2412 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(),ESession,aParam,aType));
|
|
2413 |
}
|
|
2414 |
|
|
2415 |
|
|
2416 |
|
|
2417 |
|
|
2418 |
/**
|
|
2419 |
Opens a handle to a session using a handle number sent by a client
|
|
2420 |
to a server, and validate that the session's server passes a given
|
|
2421 |
security policy.
|
|
2422 |
|
|
2423 |
This function is called by the server.
|
|
2424 |
|
|
2425 |
@param aMessage The message pointer.
|
|
2426 |
@param aParam An index specifying which of the four message arguments
|
|
2427 |
contains the handle number.
|
|
2428 |
@param aServerPolicy The policy to validate the session's server against.
|
|
2429 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2430 |
session handle. If not explicitly specified, EOwnerProcess
|
|
2431 |
is taken as default.
|
|
2432 |
|
|
2433 |
@return KErrNone, if successful;
|
|
2434 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
2435 |
KErrBadHandle, if not a valid handle;
|
|
2436 |
KErrServerTerminating, if the session is no longer connected to a server;
|
|
2437 |
KErrPermissionDenied, if the session's server does not pass the given security policy;
|
|
2438 |
otherwise one of the other system-wide error codes.
|
|
2439 |
*/
|
|
2440 |
EXPORT_C TInt RSessionBase::Open(RMessagePtr2 aMessage,TInt aParam,const TSecurityPolicy& aServerPolicy,TOwnerType aType)
|
|
2441 |
{
|
|
2442 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(),ESession,aParam,aType),aServerPolicy);
|
|
2443 |
}
|
|
2444 |
|
|
2445 |
|
|
2446 |
|
|
2447 |
/**
|
|
2448 |
Sets the handle-number of this session handle to the specified value after
|
|
2449 |
validating that the session's server passes a given security policy.
|
|
2450 |
|
|
2451 |
The function can take a (zero or positive) handle-number,
|
|
2452 |
or a (negative) error number.
|
|
2453 |
|
|
2454 |
If aHandleOrError represents a handle-number, then the handle-number of this handle
|
|
2455 |
is set to that value, as long as the session's server passes the security policy.
|
|
2456 |
If aHandleOrError represents an error number, then the handle-number of this handle is set to zero
|
|
2457 |
and the negative value is returned.
|
|
2458 |
|
|
2459 |
@param aHandleOrError A handle-number, if zero or positive; an error value, if negative.
|
|
2460 |
@param aServerPolicy The policy to validate the session's server against.
|
|
2461 |
|
|
2462 |
@return KErrNone, if aHandle is a handle-number; KErrPermissionDenied, if the session's server
|
|
2463 |
does not pass the security policy; the value of aHandleOrError, otherwise.
|
|
2464 |
*/
|
|
2465 |
EXPORT_C TInt RSessionBase::SetReturnedHandle(TInt aHandleOrError,const TSecurityPolicy& aServerPolicy)
|
|
2466 |
{
|
|
2467 |
if(aHandleOrError<0)
|
|
2468 |
return aHandleOrError;
|
|
2469 |
|
|
2470 |
TInt r = aServerPolicy.CheckPolicy((RSessionBase&)aHandleOrError);
|
|
2471 |
if (r!=KErrNone)
|
|
2472 |
{
|
|
2473 |
((RHandleBase&)aHandleOrError).Close();
|
|
2474 |
return r;
|
|
2475 |
}
|
|
2476 |
|
|
2477 |
iHandle=aHandleOrError;
|
|
2478 |
return KErrNone;
|
|
2479 |
}
|
|
2480 |
|
|
2481 |
|
|
2482 |
|
|
2483 |
|
|
2484 |
/**
|
|
2485 |
Opens a handle to a session using a handle number passed as an
|
|
2486 |
environment data item to the child process during the creation of
|
|
2487 |
that child process.
|
|
2488 |
|
|
2489 |
Note that this function can only be called successfully once.
|
|
2490 |
|
|
2491 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
2492 |
environment data that contains the handle number. This is
|
|
2493 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
2494 |
This can range from 0 to 15.
|
|
2495 |
|
|
2496 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
2497 |
this session handle. If not explicitly specified,
|
|
2498 |
EOwnerProcess is taken as default.
|
|
2499 |
|
|
2500 |
@return KErrNone, if successful;
|
|
2501 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
2502 |
KErrArgument, if the slot does not contain a session handle;
|
|
2503 |
otherwise one of the other system-wide error codes.
|
|
2504 |
*/
|
|
2505 |
EXPORT_C TInt RSessionBase::Open(TInt aArgumentIndex, TOwnerType aOwnerType)
|
|
2506 |
{
|
|
2507 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, ESession, aOwnerType));
|
|
2508 |
}
|
|
2509 |
|
|
2510 |
|
|
2511 |
/**
|
|
2512 |
Opens a handle to a session using a handle number passed as an
|
|
2513 |
environment data item to the child process during the creation of
|
|
2514 |
that child process, after validating that the session's server passes
|
|
2515 |
the given security policy.
|
|
2516 |
|
|
2517 |
Note that this function can only be called successfully once.
|
|
2518 |
|
|
2519 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
2520 |
environment data that contains the handle number. This is
|
|
2521 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
2522 |
This can range from 0 to 15.
|
|
2523 |
@param aServerPolicy The policy to validate the session's server against.
|
|
2524 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
2525 |
this session handle. If not explicitly specified,
|
|
2526 |
EOwnerProcess is taken as default.
|
|
2527 |
|
|
2528 |
@return KErrNone, if successful;
|
|
2529 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
2530 |
KErrArgument, if the slot does not contain a session handle;
|
|
2531 |
KErrServerTerminating, if the session is no longer connected to a server;
|
|
2532 |
KErrPermissionDenied, if the session's server does not pass the given security policy;
|
|
2533 |
otherwise one of the other system-wide error codes.
|
|
2534 |
*/
|
|
2535 |
EXPORT_C TInt RSessionBase::Open(TInt aArgumentIndex, const TSecurityPolicy& aServerPolicy, TOwnerType aOwnerType)
|
|
2536 |
{
|
|
2537 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, ESession, aOwnerType), aServerPolicy);
|
|
2538 |
}
|
|
2539 |
|
|
2540 |
|
|
2541 |
EXPORT_C TInt RSessionBase::DoShare(TInt aMode)
|
|
2542 |
//
|
|
2543 |
// Make the session accessible to all threads in this process
|
|
2544 |
//
|
|
2545 |
{
|
|
2546 |
return Exec::SessionShare(iHandle, (aMode&KCreateProtectedObject) ? EIpcSession_GlobalSharable : EIpcSession_Sharable);
|
|
2547 |
}
|
|
2548 |
|
|
2549 |
|
|
2550 |
|
|
2551 |
|
|
2552 |
TInt RSessionBase::SendSync(TInt aFunction,const TIpcArgs* aArgs) const
|
|
2553 |
//
|
|
2554 |
// Send a synchronous message.
|
|
2555 |
//
|
|
2556 |
{
|
|
2557 |
TRequestStatus s=KRequestPending;
|
|
2558 |
TInt r=Exec::SessionSendSync(iHandle,aFunction,(TAny*)aArgs,&s);
|
|
2559 |
if (r==KErrNone)
|
|
2560 |
{
|
|
2561 |
User::WaitForRequest(s);
|
|
2562 |
r=s.Int();
|
|
2563 |
}
|
|
2564 |
return r;
|
|
2565 |
}
|
|
2566 |
|
|
2567 |
TInt RSessionBase::SendAsync(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus *aStatus) const
|
|
2568 |
//
|
|
2569 |
// Send an asynchronous message.
|
|
2570 |
//
|
|
2571 |
{
|
|
2572 |
if (aStatus)
|
|
2573 |
*aStatus=KRequestPending;
|
|
2574 |
return Exec::SessionSend(iHandle,aFunction,(TAny*)aArgs,aStatus);
|
|
2575 |
}
|
|
2576 |
|
|
2577 |
|
|
2578 |
|
|
2579 |
|
|
2580 |
EXPORT_C TInt RMutex::CreateLocal(TOwnerType aType)
|
|
2581 |
/**
|
|
2582 |
Creates a mutex and opens this handle to the mutex.
|
|
2583 |
|
|
2584 |
The kernel side object representing the mutex is unnamed. This means that
|
|
2585 |
it is not possible to search for the mutex, which makes it local to the current
|
|
2586 |
process.
|
|
2587 |
|
|
2588 |
By default, any thread in the process can use this instance of RMutex to access
|
|
2589 |
the mutex. However, specifying EOwnerThread as the parameter to this function,
|
|
2590 |
means that only the creating thread can use this instance of RMutex to access
|
|
2591 |
the mutex; any other thread in this process that wants to access the mutex
|
|
2592 |
must duplicate this handle.
|
|
2593 |
|
|
2594 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2595 |
mutex handle. If not explicitly specified, EOwnerProcess is taken
|
|
2596 |
as default.
|
|
2597 |
|
|
2598 |
@return KErrNone if successful, otherwise one of the system wide error codes.
|
|
2599 |
|
|
2600 |
@see RHandleBase::Duplicate()
|
|
2601 |
*/
|
|
2602 |
{
|
|
2603 |
return SetReturnedHandle(Exec::MutexCreate(NULL,aType),*this);
|
|
2604 |
}
|
|
2605 |
|
|
2606 |
|
|
2607 |
|
|
2608 |
|
|
2609 |
EXPORT_C TInt RMutex::CreateGlobal(const TDesC &aName,TOwnerType aType)
|
|
2610 |
/**
|
|
2611 |
Creates a global mutex and opens this handle to the mutex.
|
|
2612 |
|
|
2613 |
The kernel side object representing the mutex is given the name contained
|
|
2614 |
in the specified descriptor, which makes it global. This means that any thread
|
|
2615 |
in any process can search for the mutex, using TFindMutex, and open a handle
|
|
2616 |
to it. If the specified name is empty the kernel side object representing the
|
|
2617 |
mutex is unnamed and so cannot be opened by name. It can however be passed
|
|
2618 |
to another process as a process parameter or via IPC.
|
|
2619 |
|
|
2620 |
By default, any thread in the process can use this instance of RMutex to access
|
|
2621 |
the mutex. However, specifying EOwnerThread as the second parameter to this
|
|
2622 |
function, means that only the creating thread can use this instance of RMutex
|
|
2623 |
to access the mutex; any other thread in this process that wants to access
|
|
2624 |
the mutex must either duplicate this handle or use OpenGlobal().
|
|
2625 |
|
|
2626 |
@param aName The name to be assigned to this global mutex.
|
|
2627 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2628 |
mutex handle. If not explicitly specified, EOwnerProcess is
|
|
2629 |
taken as default.
|
|
2630 |
|
|
2631 |
@return KErrNone if successful, otherwise one of the other system wide error
|
|
2632 |
codes.
|
|
2633 |
|
|
2634 |
@see OpenGlobal
|
|
2635 |
@see RHandleBase::Duplicate()
|
|
2636 |
@see TFindMutex
|
|
2637 |
*/
|
|
2638 |
{
|
|
2639 |
TInt r = User::ValidateName(aName);
|
|
2640 |
if(KErrNone!=r)
|
|
2641 |
return r;
|
|
2642 |
TBuf8<KMaxKernelName> name8;
|
|
2643 |
name8.Copy(aName);
|
|
2644 |
return SetReturnedHandle(Exec::MutexCreate(&name8,aType),*this);
|
|
2645 |
}
|
|
2646 |
|
|
2647 |
|
|
2648 |
|
|
2649 |
|
|
2650 |
EXPORT_C TInt RMutex::OpenGlobal(const TDesC &aName,TOwnerType aType)
|
|
2651 |
/**
|
|
2652 |
Opens a handle to a global mutex.
|
|
2653 |
|
|
2654 |
Global mutexes are identified by name.
|
|
2655 |
|
|
2656 |
By default, any thread in the process can use this instance of RMutex to access
|
|
2657 |
the mutex. However, specifying EOwnerThread as the second parameter to this
|
|
2658 |
function, means that only the opening thread can use this instance of RMutex
|
|
2659 |
to access the mutex; any other thread in this process that wants to access
|
|
2660 |
the mutex must either duplicate the handle or use OpenGlobal() again.
|
|
2661 |
|
|
2662 |
@param aName The name of the global mutex which is to be opened.
|
|
2663 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2664 |
mutex handle. If not explicitly specified, EOwnerProcess
|
|
2665 |
is taken as default.
|
|
2666 |
|
|
2667 |
@return KErrNone if successful, otherwise another of the system wide error
|
|
2668 |
codes.
|
|
2669 |
@see RHandleBase::Duplicate()
|
|
2670 |
*/
|
|
2671 |
{
|
|
2672 |
return OpenByName(aName,aType,EMutex);
|
|
2673 |
}
|
|
2674 |
|
|
2675 |
|
|
2676 |
|
|
2677 |
|
|
2678 |
EXPORT_C TInt RMutex::Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType)
|
|
2679 |
/**
|
|
2680 |
Opens a handle to a mutex using a handle number sent by a client
|
|
2681 |
to a server.
|
|
2682 |
|
|
2683 |
This function is called by the server.
|
|
2684 |
|
|
2685 |
@param aMessage The message pointer.
|
|
2686 |
@param aParam An index specifying which of the four message arguments
|
|
2687 |
contains the handle number.
|
|
2688 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2689 |
mutex handle. If not explicitly specified, EOwnerProcess is
|
|
2690 |
taken as default.
|
|
2691 |
|
|
2692 |
@return KErrNone, if successful;
|
|
2693 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
2694 |
KErrBadHandle, if not a valid handle;
|
|
2695 |
otherwise one of the other system-wide error codes.
|
|
2696 |
*/
|
|
2697 |
{
|
|
2698 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(),EMutex,aParam,aType));
|
|
2699 |
}
|
|
2700 |
|
|
2701 |
|
|
2702 |
|
|
2703 |
|
|
2704 |
EXPORT_C TInt RMutex::Open(TInt aArgumentIndex, TOwnerType aOwnerType)
|
|
2705 |
/**
|
|
2706 |
Opens a handle to a mutex using a handle number passed as an
|
|
2707 |
environment data item to the child process during the creation of
|
|
2708 |
that child process.
|
|
2709 |
|
|
2710 |
Note that this function can only be called successfully once.
|
|
2711 |
|
|
2712 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
2713 |
environment data that contains the handle number. This is
|
|
2714 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
2715 |
This can range from 0 to 15.
|
|
2716 |
|
|
2717 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
2718 |
this mutex handle. If not explicitly specified,
|
|
2719 |
EOwnerProcess is taken as default.
|
|
2720 |
|
|
2721 |
@return KErrNone, if successful;
|
|
2722 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
2723 |
KErrArgument, if the slot does not contain a mutex handle;
|
|
2724 |
otherwise one of the other system-wide error codes.
|
|
2725 |
|
|
2726 |
@see RProcess::SetParameter()
|
|
2727 |
*/
|
|
2728 |
{
|
|
2729 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, EMutex, aOwnerType));
|
|
2730 |
}
|
|
2731 |
|
|
2732 |
|
|
2733 |
|
|
2734 |
EXPORT_C TInt RCondVar::CreateLocal(TOwnerType aType)
|
|
2735 |
/**
|
|
2736 |
Creates a condition variable and opens this handle to it.
|
|
2737 |
|
|
2738 |
The kernel side object representing the condition variable is unnamed and so
|
|
2739 |
the condition variable cannot be found by name and hence it is local to the
|
|
2740 |
current process.
|
|
2741 |
|
|
2742 |
By default, any thread in the process can use this instance of RCondVar to access
|
|
2743 |
the condition variable. However, specifying EOwnerThread as the parameter to this
|
|
2744 |
function means that only the creating thread can use this instance of RCondVar
|
|
2745 |
to access the condition variable; any other thread in this process that wants to
|
|
2746 |
access the condition variable must duplicate this handle.
|
|
2747 |
|
|
2748 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2749 |
condition variable handle. If not explicitly specified, EOwnerProcess
|
|
2750 |
is taken as default.
|
|
2751 |
|
|
2752 |
@return KErrNone if successful, otherwise one of the system wide error codes.
|
|
2753 |
|
|
2754 |
@see RHandleBase::Duplicate()
|
|
2755 |
*/
|
|
2756 |
{
|
|
2757 |
return SetReturnedHandle(Exec::CondVarCreate(NULL, aType), *this);
|
|
2758 |
}
|
|
2759 |
|
|
2760 |
|
|
2761 |
|
|
2762 |
|
|
2763 |
EXPORT_C TInt RCondVar::CreateGlobal(const TDesC& aName, TOwnerType aType)
|
|
2764 |
/**
|
|
2765 |
Creates a global condition variable and opens this handle to it.
|
|
2766 |
|
|
2767 |
If the specified name is a non-empty string the kernel side object representing
|
|
2768 |
the condition variable is given the specified name and is therefore global. It
|
|
2769 |
may subsequently be opened by name using the RCondVar::OpenGlobal function.
|
|
2770 |
If the specified name is empty the kernel side object representing the condition
|
|
2771 |
variable is unnamed and so cannot be opened by name. It can however be passed
|
|
2772 |
to another process as a process parameter or via IPC.
|
|
2773 |
|
|
2774 |
If the specified name is non-empty it must consist entirely of printable ASCII
|
|
2775 |
characters (codes 0x20 to 0x7e inclusive) and may not contain : * or ?.
|
|
2776 |
|
|
2777 |
By default, any thread in the process can use this instance of RCondVar to access
|
|
2778 |
the condition variable. However, specifying EOwnerThread as the parameter to this
|
|
2779 |
function means that only the creating thread can use this instance of RCondVar
|
|
2780 |
to access the condition variable; any other thread in this process that wants to
|
|
2781 |
access the condition variable must duplicate this handle.
|
|
2782 |
|
|
2783 |
@param aName The name to be assigned to this condition variable.
|
|
2784 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2785 |
condition variable handle. If not explicitly specified, EOwnerProcess
|
|
2786 |
is taken as default.
|
|
2787 |
|
|
2788 |
@return KErrNone if successful, otherwise one of the other system wide error
|
|
2789 |
codes.
|
|
2790 |
|
|
2791 |
@see RCondVar::OpenGlobal()
|
|
2792 |
@see RHandleBase::Duplicate()
|
|
2793 |
@see RProcess::SetParameter(TInt, RHandleBase)
|
|
2794 |
@see TIpcArgs::Set(TInt, RHandleBase)
|
|
2795 |
@see RMessagePtr2::Complete(RHandleBase)
|
|
2796 |
*/
|
|
2797 |
{
|
|
2798 |
TInt r = User::ValidateName(aName);
|
|
2799 |
if (KErrNone!=r)
|
|
2800 |
return r;
|
|
2801 |
TBuf8<KMaxKernelName> name8;
|
|
2802 |
name8.Copy(aName);
|
|
2803 |
return SetReturnedHandle(Exec::CondVarCreate(&name8, aType), *this);
|
|
2804 |
}
|
|
2805 |
|
|
2806 |
|
|
2807 |
|
|
2808 |
|
|
2809 |
EXPORT_C TInt RCondVar::OpenGlobal(const TDesC& aName, TOwnerType aType)
|
|
2810 |
/**
|
|
2811 |
Opens a handle to a global condition variable.
|
|
2812 |
|
|
2813 |
Global condition variables are identified by name.
|
|
2814 |
|
|
2815 |
By default, any thread in the process can use this instance of RCondVar to access
|
|
2816 |
the condition variable. However, specifying EOwnerThread as the parameter to this
|
|
2817 |
function means that only the creating thread can use this instance of RCondVar
|
|
2818 |
to access the condition variable; any other thread in this process that wants to
|
|
2819 |
access the condition variable must either duplicate this handle or use OpenGlobal
|
|
2820 |
again.
|
|
2821 |
|
|
2822 |
@param aName The name of the global condition variable which is to be opened.
|
|
2823 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2824 |
condition variable handle. If not explicitly specified, EOwnerProcess
|
|
2825 |
is taken as default.
|
|
2826 |
|
|
2827 |
@return KErrNone if successful, otherwise another of the system wide error
|
|
2828 |
codes.
|
|
2829 |
|
|
2830 |
@see RHandleBase::Duplicate()
|
|
2831 |
*/
|
|
2832 |
{
|
|
2833 |
return OpenByName(aName, aType, ECondVar);
|
|
2834 |
}
|
|
2835 |
|
|
2836 |
|
|
2837 |
|
|
2838 |
|
|
2839 |
EXPORT_C TInt RCondVar::Open(RMessagePtr2 aMessage, TInt aParam, TOwnerType aType)
|
|
2840 |
/**
|
|
2841 |
Opens a handle to a condition variable using a handle number sent by a client
|
|
2842 |
to a server.
|
|
2843 |
|
|
2844 |
This function is called by the server.
|
|
2845 |
|
|
2846 |
@param aMessage The message pointer.
|
|
2847 |
@param aParam An index specifying which of the four message arguments
|
|
2848 |
contains the handle number.
|
|
2849 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2850 |
condition variable handle. If not explicitly specified, EOwnerProcess
|
|
2851 |
is taken as default.
|
|
2852 |
|
|
2853 |
@return KErrNone, if successful;
|
|
2854 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
2855 |
KErrBadHandle, if not a valid handle;
|
|
2856 |
otherwise one of the other system-wide error codes.
|
|
2857 |
*/
|
|
2858 |
{
|
|
2859 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(), ECondVar, aParam, aType));
|
|
2860 |
}
|
|
2861 |
|
|
2862 |
|
|
2863 |
|
|
2864 |
|
|
2865 |
EXPORT_C TInt RCondVar::Open(TInt aArgumentIndex, TOwnerType aType)
|
|
2866 |
/**
|
|
2867 |
Opens a handle to a condition variable using a handle number passed as an
|
|
2868 |
environment data item to the child process during the creation of
|
|
2869 |
that child process.
|
|
2870 |
|
|
2871 |
Note that this function can only be called successfully once.
|
|
2872 |
|
|
2873 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
2874 |
environment data that contains the handle number. This is
|
|
2875 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
2876 |
This can range from 0 to 15.
|
|
2877 |
|
|
2878 |
@param aType An enumeration whose enumerators define the ownership of
|
|
2879 |
this condition variable handle. If not explicitly specified,
|
|
2880 |
EOwnerProcess is taken as default.
|
|
2881 |
|
|
2882 |
@return KErrNone, if successful;
|
|
2883 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
2884 |
KErrArgument, if the slot does not contain a condition variable handle;
|
|
2885 |
otherwise one of the other system-wide error codes.
|
|
2886 |
|
|
2887 |
@see RProcess::SetParameter()
|
|
2888 |
*/
|
|
2889 |
{
|
|
2890 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, ECondVar, aType));
|
|
2891 |
}
|
|
2892 |
|
|
2893 |
|
|
2894 |
|
|
2895 |
|
|
2896 |
EXPORT_C TInt RSemaphore::CreateLocal(TInt aCount,TOwnerType aType)
|
|
2897 |
/**
|
|
2898 |
Creates a semaphore, setting its initial count, and opens this handle to the
|
|
2899 |
semaphore.
|
|
2900 |
|
|
2901 |
The kernel side object representing the semaphore is unnamed. This means that
|
|
2902 |
it is not possible to search for the semaphore, which makes it local to the
|
|
2903 |
current process.
|
|
2904 |
|
|
2905 |
By default, any thread in the process can use this instance of RSemaphore
|
|
2906 |
to access the semaphore. However, specifying EOwnerThread as the second parameter
|
|
2907 |
to this function, means that only the creating thread can use this instance
|
|
2908 |
of RSemaphore to access the semaphore; any other thread in this process that
|
|
2909 |
wants to access the semaphore must duplicate this handle.
|
|
2910 |
|
|
2911 |
@param aCount The initial value of the semaphore count.
|
|
2912 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2913 |
semaphore handle. If not explicitly specified, EOwnerProcess is
|
|
2914 |
taken as default.
|
|
2915 |
|
|
2916 |
@return KErrNone if successful, otherwise another of the system wide error
|
|
2917 |
codes.
|
|
2918 |
|
|
2919 |
@panic USER 105 if aCount is negative.
|
|
2920 |
|
|
2921 |
@see RHandleBase::Duplicate()
|
|
2922 |
*/
|
|
2923 |
{
|
|
2924 |
|
|
2925 |
__ASSERT_ALWAYS(aCount>=0,Panic(ESemCreateCountNegative));
|
|
2926 |
return SetReturnedHandle(Exec::SemaphoreCreate(NULL,aCount,aType),*this);
|
|
2927 |
}
|
|
2928 |
|
|
2929 |
|
|
2930 |
|
|
2931 |
|
|
2932 |
EXPORT_C TInt RSemaphore::CreateGlobal(const TDesC &aName,TInt aCount,TOwnerType aType)
|
|
2933 |
/**
|
|
2934 |
Creates a global semaphore, setting its initial count, and opens this handle
|
|
2935 |
to the semaphore.
|
|
2936 |
|
|
2937 |
The kernel side object representing the semaphore is given the name contained
|
|
2938 |
in the specified descriptor, which makes it global. This means that any thread
|
|
2939 |
in any process can search for the semaphore, using TFindSemaphore, and open
|
|
2940 |
a handle to it. If the specified name is empty the kernel side object
|
|
2941 |
representing the semaphore is unnamed and so cannot be opened by name. It can
|
|
2942 |
however be passed to another process as a process parameter or via IPC.
|
|
2943 |
|
|
2944 |
By default, any thread in the process can use this instance of RSemaphore
|
|
2945 |
to access the semaphore. However, specifying EOwnerThread as the third
|
|
2946 |
parameter to this function, means that only the creating thread can use
|
|
2947 |
this instance of RSemaphore to access the semaphore; any other thread in
|
|
2948 |
this process that wants to access the semaphore must either duplicate this
|
|
2949 |
handle or use OpenGlobal().
|
|
2950 |
|
|
2951 |
@param aName A reference to the descriptor containing the name to be assigned
|
|
2952 |
to this global semaphore.
|
|
2953 |
@param aCount The initial value of the semaphore count.
|
|
2954 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2955 |
semaphore handle. If not explicitly specified, EOwnerProcess is
|
|
2956 |
taken as default.
|
|
2957 |
|
|
2958 |
@return KErrNone if successful otherwise another of the system wide error
|
|
2959 |
codes.
|
|
2960 |
|
|
2961 |
@panic USER 105 if aCount is negative.
|
|
2962 |
|
|
2963 |
@see RSemaphore::OpenGlobal()
|
|
2964 |
@see RHandleBase::Duplicate()
|
|
2965 |
@see TFindSemaphore
|
|
2966 |
*/
|
|
2967 |
{
|
|
2968 |
|
|
2969 |
__ASSERT_ALWAYS(aCount>=0,Panic(ESemCreateCountNegative));
|
|
2970 |
TInt r = User::ValidateName(aName);
|
|
2971 |
if(KErrNone!=r)
|
|
2972 |
return r;
|
|
2973 |
TBuf8<KMaxKernelName> name8;
|
|
2974 |
name8.Copy(aName);
|
|
2975 |
return SetReturnedHandle(Exec::SemaphoreCreate(&name8,aCount,aType),*this);
|
|
2976 |
}
|
|
2977 |
|
|
2978 |
|
|
2979 |
|
|
2980 |
|
|
2981 |
EXPORT_C TInt RSemaphore::OpenGlobal(const TDesC &aName,TOwnerType aType)
|
|
2982 |
/**
|
|
2983 |
Opens a handle to a global semaphore.
|
|
2984 |
|
|
2985 |
Global semaphores are identified by name.
|
|
2986 |
|
|
2987 |
By default, any thread in the process can use this instance of RSemaphore
|
|
2988 |
to access the semaphore. However, specifying EOwnerThread as the second parameter
|
|
2989 |
to this function, means that only the opening thread can use this instance
|
|
2990 |
of RSemaphore to access the semaphore; any other thread in this process that
|
|
2991 |
wants to access the semaphore must either duplicate the handle or use OpenGlobal()
|
|
2992 |
again.
|
|
2993 |
|
|
2994 |
@param aName A reference to the descriptor containing the name of the global
|
|
2995 |
semaphore to be opened.
|
|
2996 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
2997 |
semaphore handle. If not explicitly specified, EOwnerProcess is
|
|
2998 |
taken as default.
|
|
2999 |
|
|
3000 |
@return KErrNone if successful otherwise another of the system wide error
|
|
3001 |
codes.
|
|
3002 |
|
|
3003 |
@see RHandleBase::Duplicate()
|
|
3004 |
*/
|
|
3005 |
{
|
|
3006 |
return OpenByName(aName,aType,ESemaphore);
|
|
3007 |
}
|
|
3008 |
|
|
3009 |
|
|
3010 |
|
|
3011 |
|
|
3012 |
EXPORT_C TInt RSemaphore::Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType)
|
|
3013 |
/**
|
|
3014 |
Opens a handle to a semaphore using a handle number sent by a client
|
|
3015 |
to a server.
|
|
3016 |
|
|
3017 |
This function is called by the server.
|
|
3018 |
|
|
3019 |
@param aMessage The message pointer.
|
|
3020 |
@param aParam An index specifying which of the four message arguments
|
|
3021 |
contains the handle number.
|
|
3022 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3023 |
semaphore handle. If not explicitly specified, EOwnerProcess is
|
|
3024 |
taken as default.
|
|
3025 |
|
|
3026 |
@return KErrNone, if successful;
|
|
3027 |
KErrArgument, if the value of aParam is outside the range 0-3;
|
|
3028 |
KErrBadHandle, if not a valid handle;
|
|
3029 |
otherwise one of the other system-wide error codes.
|
|
3030 |
*/
|
|
3031 |
{
|
|
3032 |
return SetReturnedHandle(Exec::MessageOpenObject(aMessage.Handle(),ESemaphore,aParam,aType));
|
|
3033 |
}
|
|
3034 |
|
|
3035 |
|
|
3036 |
|
|
3037 |
|
|
3038 |
EXPORT_C TInt RSemaphore::Open(TInt aArgumentIndex, TOwnerType aOwnerType)
|
|
3039 |
/**
|
|
3040 |
Opens a handle to a semaphore using a handle number passed as an
|
|
3041 |
environment data item to the child process during the creation of
|
|
3042 |
that child process.
|
|
3043 |
|
|
3044 |
Note that this function can only be called successfully once.
|
|
3045 |
|
|
3046 |
@param aArgumentIndex An index that identifies the slot in the process
|
|
3047 |
environment data that contains the handle number. This is
|
|
3048 |
a value relative to zero, i.e. 0 is the first item/slot.
|
|
3049 |
This can range from 0 to 15.
|
|
3050 |
|
|
3051 |
@param aOwnerType An enumeration whose enumerators define the ownership of
|
|
3052 |
this semaphore handle. If not explicitly specified,
|
|
3053 |
EOwnerProcess is taken as default.
|
|
3054 |
|
|
3055 |
@return KErrNone, if successful;
|
|
3056 |
KErrNotFound, if the slot indicated by aArgumentIndex is empty;
|
|
3057 |
KErrArgument, if the slot does not contain a Semaphore handle;
|
|
3058 |
otherwise one of the other system-wide error codes.
|
|
3059 |
|
|
3060 |
@see RProcess::SetParameter()
|
|
3061 |
*/
|
|
3062 |
{
|
|
3063 |
return SetReturnedHandle(Exec::ProcessGetHandleParameter(aArgumentIndex, ESemaphore, aOwnerType));
|
|
3064 |
}
|
|
3065 |
|
|
3066 |
|
|
3067 |
|
|
3068 |
|
|
3069 |
EXPORT_C TInt RCriticalSection::CreateLocal(TOwnerType aType)
|
|
3070 |
/**
|
|
3071 |
Creates a critical section and opens this handle to the critical section.
|
|
3072 |
|
|
3073 |
The kernel side object representing the critical section is unnamed. This
|
|
3074 |
means that it is not possible to search for the critical section, which makes
|
|
3075 |
it local to the current process.
|
|
3076 |
|
|
3077 |
By default, any thread in the process can use this instance of RCriticalSection
|
|
3078 |
to access the critical section. However, specifying EOwnerThread as the parameter
|
|
3079 |
to this function, means that only the creating thread can use this instance
|
|
3080 |
of RCriticalSection to access the critical section; any other thread in this
|
|
3081 |
process that wants to access the critical section must duplicate this handle.
|
|
3082 |
|
|
3083 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3084 |
critical section handle. If not explicitly specified,
|
|
3085 |
EOwnerProcess is taken as default.
|
|
3086 |
|
|
3087 |
@return KErrNone if successful otherwise another of the system wide error codes.
|
|
3088 |
|
|
3089 |
@see RHandleBase::Duplicate()
|
|
3090 |
*/
|
|
3091 |
{
|
|
3092 |
|
|
3093 |
iBlocked=1;
|
|
3094 |
return(RSemaphore::CreateLocal(0,aType));
|
|
3095 |
}
|
|
3096 |
|
|
3097 |
|
|
3098 |
|
|
3099 |
/**
|
|
3100 |
Creates a local fast semaphore, and opens this handle to the
|
|
3101 |
semaphore.
|
|
3102 |
|
|
3103 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3104 |
semaphore handle. If not explicitly specified, EOwnerProcess is
|
|
3105 |
taken as default.
|
|
3106 |
|
|
3107 |
@return KErrNone if successful, otherwise one of the system wide error
|
|
3108 |
codes.
|
|
3109 |
|
|
3110 |
@see RSemaphore::CreateLocal()
|
|
3111 |
*/
|
|
3112 |
EXPORT_C TInt RFastLock::CreateLocal(TOwnerType aType)
|
|
3113 |
{
|
|
3114 |
|
|
3115 |
iCount=0;
|
|
3116 |
return RSemaphore::CreateLocal(0,aType);
|
|
3117 |
}
|
|
3118 |
|
|
3119 |
|
|
3120 |
|
|
3121 |
|
|
3122 |
EXPORT_C TInt RTimer::CreateLocal()
|
|
3123 |
//
|
|
3124 |
// Create a local timer.
|
|
3125 |
//
|
|
3126 |
/**
|
|
3127 |
Creates a thread-relative timer.
|
|
3128 |
|
|
3129 |
@return KErrNone if successful, otherwise another of the
|
|
3130 |
system-wide error codes.
|
|
3131 |
*/
|
|
3132 |
{
|
|
3133 |
return SetReturnedHandle(Exec::TimerCreate(),*this);
|
|
3134 |
}
|
|
3135 |
|
|
3136 |
|
|
3137 |
|
|
3138 |
|
|
3139 |
EXPORT_C TInt RProcess::Open(const TDesC &aName,TOwnerType aType)
|
|
3140 |
/**
|
|
3141 |
Opens a handle to a specifically named process.
|
|
3142 |
|
|
3143 |
By default, ownership of this process handle is vested in the current process,
|
|
3144 |
but can be vested in the current thread by passing EOwnerThread as the second
|
|
3145 |
parameter to this function.
|
|
3146 |
|
|
3147 |
@param aName A reference to the descriptor containing the name of the process
|
|
3148 |
to be opened.
|
|
3149 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3150 |
thread handle. If not explicitly specified, EOwnerProcess is
|
|
3151 |
taken as default.
|
|
3152 |
|
|
3153 |
@return KErrNone, if successful, otherwise one of the other system-wide error
|
|
3154 |
codes.
|
|
3155 |
*/
|
|
3156 |
{
|
|
3157 |
return OpenByName(aName,aType,EProcess);
|
|
3158 |
}
|
|
3159 |
|
|
3160 |
|
|
3161 |
|
|
3162 |
|
|
3163 |
EXPORT_C TInt RProcess::Open(TProcessId aId,TOwnerType aType)
|
|
3164 |
/**
|
|
3165 |
Opens a handle to the process whose process Id matches
|
|
3166 |
the specified process ID.
|
|
3167 |
|
|
3168 |
By default, ownership of this process handle is vested in the current process,
|
|
3169 |
but can be vested in the current thread by passing EOwnerThread as the second
|
|
3170 |
parameter to this function.
|
|
3171 |
|
|
3172 |
@param aId The process Id used to find the process.
|
|
3173 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3174 |
process handle. If not explicitly specified, EOwnerProcess is
|
|
3175 |
taken as default.
|
|
3176 |
|
|
3177 |
@return KErrNone, if successful, otherwise one of the other system-wide error
|
|
3178 |
codes.
|
|
3179 |
*/
|
|
3180 |
{
|
|
3181 |
|
|
3182 |
TUint id=*(TUint*)&aId;
|
|
3183 |
return SetReturnedHandle(Exec::ProcessOpenById(id,aType),*this);
|
|
3184 |
}
|
|
3185 |
|
|
3186 |
|
|
3187 |
|
|
3188 |
|
|
3189 |
EXPORT_C TInt User::RenameProcess(const TDesC &aName)
|
|
3190 |
/**
|
|
3191 |
Assigns a new name to the current process, replacing any existing name.
|
|
3192 |
|
|
3193 |
When a process is created, its default name is the name portion of the filename
|
|
3194 |
from which the executable is loaded.
|
|
3195 |
|
|
3196 |
The new name must be a valid name and it must also be such that the process's
|
|
3197 |
new fullname remains unique amongst processes.
|
|
3198 |
|
|
3199 |
@param aName A reference to the descriptor containing the new name of the
|
|
3200 |
process.
|
|
3201 |
|
|
3202 |
@return KErrNone, if successful, or if the new and old names are identical;
|
|
3203 |
KErrBadName, if aName is an invalid;
|
|
3204 |
otherwise one of the other system-wide error codes.
|
|
3205 |
*/
|
|
3206 |
{
|
|
3207 |
TBuf8<KMaxKernelName> name8;
|
|
3208 |
name8.Copy(aName);
|
|
3209 |
return Exec::ProcessRename(KCurrentProcessHandle,name8);
|
|
3210 |
}
|
|
3211 |
|
|
3212 |
|
|
3213 |
|
|
3214 |
|
|
3215 |
/**
|
|
3216 |
Ends this process, and all of its threads, specifying a reason code.
|
|
3217 |
|
|
3218 |
This function is intended to be used if a process is exiting under normal
|
|
3219 |
conditions.
|
|
3220 |
|
|
3221 |
If the process is system permanent, the entire system is rebooted.
|
|
3222 |
|
|
3223 |
@param aReason The reason to be associated with the ending of this process.
|
|
3224 |
|
|
3225 |
@capability PowerMgmt except when one of the following situations is true:
|
|
3226 |
1. the process calling this function is the same as the
|
|
3227 |
process to be terminated.
|
|
3228 |
2. the process calling this function created the process
|
|
3229 |
to be terminated, but has not yet resumed that process.
|
|
3230 |
|
|
3231 |
@see User::SetProcessCritical()
|
|
3232 |
@see User::ProcessCritical()
|
|
3233 |
*/
|
|
3234 |
EXPORT_C void RProcess::Kill(TInt aReason)
|
|
3235 |
{
|
|
3236 |
Exec::ProcessKill(iHandle,EExitKill,aReason,NULL);
|
|
3237 |
}
|
|
3238 |
|
|
3239 |
|
|
3240 |
/**
|
|
3241 |
Ends this process, and all of its threads, specifying a reason code.
|
|
3242 |
|
|
3243 |
This function is intended to be used if a process is exiting under abnormal
|
|
3244 |
conditions, for example if an error condition has been detected.
|
|
3245 |
|
|
3246 |
If the process is system critical or system permanent, the entire system is
|
|
3247 |
rebooted.
|
|
3248 |
|
|
3249 |
@param aReason The reason to be associated with the ending of this process.
|
|
3250 |
|
|
3251 |
@capability PowerMgmt except when one of the following situations is true:
|
|
3252 |
1. the process calling this function is the same as the
|
|
3253 |
process to be terminated.
|
|
3254 |
2. the process calling this function created the process
|
|
3255 |
to be terminated, but has not yet resumed that process.
|
|
3256 |
|
|
3257 |
@see User::SetProcessCritical()
|
|
3258 |
@see User::ProcessCritical()
|
|
3259 |
*/
|
|
3260 |
EXPORT_C void RProcess::Terminate(TInt aReason)
|
|
3261 |
{
|
|
3262 |
Exec::ProcessKill(iHandle,EExitTerminate,aReason,NULL);
|
|
3263 |
}
|
|
3264 |
|
|
3265 |
|
|
3266 |
|
|
3267 |
/**
|
|
3268 |
Panics the process and all of its owned threads, specifying the panic category
|
|
3269 |
name and reason code.
|
|
3270 |
|
|
3271 |
The length of the category name should be no greater than 16; any name with
|
|
3272 |
a length greater than 16 is truncated to 16.
|
|
3273 |
|
|
3274 |
If the process is system critical or system permanent, the entire system is
|
|
3275 |
rebooted.
|
|
3276 |
|
|
3277 |
@param aCategory A reference to the descriptor containing the text which
|
|
3278 |
defines the category name for this panic.
|
|
3279 |
@param aReason The panic number.
|
|
3280 |
|
|
3281 |
@capability PowerMgmt except when one of the following situations is true:
|
|
3282 |
1. the process calling this function is the same as the
|
|
3283 |
process to be terminated.
|
|
3284 |
2. the process calling this function created the process
|
|
3285 |
to be terminated, but has not yet resumed that process.
|
|
3286 |
|
|
3287 |
@see User::SetProcessCritical()
|
|
3288 |
@see User::ProcessCritical()
|
|
3289 |
*/
|
|
3290 |
EXPORT_C void RProcess::Panic(const TDesC &aCategory,TInt aReason)
|
|
3291 |
{
|
|
3292 |
TBuf8<KMaxExitCategoryName> name8;
|
|
3293 |
TInt length=aCategory.Length();
|
|
3294 |
if(length>KMaxExitCategoryName)
|
|
3295 |
{
|
|
3296 |
TPtr catPtr((TUint16*)aCategory.Ptr(),KMaxExitCategoryName,KMaxExitCategoryName);
|
|
3297 |
name8.Copy(catPtr);
|
|
3298 |
}
|
|
3299 |
else
|
|
3300 |
{
|
|
3301 |
name8.Copy(aCategory);
|
|
3302 |
}
|
|
3303 |
Exec::ProcessKill(iHandle,EExitPanic,aReason,&name8);
|
|
3304 |
}
|
|
3305 |
|
|
3306 |
|
|
3307 |
|
|
3308 |
|
|
3309 |
EXPORT_C void RProcess::Logon(TRequestStatus &aStatus) const
|
|
3310 |
/**
|
|
3311 |
Requests notification when this process dies, normally or otherwise.
|
|
3312 |
|
|
3313 |
A request for notification is an asynchronous request, and completes:
|
|
3314 |
|
|
3315 |
- when the process terminates
|
|
3316 |
- if the outstanding request is cancelled by a call to RProcess::LogonCancel().
|
|
3317 |
|
|
3318 |
A request for notification requires memory to be allocated; if this is
|
|
3319 |
unavailable, then the call to Logon() returns, and the asynchronous request
|
|
3320 |
completes immediately.
|
|
3321 |
|
|
3322 |
@param aStatus A reference to the request status object.
|
|
3323 |
This contains the reason code describing the reason for
|
|
3324 |
the termination of the process, i.e. the value returned by a call to RProcess::ExitReason().
|
|
3325 |
Alternatively, this is set to:
|
|
3326 |
KErrCancel, if an outstanding request is cancelled;
|
|
3327 |
KErrNoMemory, if there is insufficient memory to deal with the request.
|
|
3328 |
|
|
3329 |
@see RProcess::LogonCancel()
|
|
3330 |
@see RProcess::ExitReason()
|
|
3331 |
*/
|
|
3332 |
{
|
|
3333 |
|
|
3334 |
aStatus=KRequestPending;
|
|
3335 |
Exec::ProcessLogon(iHandle,&aStatus,EFalse);
|
|
3336 |
}
|
|
3337 |
|
|
3338 |
|
|
3339 |
|
|
3340 |
|
|
3341 |
EXPORT_C TInt RProcess::LogonCancel(TRequestStatus &aStatus) const
|
|
3342 |
/**
|
|
3343 |
Cancels an outstanding request for notification of the death of this process.
|
|
3344 |
|
|
3345 |
A request for notification must previously have been made, otherwise the function
|
|
3346 |
returns KErrGeneral.
|
|
3347 |
|
|
3348 |
The caller passes a reference to the same request status object as was passed
|
|
3349 |
in the original call to Logon().
|
|
3350 |
|
|
3351 |
@param aStatus A reference to the same request status object used in
|
|
3352 |
the original call to Logon().
|
|
3353 |
|
|
3354 |
@return KErrGeneral, if there is no outstanding request; KErrNone otherwise.
|
|
3355 |
|
|
3356 |
@see RProcess::Logon()
|
|
3357 |
*/
|
|
3358 |
{
|
|
3359 |
return Exec::ProcessLogonCancel(iHandle,&aStatus,EFalse);
|
|
3360 |
}
|
|
3361 |
|
|
3362 |
|
|
3363 |
|
|
3364 |
|
|
3365 |
/**
|
|
3366 |
Creates a Rendezvous request with the process.
|
|
3367 |
|
|
3368 |
The request is an asynchronous request, and completes:
|
|
3369 |
|
|
3370 |
- when a call is made to RProcess::Rendezvous(TInt aReason).
|
|
3371 |
- if the outstanding request is cancelled by a call to RProcess::RendezvousCancel()
|
|
3372 |
- if the process exits
|
|
3373 |
- if the process panics.
|
|
3374 |
|
|
3375 |
Note that a request requires memory to be allocated; if this is unavailable,
|
|
3376 |
then this call to Rendezvous() returns, and the asynchronous request
|
|
3377 |
completes immediately.
|
|
3378 |
|
|
3379 |
@param aStatus A reference to the request status object.
|
|
3380 |
The Rendezvous completes normally when
|
|
3381 |
RProcess::Rendezvous(TInt aReason) is called, and this
|
|
3382 |
request status object will contain this reason code.
|
|
3383 |
If the process exits or panics, then this is the process exit
|
|
3384 |
reason value, i.e. the same value returned by RProcess::ExitReason().
|
|
3385 |
Alternatively, this is set to:
|
|
3386 |
KErrCancel, if an outstanding request is cancelled;
|
|
3387 |
KErrNoMemory, if there is insufficient memory to deal with the request.
|
|
3388 |
|
|
3389 |
@see RProcess::Rendezvous(TInt aReason)
|
|
3390 |
@see RProcess::RendezvousCancel(TRequestStatus& aStatus)
|
|
3391 |
*/
|
|
3392 |
EXPORT_C void RProcess::Rendezvous(TRequestStatus& aStatus) const
|
|
3393 |
{
|
|
3394 |
aStatus=KRequestPending;
|
|
3395 |
Exec::ProcessLogon(iHandle,&aStatus,ETrue);
|
|
3396 |
}
|
|
3397 |
|
|
3398 |
|
|
3399 |
|
|
3400 |
|
|
3401 |
/**
|
|
3402 |
Cancels a previously requested Rendezvous with the process.
|
|
3403 |
|
|
3404 |
The request completes with the value KErrCancel (if it was still outstanding).
|
|
3405 |
|
|
3406 |
@param aStatus A reference to the same request status object used in
|
|
3407 |
the original call to Rendezvous(TRequestStatus& aStatus).
|
|
3408 |
|
|
3409 |
@return KErrGeneral, if there is no outstanding request, KErrNone otherwise.
|
|
3410 |
|
|
3411 |
@see RProcess::Rendezvous(TRequestStatus &aStatus)
|
|
3412 |
*/
|
|
3413 |
EXPORT_C TInt RProcess::RendezvousCancel(TRequestStatus& aStatus) const
|
|
3414 |
{
|
|
3415 |
return Exec::ProcessLogonCancel(iHandle,&aStatus,ETrue);
|
|
3416 |
}
|
|
3417 |
|
|
3418 |
|
|
3419 |
|
|
3420 |
|
|
3421 |
/**
|
|
3422 |
Completes all Rendezvous' with the current process.
|
|
3423 |
|
|
3424 |
@param aReason The reason code used to complete all rendezvous requests
|
|
3425 |
|
|
3426 |
@see RProcess::Rendezvous(TRequestStatus& aStatus)
|
|
3427 |
*/
|
|
3428 |
EXPORT_C void RProcess::Rendezvous(TInt aReason)
|
|
3429 |
{
|
|
3430 |
Exec::ProcessRendezvous(aReason);
|
|
3431 |
}
|
|
3432 |
|
|
3433 |
|
|
3434 |
/**
|
|
3435 |
This can be used to determine whether the data for the process is demand paged
|
|
3436 |
by default or not.
|
|
3437 |
|
|
3438 |
@return ETrue if the default for the process's data is to be demand paged,
|
|
3439 |
EFalse otherwise.
|
|
3440 |
|
|
3441 |
@prototype
|
|
3442 |
*/
|
|
3443 |
EXPORT_C TBool RProcess::DefaultDataPaged() const
|
|
3444 |
{
|
|
3445 |
return Exec::ProcessDefaultDataPaged(iHandle);
|
|
3446 |
}
|
|
3447 |
|
|
3448 |
|
|
3449 |
//
|
|
3450 |
// Class TThreadCreateInfo
|
|
3451 |
//
|
|
3452 |
|
|
3453 |
/**
|
|
3454 |
Constructor where the basic properties of the thread to be created are specified.
|
|
3455 |
|
|
3456 |
NOTE - TThreadCreateInfo::SetCreateHeap() or TThreadCreateInfo::SetUseHeap() must
|
|
3457 |
be invoked on this TThreadCreateInfo to set the type of the thread to be created
|
|
3458 |
before being passed as a paramter to RThread::Create().
|
|
3459 |
|
|
3460 |
@param aName The name to be assigned to the thread.
|
|
3461 |
KNullDesC, to create an anonymous thread.
|
|
3462 |
@param aFunction A pointer to a function. Control passes to this function
|
|
3463 |
when the thread is first resumed, i.e. when the thread
|
|
3464 |
is initially scheduled to run.
|
|
3465 |
@param aStackSize The size of the new thread's stack.
|
|
3466 |
@param aPtr A pointer to data to be passed as a parameter to
|
|
3467 |
the thread function when the thread is initially scheduled
|
|
3468 |
to run. If the thread function does not need any data then
|
|
3469 |
this pointer can be NULL.
|
|
3470 |
*/
|
|
3471 |
EXPORT_C TThreadCreateInfo::TThreadCreateInfo(const TDesC &aName, TThreadFunction aFunction,
|
|
3472 |
TInt aStackSize, TAny* aPtr) :
|
|
3473 |
iVersionNumber(EVersion0), iName(&aName), iFunction(aFunction),
|
|
3474 |
iStackSize(aStackSize), iParameter(aPtr), iOwner(EOwnerProcess), iHeap(NULL),
|
|
3475 |
iHeapMinSize(0), iHeapMaxSize(0), iAttributes(0)
|
|
3476 |
{
|
|
3477 |
};
|
|
3478 |
|
|
3479 |
|
|
3480 |
/**
|
|
3481 |
Sets the thread to be created to create its own heap.
|
|
3482 |
|
|
3483 |
@param aHeapMinSize The minimum size for the new thread's heap.
|
|
3484 |
@param aHeapMaxSize The maximum size for the new thread's heap.
|
|
3485 |
*/
|
|
3486 |
EXPORT_C void TThreadCreateInfo::SetCreateHeap(TInt aHeapMinSize, TInt aHeapMaxSize)
|
|
3487 |
{
|
|
3488 |
iHeapMinSize = aHeapMinSize;
|
|
3489 |
iHeapMaxSize = aHeapMaxSize;
|
|
3490 |
}
|
|
3491 |
|
|
3492 |
|
|
3493 |
/**
|
|
3494 |
Sets the thread to be created to use the heap whose handle is pointed to by
|
|
3495 |
aAllocator. If this is NULL, then the thread uses the heap of the creating thread.
|
|
3496 |
|
|
3497 |
@param aAllocator A pointer to the handle of the heap belonging to another thread
|
|
3498 |
which this thread is to use.
|
|
3499 |
*/
|
|
3500 |
EXPORT_C void TThreadCreateInfo::SetUseHeap(const RAllocator *aAllocator)
|
|
3501 |
{
|
|
3502 |
iHeap = (aAllocator)? (RAllocator*)aAllocator : GetHeap();
|
|
3503 |
}
|
|
3504 |
|
|
3505 |
|
|
3506 |
/**
|
|
3507 |
Sets the owner the thread to be created. Any previous calls
|
|
3508 |
to this method will be overridden for this TThreadCreateInfo object.
|
|
3509 |
|
|
3510 |
@param aOwner The owner of the thread to be created.
|
|
3511 |
*/
|
|
3512 |
EXPORT_C void TThreadCreateInfo::SetOwner(const TOwnerType aOwner)
|
|
3513 |
{
|
|
3514 |
iOwner = aOwner;
|
|
3515 |
}
|
|
3516 |
|
|
3517 |
|
|
3518 |
/**
|
|
3519 |
Sets the data paging attributes of the thread to be created. Any previous calls
|
|
3520 |
to this method will be overridden for this TThreadCreateInfo object.
|
|
3521 |
|
|
3522 |
@param aPaging The paging attributes for the thread to be created.
|
|
3523 |
*/
|
|
3524 |
EXPORT_C void TThreadCreateInfo::SetPaging(const TThreadPagingAtt aPaging)
|
|
3525 |
{
|
|
3526 |
iAttributes &= ~EThreadCreateFlagPagingMask;
|
|
3527 |
if (aPaging == EPaged)
|
|
3528 |
iAttributes |= EThreadCreateFlagPaged;
|
|
3529 |
if (aPaging == EUnpaged)
|
|
3530 |
iAttributes |= EThreadCreateFlagUnpaged;
|
|
3531 |
}
|
|
3532 |
|
|
3533 |
|
|
3534 |
/**
|
|
3535 |
Creates a thread belonging to the current process, and opens this handle
|
|
3536 |
to that thread. The thread will have the properties as defined by the parameter
|
|
3537 |
aCreateInfo.
|
|
3538 |
|
|
3539 |
@param aCreateInfo A reference to a TThreadCreateInfo object specifying
|
|
3540 |
the properties of thread to create.
|
|
3541 |
|
|
3542 |
@return KErrNone if successful, otherwise one of the other system-wide error codes.
|
|
3543 |
KErrAlreadyExists will be returned if there is another thread in this process with the
|
|
3544 |
specified name.
|
|
3545 |
|
|
3546 |
@panic USER 109 if the stack size specified for the thread is negative.
|
|
3547 |
@panic USER 110 if the specified minimum heap size is less than KMinHeapSize.
|
|
3548 |
@panic USER 111 if the specified maximum heap size is less than the specified minimum heap size.
|
|
3549 |
*/
|
|
3550 |
EXPORT_C TInt RThread::Create(const TThreadCreateInfo& aCreateInfo)
|
|
3551 |
{
|
|
3552 |
__ASSERT_ALWAYS(aCreateInfo.iStackSize >= 0, ::Panic(EThrdStackSizeNegative));
|
|
3553 |
if (!aCreateInfo.iHeap)
|
|
3554 |
{// Creating a new heap so verify the parameters.
|
|
3555 |
__ASSERT_ALWAYS(aCreateInfo.iHeapMinSize >= KMinHeapSize,::Panic(EThrdHeapMinTooSmall));
|
|
3556 |
__ASSERT_ALWAYS(aCreateInfo.iHeapMaxSize >= aCreateInfo.iHeapMinSize,::Panic(EThrdHeapMaxLessThanMin));
|
|
3557 |
}
|
|
3558 |
|
|
3559 |
TInt r = User::ValidateName(*aCreateInfo.iName);
|
|
3560 |
if(KErrNone!=r)
|
|
3561 |
return r;
|
|
3562 |
|
|
3563 |
SStdEpocThreadCreateInfo8 info;
|
|
3564 |
info.iFunction = aCreateInfo.iFunction;
|
|
3565 |
info.iUserStackSize = aCreateInfo.iStackSize;
|
|
3566 |
info.iUserStack = NULL;
|
|
3567 |
info.iAllocator = aCreateInfo.iHeap;
|
|
3568 |
info.iHeapInitialSize = aCreateInfo.iHeapMinSize;
|
|
3569 |
info.iHeapMaxSize = aCreateInfo.iHeapMaxSize;
|
|
3570 |
info.iPtr = aCreateInfo.iParameter;
|
|
3571 |
info.iTotalSize = sizeof(info);
|
|
3572 |
info.iFlags = aCreateInfo.iAttributes;
|
|
3573 |
|
|
3574 |
TBuf8<KMaxKernelName> n;
|
|
3575 |
n.Copy(*aCreateInfo.iName);
|
|
3576 |
|
|
3577 |
return SetReturnedHandle(Exec::ThreadCreate(n, aCreateInfo.iOwner, info),*this);
|
|
3578 |
}
|
|
3579 |
|
|
3580 |
|
|
3581 |
EXPORT_C TInt RThread::Create(const TDesC &aName,TThreadFunction aFunction,TInt aStackSize,TInt aHeapMinSize,TInt aHeapMaxSize,TAny *aPtr,TOwnerType aType)
|
|
3582 |
/**
|
|
3583 |
Creates a thread belonging to the current process, and opens this handle
|
|
3584 |
to that thread.
|
|
3585 |
|
|
3586 |
A new heap is created for this thread.
|
|
3587 |
|
|
3588 |
By default, ownership of this thread handle is vested in the current process,
|
|
3589 |
but can be vested in the current thread by passing EOwnerThread as
|
|
3590 |
the second parameter to this function.
|
|
3591 |
|
|
3592 |
If KNullDesC is specified for the name, then an anonymous thread will be created.
|
|
3593 |
Anonymous threads are not global, and cannot be opened by other processes.
|
|
3594 |
|
|
3595 |
@param aName The name to be assigned to this thread.
|
|
3596 |
KNullDesC, to create an anonymous thread.
|
|
3597 |
@param aFunction A pointer to a function.. Control passes to this function
|
|
3598 |
when the thread is first resumed, i.e. when the thread
|
|
3599 |
is initially scheduled to run.
|
|
3600 |
@param aStackSize The size of the new thread's stack.
|
|
3601 |
@param aHeapMinSize The minimum size for the new thread's heap.
|
|
3602 |
@param aHeapMaxSize The maximum size for the new thread's heap.
|
|
3603 |
@param aPtr A pointer to data to be passed as a parameter to
|
|
3604 |
the thread function when the thread is initially scheduled
|
|
3605 |
to run. If the thread function does not need any data then
|
|
3606 |
this pointer can be NULL. It must be ensured that the memory
|
|
3607 |
pointed to by this pointer is still valid when accessed by
|
|
3608 |
the new thread, e.g. if aPtr points to data on the stack.
|
|
3609 |
@param aType An enumeration whose enumerators define the ownership of
|
|
3610 |
this thread handle. If not explicitly specified,
|
|
3611 |
EOwnerProcess is taken as default.
|
|
3612 |
|
|
3613 |
@return KErrNone if successful, otherwise one of the other system-wide error codes.
|
|
3614 |
KErrAlreadyExists will be returned if there is another thread in this process with the
|
|
3615 |
specified name.
|
|
3616 |
|
|
3617 |
@panic USER 109 if aStackSize is negative.
|
|
3618 |
@panic USER 110 if aHeapMinSize is less than KMinHeapSize.
|
|
3619 |
@panic USER 111 if aHeapMaxSize is less than aHeapMinSize.
|
|
3620 |
*/
|
|
3621 |
{
|
|
3622 |
TThreadCreateInfo createInfo(aName, aFunction, aStackSize, aPtr);
|
|
3623 |
createInfo.SetOwner(aType);
|
|
3624 |
createInfo.SetCreateHeap(aHeapMinSize, aHeapMaxSize);
|
|
3625 |
return Create(createInfo);
|
|
3626 |
}
|
|
3627 |
|
|
3628 |
|
|
3629 |
|
|
3630 |
|
|
3631 |
EXPORT_C TInt RThread::Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, RAllocator* aAllocator, TAny* aPtr, TOwnerType aType)
|
|
3632 |
/**
|
|
3633 |
Creates a thread belonging to the current process, and opens this handle to
|
|
3634 |
that thread.
|
|
3635 |
|
|
3636 |
This thread uses the heap whose handle is pointed to by
|
|
3637 |
aAllocator. If this is NULL, then the thread uses the heap of the creating thread.
|
|
3638 |
|
|
3639 |
By default, ownership of this thread handle is vested in the current process,
|
|
3640 |
but can be vested in the current thread by passing EOwnerThread as the second
|
|
3641 |
parameter to this function.
|
|
3642 |
|
|
3643 |
If KNullDesC is specified for the name, then an anonymous thread will be created.
|
|
3644 |
Anonymous threads are not global, and cannot be opened by other processes.
|
|
3645 |
|
|
3646 |
@param aName The name to be assigned to this thread.
|
|
3647 |
KNullDesC, to create an anonymous thread.
|
|
3648 |
@param aFunction A pointer to a function. Control passes to this function when
|
|
3649 |
the thread is first resumed, i.e. when the thread is
|
|
3650 |
initially scheduled to run.
|
|
3651 |
@param aStackSize The size of the new thread's stack.
|
|
3652 |
@param aAllocator A pointer to the handle of the heap belonging to another thread
|
|
3653 |
which this thread is to use.
|
|
3654 |
@param aPtr A pointer to data to be passed as a parameter to the thread
|
|
3655 |
function when the thread is initially scheduled to run.
|
|
3656 |
If the thread function does not need any data,
|
|
3657 |
then this pointer can be NULL. It must be ensured that the
|
|
3658 |
memory pointed to by this pointer is still valid when accessed
|
|
3659 |
by the new thread, e.g. if aPtr points to data on the stack.
|
|
3660 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3661 |
thread handle. If not explicitly specified, EOwnerProcess is
|
|
3662 |
taken as default.
|
|
3663 |
|
|
3664 |
@return KErrNone if successful otherwise one of the other system-wide error codes.
|
|
3665 |
KErrAlreadyExists will be returned if there is another thread in this process with the
|
|
3666 |
specified name.
|
|
3667 |
|
|
3668 |
@panic USER 109 if aStackSize is negative.
|
|
3669 |
*/
|
|
3670 |
{
|
|
3671 |
TThreadCreateInfo createInfo(aName, aFunction, aStackSize, aPtr);
|
|
3672 |
createInfo.SetOwner(aType);
|
|
3673 |
createInfo.SetUseHeap(aAllocator);
|
|
3674 |
return Create(createInfo);
|
|
3675 |
}
|
|
3676 |
|
|
3677 |
|
|
3678 |
|
|
3679 |
|
|
3680 |
EXPORT_C TInt RThread::Open(const TDesC &aName,TOwnerType aType)
|
|
3681 |
/**
|
|
3682 |
Opens a handle to specifically named thread.
|
|
3683 |
|
|
3684 |
By default, ownership of this thread handle is vested in the
|
|
3685 |
current process, but can be vested in the current thread by passing
|
|
3686 |
EOwnerThread as the second parameter to this function.
|
|
3687 |
|
|
3688 |
@param aName A reference to the descriptor containing the full name of the
|
|
3689 |
thread that is already running.
|
|
3690 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3691 |
thread handle. If not explicitly specified, EOwnerProcess is taken
|
|
3692 |
as default.
|
|
3693 |
|
|
3694 |
@return KErrNone, if successful, otherwise one of the other system-wide
|
|
3695 |
error codes.
|
|
3696 |
*/
|
|
3697 |
{
|
|
3698 |
return OpenByName(aName,aType,EThread);
|
|
3699 |
}
|
|
3700 |
|
|
3701 |
|
|
3702 |
|
|
3703 |
|
|
3704 |
EXPORT_C TInt RThread::Open(TThreadId aId,TOwnerType aType)
|
|
3705 |
/**
|
|
3706 |
Opens a handle to the thread with a specific thread Id.
|
|
3707 |
|
|
3708 |
By default, ownership of this thread handle is vested in the
|
|
3709 |
current process, but can be vested in the current thread by passing
|
|
3710 |
EOwnerThread as the second parameter to this function.
|
|
3711 |
|
|
3712 |
@param aId The thread Id used to find the thread.
|
|
3713 |
@param aType An enumeration whose enumerators define the ownership of this
|
|
3714 |
thread handle. If not explicitly specified, EOwnerProcess is taken
|
|
3715 |
as default.
|
|
3716 |
|
|
3717 |
@return KErrNone, if successful, otherwise one of the other system-wide
|
|
3718 |
error codes.
|
|
3719 |
*/
|
|
3720 |
//
|
|
3721 |
// Open an already running thread in any process.
|
|
3722 |
//
|
|
3723 |
{
|
|
3724 |
|
|
3725 |
TUint id=*(TUint*)&aId;
|
|
3726 |
return SetReturnedHandle(Exec::ThreadOpenById(id,aType),*this);
|
|
3727 |
}
|
|
3728 |
|
|
3729 |
|
|
3730 |
|
|
3731 |
|
|
3732 |
EXPORT_C TInt RThread::Process(RProcess &aProcess) const
|
|
3733 |
/**
|
|
3734 |
Opens a process-relative handle to the process which owns this thread.
|
|
3735 |
|
|
3736 |
The caller must construct a default RProcess object and pass this to
|
|
3737 |
the function.
|
|
3738 |
On return, aProcess is the open process-relative handle to the process owning
|
|
3739 |
this thread.
|
|
3740 |
|
|
3741 |
The return value indicates the success or failure of this function.
|
|
3742 |
|
|
3743 |
@param aProcess A reference to a default RProcess handle; on successful return
|
|
3744 |
from this function, this is the process-relative handle
|
|
3745 |
to the process which owns this thread.
|
|
3746 |
|
|
3747 |
@return KErrNone, if successful, otherwise one of the other system-wide error
|
|
3748 |
codes.
|
|
3749 |
*/
|
|
3750 |
{
|
|
3751 |
return SetReturnedHandle(Exec::ThreadProcess(iHandle),aProcess);
|
|
3752 |
}
|
|
3753 |
|
|
3754 |
|
|
3755 |
|
|
3756 |
|
|
3757 |
EXPORT_C TInt User::RenameThread(const TDesC &aName)
|
|
3758 |
/**
|
|
3759 |
Assigns a new name to the current thread, replacing any existing name that
|
|
3760 |
may have been set.
|
|
3761 |
|
|
3762 |
The new name must be a valid name and it must also be such that the thread's
|
|
3763 |
new fullname remains unique amongst threads.
|
|
3764 |
The length of the new name must be less than or equal to 80 (maximum length of
|
|
3765 |
kernel objects) otherwise a panic is raised.
|
|
3766 |
|
|
3767 |
@param aName A reference to the descriptor containing the new name for the
|
|
3768 |
thread.
|
|
3769 |
|
|
3770 |
@return KErrNone if successful, otherwise one of the other system-wide error
|
|
3771 |
codes.
|
|
3772 |
*/
|
|
3773 |
{
|
|
3774 |
TBuf8<KMaxKernelName> name8;
|
|
3775 |
name8.Copy(aName);
|
|
3776 |
return Exec::ThreadRename(KCurrentThreadHandle,name8);
|
|
3777 |
}
|
|
3778 |
|
|
3779 |
|
|
3780 |
|
|
3781 |
|
|
3782 |
EXPORT_C void RThread::Kill(TInt aReason)
|
|
3783 |
/**
|
|
3784 |
Ends the thread, specifying a reason code.
|
|
3785 |
|
|
3786 |
This function is dangerous and should be used only in cases where the target
|
|
3787 |
thread cannot end itself via the normal methods of calling User::Exit() or
|
|
3788 |
completing its thread function. A hypothetical example might be where a thread
|
|
3789 |
gets 'stuck' in a third-party DLL.
|
|
3790 |
|
|
3791 |
The target thread gets no opportunity to execute any clean-up code, therefore
|
|
3792 |
incautious use of this function may lead to memory leaks.
|
|
3793 |
|
|
3794 |
It is functionally identical to RThread::Terminate(), the only difference
|
|
3795 |
between the two is a legacy distinction between a 'normal' reason for exiting
|
|
3796 |
(use Kill) and an 'abnormal' reason (use Terminate). The choice of function
|
|
3797 |
is reflected in the return value of RThread::ExitType().
|
|
3798 |
|
|
3799 |
The thread must be in the current process otherwise a panic is raised.
|
|
3800 |
|
|
3801 |
If the thread is process permanent, or the thread is the last thread in the
|
|
3802 |
process, then the process is also killed. If the thread is system permanent,
|
|
3803 |
the entire system is rebooted.
|
|
3804 |
|
|
3805 |
WARNING: If the target thread uses a shared heap then use of this function will
|
|
3806 |
cause an internal array used for thread-local storage (TLS) to be leaked. This
|
|
3807 |
leak is specific to ARM platforms which implement the CP15 feature and will
|
|
3808 |
not occur on other platforms.
|
|
3809 |
|
|
3810 |
@param aReason The reason to be associated with the ending of this thread.
|
|
3811 |
|
|
3812 |
@see User::Exit()
|
|
3813 |
@see User::SetCritical()
|
|
3814 |
@see User::Critical()
|
|
3815 |
@see RThread::Terminate()
|
|
3816 |
@see RThread::ExitType()
|
|
3817 |
*/
|
|
3818 |
{
|
|
3819 |
|
|
3820 |
Exec::ThreadKill(iHandle,EExitKill,aReason,NULL);
|
|
3821 |
}
|
|
3822 |
|
|
3823 |
|
|
3824 |
|
|
3825 |
|
|
3826 |
EXPORT_C void RThread::Terminate(TInt aReason)
|
|
3827 |
/**
|
|
3828 |
Ends the thread, specifying a reason code.
|
|
3829 |
|
|
3830 |
This function is dangerous and should be used only in cases where the target
|
|
3831 |
thread cannot end itself via the normal methods of calling User::Exit() or
|
|
3832 |
completing its thread function. A hypothetical example might be where a thread
|
|
3833 |
gets 'stuck' in a third-party DLL.
|
|
3834 |
|
|
3835 |
The target thread gets no opportunity to execute any clean-up code, therefore
|
|
3836 |
incautious use of this function may lead to memory leaks.
|
|
3837 |
|
|
3838 |
It is functionally identical to RThread::Kill(), the only difference
|
|
3839 |
between the two is a legacy distinction between a 'normal' reason for exiting
|
|
3840 |
(use Kill) and an 'abnormal' reason (use Terminate). The choice of function
|
|
3841 |
is reflected in the return value of RThread::ExitType().
|
|
3842 |
|
|
3843 |
The thread must be in the current process otherwise a panic is raised.
|
|
3844 |
|
|
3845 |
If the thread is process critical or process permanent, or the thread is the
|
|
3846 |
last thread in the process, then the process is also terminated. If the thread
|
|
3847 |
is system critical or system permanent, the entire system is rebooted.
|
|
3848 |
|
|
3849 |
WARNING: If the target thread uses a shared heap then use of this function will
|
|
3850 |
cause an internal array used for thread-local storage (TLS) to be leaked. This
|
|
3851 |
leak is specific to ARM platforms which implement the CP15 feature and will
|
|
3852 |
not occur on other platforms.
|
|
3853 |
|
|
3854 |
@param aReason The reason to be associated with the ending of this thread.
|
|
3855 |
|
|
3856 |
@see User::Exit()
|
|
3857 |
@see User::SetCritical()
|
|
3858 |
@see User::Critical()
|
|
3859 |
@see RThread::Kill()
|
|
3860 |
@see RThread::ExitType()
|
|
3861 |
*/
|
|
3862 |
{
|
|
3863 |
|
|
3864 |
Exec::ThreadKill(iHandle,EExitTerminate,aReason,NULL);
|
|
3865 |
}
|
|
3866 |
|
|
3867 |
|
|
3868 |
|
|
3869 |
|
|
3870 |
EXPORT_C void RThread::Panic(const TDesC &aCategory,TInt aReason)
|
|
3871 |
/**
|
|
3872 |
Panics this thread, specifying the panic category name and reason.
|
|
3873 |
|
|
3874 |
The length of the category name should be no greater than 16; any name with
|
|
3875 |
a length greater than 16 is truncated to 16.
|
|
3876 |
|
|
3877 |
The calling thread, i.e. the thread in which this function is called, must be
|
|
3878 |
in the same process as this target thread, otherwise the calling thread
|
|
3879 |
is itself panicked.
|
|
3880 |
|
|
3881 |
If the thread is process critical or process permanent, the process also panics.
|
|
3882 |
If the thread is system critical or system permanent, the entire system is
|
|
3883 |
rebooted.
|
|
3884 |
|
|
3885 |
@param aCategory A reference to the descriptor containing the text which defines
|
|
3886 |
the category name for this panic.
|
|
3887 |
@param aReason The panic number.
|
|
3888 |
|
|
3889 |
@panic KERN-EXEC 46 if this target thread's process is not the same as the
|
|
3890 |
calling thread's process.
|
|
3891 |
|
|
3892 |
@see User::SetCritical()
|
|
3893 |
@see User::Critical()
|
|
3894 |
*/
|
|
3895 |
{
|
|
3896 |
|
|
3897 |
TBuf8<KMaxExitCategoryName> cat;
|
|
3898 |
TInt len = aCategory.Length();
|
|
3899 |
if(len>KMaxExitCategoryName)
|
|
3900 |
{
|
|
3901 |
TPtr aCatPtr((TUint16*)aCategory.Ptr(),KMaxExitCategoryName,KMaxExitCategoryName);
|
|
3902 |
cat.Copy(aCatPtr);
|
|
3903 |
}
|
|
3904 |
else
|
|
3905 |
cat.Copy(aCategory);
|
|
3906 |
Exec::ThreadKill(iHandle,EExitPanic,aReason,&cat);
|
|
3907 |
}
|
|
3908 |
|
|
3909 |
|
|
3910 |
|
|
3911 |
|
|
3912 |
EXPORT_C void RThread::Logon(TRequestStatus &aStatus) const
|
|
3913 |
/**
|
|
3914 |
Requests notification when this thread dies, normally or otherwise.
|
|
3915 |
|
|
3916 |
A request for notification is an asynchronous request, and completes:
|
|
3917 |
|
|
3918 |
- when the thread terminates
|
|
3919 |
- if the outstanding request is cancelled by a call to RThread::LogonCancel().
|
|
3920 |
|
|
3921 |
A request for notification requires memory to be allocated; if this is
|
|
3922 |
unavailable, then the call to Logon() returns, and the asynchronous request
|
|
3923 |
completes immediately.
|
|
3924 |
|
|
3925 |
Note that even when a thread has died, it is not possible to create a new thread with the same name
|
|
3926 |
until all handles on the dead thread have been closed. If this is attempted, the call to
|
|
3927 |
RThread::Create will fail with KErrAlreadyExists.
|
|
3928 |
|
|
3929 |
@param aStatus A reference to the request status object.
|
|
3930 |
This contains the reason code describing the reason for
|
|
3931 |
the termination of the thread, i.e. the value returned by a call to RThread::ExitReason().
|
|
3932 |
Alternatively, this is set to:
|
|
3933 |
KErrCancel, if an outstanding request is cancelled;
|
|
3934 |
KErrNoMemory, if there is insufficient memory to deal with the request.
|
|
3935 |
|
|
3936 |
@see RThread::LogonCancel()
|
|
3937 |
@see RThread::ExitReason()
|
|
3938 |
@see RThread::Create()
|
|
3939 |
*/
|
|
3940 |
{
|
|
3941 |
|
|
3942 |
aStatus=KRequestPending;
|
|
3943 |
Exec::ThreadLogon(iHandle,&aStatus,EFalse);
|
|
3944 |
}
|
|
3945 |
|
|
3946 |
|
|
3947 |
|
|
3948 |
|
|
3949 |
EXPORT_C TInt RThread::LogonCancel(TRequestStatus &aStatus) const
|
|
3950 |
/**
|
|
3951 |
Cancels an outstanding request for notification of the death of this thread.
|
|
3952 |
|
|
3953 |
A request for notification must previously have been made, otherwise
|
|
3954 |
the function returns KErrGeneral.
|
|
3955 |
|
|
3956 |
The caller passes a reference to the same request status object as was passed
|
|
3957 |
in the original call to Logon().
|
|
3958 |
|
|
3959 |
@param aStatus A reference to the same request status object used in
|
|
3960 |
the original call to Logon().
|
|
3961 |
|
|
3962 |
@return KErrGeneral, if there is no outstanding request, KErrNone otherwise.
|
|
3963 |
*/
|
|
3964 |
{
|
|
3965 |
return Exec::ThreadLogonCancel(iHandle,&aStatus,EFalse);
|
|
3966 |
}
|
|
3967 |
|
|
3968 |
|
|
3969 |
|
|
3970 |
|
|
3971 |
/**
|
|
3972 |
Creates a Rendezvous request with the thread.
|
|
3973 |
|
|
3974 |
The request is an asynchronous request, and completes:
|
|
3975 |
|
|
3976 |
- when the thread next calls RThread::Rendezvous(TInt aReason)
|
|
3977 |
- if the outstanding request is cancelled by a call to RThread::RendezvousCancel()
|
|
3978 |
- if the thread exits
|
|
3979 |
- if the thread panics.
|
|
3980 |
|
|
3981 |
Note that a request requires memory to be allocated; if this is unavailable,
|
|
3982 |
then this call to Rendezvous() returns, and the asynchronous request
|
|
3983 |
completes immediately.
|
|
3984 |
|
|
3985 |
@param aStatus A reference to the request status object.
|
|
3986 |
The Rendezvous completes normally when
|
|
3987 |
RThread::Rendezvous(TInt aReason) is called, and this
|
|
3988 |
request status object will contain this reason code.
|
|
3989 |
If the thread exits or panics, then this is the thread exit
|
|
3990 |
reason value, i.e. the same value returned by RThread::ExitReason().
|
|
3991 |
Alternatively, this is set to:
|
|
3992 |
KErrCancel, if an outstanding request is cancelled;
|
|
3993 |
KErrNoMemory, if there is insufficient memory to deal with the request.
|
|
3994 |
|
|
3995 |
@see RThread::Rendezvous(TInt aReason)
|
|
3996 |
@see RThread::RendezvousCancel(TRequestStatus& aStatus)
|
|
3997 |
*/
|
|
3998 |
EXPORT_C void RThread::Rendezvous(TRequestStatus& aStatus) const
|
|
3999 |
|
|
4000 |
{
|
|
4001 |
aStatus=KRequestPending;
|
|
4002 |
Exec::ThreadLogon(iHandle,&aStatus,ETrue);
|
|
4003 |
}
|
|
4004 |
|
|
4005 |
|
|
4006 |
|
|
4007 |
|
|
4008 |
/**
|
|
4009 |
Cancels a previously requested Rendezvous with the thread
|
|
4010 |
|
|
4011 |
The request completes with the value KErrCancel (if it was still outstanding).
|
|
4012 |
|
|
4013 |
@param aStatus A reference to the same request status object used in
|
|
4014 |
the original call to Rendezvous(TRequestStatus& aStatus).
|
|
4015 |
|
|
4016 |
@return KErrGeneral, if there is no outstanding request, KErrNone otherwise.
|
|
4017 |
|
|
4018 |
@see RThread::Rendezvous(TRequestStatus& aStatus)
|
|
4019 |
*/
|
|
4020 |
EXPORT_C TInt RThread::RendezvousCancel(TRequestStatus& aStatus) const
|
|
4021 |
{
|
|
4022 |
return Exec::ThreadLogonCancel(iHandle,&aStatus,ETrue);
|
|
4023 |
}
|
|
4024 |
|
|
4025 |
|
|
4026 |
|
|
4027 |
|
|
4028 |
/**
|
|
4029 |
Completes all Rendezvous' with the current thread.
|
|
4030 |
|
|
4031 |
@param aReason The reason code used to complete all rendezvous requests
|
|
4032 |
|
|
4033 |
@see RThread::Rendezvous(TRequestStatus& aStatus)
|
|
4034 |
*/
|
|
4035 |
EXPORT_C void RThread::Rendezvous(TInt aReason)
|
|
4036 |
{
|
|
4037 |
Exec::ThreadRendezvous(aReason);
|
|
4038 |
}
|
|
4039 |
|
|
4040 |
|
|
4041 |
|
|
4042 |
|
|
4043 |
EXPORT_C TBusLocalDrive::TBusLocalDrive()
|
|
4044 |
//
|
|
4045 |
// Constructor
|
|
4046 |
//
|
|
4047 |
: iStatus(KErrNotReady)
|
|
4048 |
{}
|
|
4049 |
|
|
4050 |
|
|
4051 |
|
|
4052 |
|
|
4053 |
EXPORT_C TInt TBusLocalDrive::Read(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt aThreadHandle,TInt aOffset,TInt aFlags)
|
|
4054 |
//
|
|
4055 |
// Read from the connected drive, and pass flags to driver
|
|
4056 |
//
|
|
4057 |
{
|
|
4058 |
return RLocalDrive::Read(aPos,aLength,aTrg,aThreadHandle,aOffset,aFlags);
|
|
4059 |
}
|
|
4060 |
|
|
4061 |
|
|
4062 |
|
|
4063 |
|
|
4064 |
EXPORT_C TInt TBusLocalDrive::Read(TInt64 aPos,TInt aLength,const TAny* aTrg,TInt aThreadHandle,TInt anOffset)
|
|
4065 |
//
|
|
4066 |
// Read from the connected drive.
|
|
4067 |
//
|
|
4068 |
{
|
|
4069 |
|
|
4070 |
return RLocalDrive::Read(aPos,aLength,aTrg,aThreadHandle,anOffset);
|
|
4071 |
}
|
|
4072 |
|
|
4073 |
|
|
4074 |
|
|
4075 |
|
|
4076 |
EXPORT_C TInt TBusLocalDrive::Write(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt aThreadHandle,TInt aOffset,TInt aFlags)
|
|
4077 |
//
|
|
4078 |
// Write to the connected drive and pass flags to driver
|
|
4079 |
//
|
|
4080 |
{
|
|
4081 |
|
|
4082 |
return RLocalDrive::Write(aPos,aLength,aSrc,aThreadHandle,aOffset,aFlags);
|
|
4083 |
}
|
|
4084 |
|
|
4085 |
|
|
4086 |
|
|
4087 |
|
|
4088 |
EXPORT_C TInt TBusLocalDrive::Write(TInt64 aPos,TInt aLength,const TAny* aSrc,TInt aThreadHandle,TInt anOffset)
|
|
4089 |
//
|
|
4090 |
// Write to the connected drive.
|
|
4091 |
//
|
|
4092 |
{
|
|
4093 |
|
|
4094 |
return RLocalDrive::Write(aPos,aLength,aSrc,aThreadHandle,anOffset);
|
|
4095 |
}
|
|
4096 |
|
|
4097 |
|
|
4098 |
|
|
4099 |
|
|
4100 |
EXPORT_C TInt TBusLocalDrive::Read(TInt64 aPos,TInt aLength,TDes8& aTrg)
|
|
4101 |
//
|
|
4102 |
// Read from the connected drive.
|
|
4103 |
//
|
|
4104 |
{
|
|
4105 |
|
|
4106 |
return RLocalDrive::Read(aPos,aLength,aTrg);
|
|
4107 |
}
|
|
4108 |
|
|
4109 |
|
|
4110 |
|
|
4111 |
|
|
4112 |
EXPORT_C TInt TBusLocalDrive::Write(TInt64 aPos,const TDesC8& aSrc)
|
|
4113 |
//
|
|
4114 |
// Write to the connected drive.
|
|
4115 |
//
|
|
4116 |
{
|
|
4117 |
|
|
4118 |
return RLocalDrive::Write(aPos,aSrc);
|
|
4119 |
}
|
|
4120 |
|
|
4121 |
|
|
4122 |
|
|
4123 |
|
|
4124 |
EXPORT_C TInt TBusLocalDrive::Caps(TDes8& anInfo)
|
|
4125 |
//
|
|
4126 |
// Get the connected drive's capabilities info.
|
|
4127 |
//
|
|
4128 |
{
|
|
4129 |
|
|
4130 |
return RLocalDrive::Caps(anInfo);
|
|
4131 |
}
|
|
4132 |
|
|
4133 |
|
|
4134 |
|
|
4135 |
|
|
4136 |
const TInt KDefaultMaxBytesPerFormat=0x00004000;// 16K
|
|
4137 |
const TInt KFormatSectorSize=0x00000200; // 512
|
|
4138 |
const TInt KFormatSectorShift=9;
|
|
4139 |
|
|
4140 |
EXPORT_C TInt TBusLocalDrive::Format(TFormatInfo &anInfo)
|
|
4141 |
//
|
|
4142 |
// Format the connected drive.
|
|
4143 |
//
|
|
4144 |
{
|
|
4145 |
if (anInfo.i512ByteSectorsFormatted<0)
|
|
4146 |
return KErrArgument;
|
|
4147 |
if (!anInfo.iFormatIsCurrent)
|
|
4148 |
{
|
|
4149 |
anInfo.iFormatIsCurrent=ETrue;
|
|
4150 |
anInfo.i512ByteSectorsFormatted=0;
|
|
4151 |
anInfo.iMaxBytesPerFormat=KDefaultMaxBytesPerFormat;
|
|
4152 |
|
|
4153 |
// Get the capabilities of the drive. If extra info is supported,
|
|
4154 |
// Then overrise the default KMaxBytesPerFormat
|
|
4155 |
TLocalDriveCapsV3Buf caps;
|
|
4156 |
Caps(caps);
|
|
4157 |
anInfo.iMaxBytesPerFormat = caps().iMaxBytesPerFormat ? caps().iMaxBytesPerFormat : KDefaultMaxBytesPerFormat;
|
|
4158 |
}
|
|
4159 |
TInt64 pos=TInt64(anInfo.i512ByteSectorsFormatted)<<KFormatSectorShift;
|
|
4160 |
TInt length=anInfo.iMaxBytesPerFormat;
|
|
4161 |
TInt r=RLocalDrive::Format(pos,length);
|
|
4162 |
|
|
4163 |
// A positive return code specifies that the format step
|
|
4164 |
// has been adjusted (possibly to account for the partition offset)
|
|
4165 |
if(r > 0)
|
|
4166 |
{
|
|
4167 |
length = r;
|
|
4168 |
r = KErrNone;
|
|
4169 |
}
|
|
4170 |
|
|
4171 |
if (r==KErrNone)
|
|
4172 |
{
|
|
4173 |
length+=KFormatSectorSize-1;
|
|
4174 |
length>>=KFormatSectorShift;
|
|
4175 |
anInfo.i512ByteSectorsFormatted+=length;
|
|
4176 |
}
|
|
4177 |
|
|
4178 |
if (r==KErrEof)
|
|
4179 |
anInfo.iFormatIsCurrent=EFalse;
|
|
4180 |
|
|
4181 |
return r;
|
|
4182 |
}
|
|
4183 |
|
|
4184 |
|
|
4185 |
|
|
4186 |
|
|
4187 |
EXPORT_C TInt TBusLocalDrive::Format(TInt64 aPos, TInt aLength)
|
|
4188 |
//
|
|
4189 |
// Format the connected drive.
|
|
4190 |
//
|
|
4191 |
{
|
|
4192 |
TInt r = KErrNone;
|
|
4193 |
|
|
4194 |
do
|
|
4195 |
{
|
|
4196 |
if((r = RLocalDrive::Format(aPos, aLength)) > 0)
|
|
4197 |
{
|
|
4198 |
aPos += r;
|
|
4199 |
aLength -= r;
|
|
4200 |
if (aLength == 0)
|
|
4201 |
r = KErrNone;
|
|
4202 |
}
|
|
4203 |
}
|
|
4204 |
while(r > 0);
|
|
4205 |
return(r);
|
|
4206 |
}
|
|
4207 |
|
|
4208 |
|
|
4209 |
|
|
4210 |
|
|
4211 |
EXPORT_C TInt TBusLocalDrive::ControlIO(TInt aCommand, TAny* aParam1, TAny* aParam2)
|
|
4212 |
//
|
|
4213 |
// Control IO
|
|
4214 |
// NB: If in a data-paging environment and this drive is the data-paging drive, this API will
|
|
4215 |
// return KErrNotSupported if either aParam1 or aParam2 are non-NULL to avoid the possibility
|
|
4216 |
// of taking a data paging fault in the media driver's thread.
|
|
4217 |
// For this reason, this function has been deprecated
|
|
4218 |
|
|
4219 |
// @deprecated Callers of this function should use one of the other overloads
|
|
4220 |
//
|
|
4221 |
{
|
|
4222 |
return(RLocalDrive::ControlIO(aCommand,aParam1,aParam2));
|
|
4223 |
}
|
|
4224 |
|
|
4225 |
|
|
4226 |
EXPORT_C TInt TBusLocalDrive::ControlIO(TInt aCommand, TDes8& aBuf, TInt aParam)
|
|
4227 |
//
|
|
4228 |
// Control IO
|
|
4229 |
// In a data-paging environment, this API allows the passed descriptor to be pinned in the context
|
|
4230 |
// of the client's thread to avoid taking a data paging fault in the media driver's thread
|
|
4231 |
//
|
|
4232 |
{
|
|
4233 |
if (aBuf.MaxLength() == 0)
|
|
4234 |
return KErrArgument;
|
|
4235 |
return(RLocalDrive::ControlIO(aCommand, aBuf, aParam));
|
|
4236 |
}
|
|
4237 |
|
|
4238 |
|
|
4239 |
EXPORT_C TInt TBusLocalDrive::ControlIO(TInt aCommand, TDesC8& aBuf, TInt aParam)
|
|
4240 |
//
|
|
4241 |
// Control IO
|
|
4242 |
// In a data-paging environment, this API allows the passed descriptor to be pinned in the context
|
|
4243 |
// of the client's thread to avoid taking a data paging fault in the media driver's thread
|
|
4244 |
//
|
|
4245 |
{
|
|
4246 |
if (aBuf.Length() == 0)
|
|
4247 |
return KErrArgument;
|
|
4248 |
return(RLocalDrive::ControlIO(aCommand, aBuf, aParam));
|
|
4249 |
}
|
|
4250 |
|
|
4251 |
EXPORT_C TInt TBusLocalDrive::ControlIO(TInt aCommand, TInt aParam1, TInt aParam2)
|
|
4252 |
{
|
|
4253 |
return(RLocalDrive::ControlIO(aCommand, aParam1, aParam2));
|
|
4254 |
}
|
|
4255 |
|
|
4256 |
|
|
4257 |
|
|
4258 |
EXPORT_C TInt TBusLocalDrive::SetMountInfo(const TDesC8* aMountInfo,TInt aMessageHandle)
|
|
4259 |
//
|
|
4260 |
// Set the mount information on the local drive
|
|
4261 |
//
|
|
4262 |
{
|
|
4263 |
|
|
4264 |
return RLocalDrive::SetMountInfo(aMountInfo,aMessageHandle);
|
|
4265 |
}
|
|
4266 |
|
|
4267 |
|
|
4268 |
|
|
4269 |
|
|
4270 |
EXPORT_C TInt TBusLocalDrive::ForceRemount(TUint aFlags)
|
|
4271 |
//
|
|
4272 |
// Force a remount on the local drive
|
|
4273 |
//
|
|
4274 |
{
|
|
4275 |
|
|
4276 |
TInt err = RLocalDrive::ForceMediaChange(aFlags);
|
|
4277 |
if(err != KErrNone)
|
|
4278 |
return err;
|
|
4279 |
|
|
4280 |
if(aFlags & ELocDrvRemountForceMediaChange)
|
|
4281 |
err = CheckMount();
|
|
4282 |
|
|
4283 |
return err;
|
|
4284 |
}
|
|
4285 |
|
|
4286 |
|
|
4287 |
|
|
4288 |
|
|
4289 |
EXPORT_C TInt TBusLocalDrive::GetLastErrorInfo(TDes8& aErrorInfo)
|
|
4290 |
//
|
|
4291 |
// Get information on the local drives last error
|
|
4292 |
//
|
|
4293 |
{
|
|
4294 |
|
|
4295 |
return RLocalDrive::GetLastErrorInfo(aErrorInfo);
|
|
4296 |
}
|
|
4297 |
|
|
4298 |
|
|
4299 |
|
|
4300 |
|
|
4301 |
EXPORT_C TLocalDriveCaps::TLocalDriveCaps()
|
|
4302 |
//
|
|
4303 |
// Constructor
|
|
4304 |
//
|
|
4305 |
: iSize(0),
|
|
4306 |
iType(EMediaNotPresent),
|
|
4307 |
iBattery(EBatNotSupported),
|
|
4308 |
iDriveAtt(0),
|
|
4309 |
iMediaAtt(0),
|
|
4310 |
iBaseAddress(NULL),
|
|
4311 |
iFileSystemId(0)
|
|
4312 |
{}
|
|
4313 |
|
|
4314 |
|
|
4315 |
|
|
4316 |
|
|
4317 |
/**
|
|
4318 |
@capability TCB
|
|
4319 |
*/
|
|
4320 |
EXPORT_C TInt TBusLocalDrive::Connect(TInt aDriveNumber,TBool &aChangedFlag)
|
|
4321 |
//
|
|
4322 |
// Connect to the drive.
|
|
4323 |
//
|
|
4324 |
{
|
|
4325 |
|
|
4326 |
return RLocalDrive::Connect(aDriveNumber, aChangedFlag);
|
|
4327 |
}
|
|
4328 |
|
|
4329 |
|
|
4330 |
|
|
4331 |
|
|
4332 |
EXPORT_C void TBusLocalDrive::Disconnect()
|
|
4333 |
//
|
|
4334 |
// Disconnect from the drive.
|
|
4335 |
//
|
|
4336 |
{
|
|
4337 |
|
|
4338 |
Close();
|
|
4339 |
}
|
|
4340 |
|
|
4341 |
|
|
4342 |
|
|
4343 |
|
|
4344 |
EXPORT_C TInt TBusLocalDrive::Enlarge(TInt aLength)
|
|
4345 |
//
|
|
4346 |
// Increase the size of the connected drive by the specified length (in bytes).
|
|
4347 |
//
|
|
4348 |
{
|
|
4349 |
|
|
4350 |
return RLocalDrive::Enlarge(aLength);
|
|
4351 |
}
|
|
4352 |
|
|
4353 |
|
|
4354 |
|
|
4355 |
|
|
4356 |
EXPORT_C TInt TBusLocalDrive::ReduceSize(TInt aPos,TInt aLength)
|
|
4357 |
//
|
|
4358 |
// Reduce the size of the connected drive by removing the specified length
|
|
4359 |
// (in bytes) starting at the specified position.
|
|
4360 |
//
|
|
4361 |
{
|
|
4362 |
|
|
4363 |
return RLocalDrive::Reduce(aPos, aLength);
|
|
4364 |
}
|
|
4365 |
|
|
4366 |
|
|
4367 |
|
|
4368 |
|
|
4369 |
/**
|
|
4370 |
Attempt to unlock a password-enabled drive and optionally store the password in the password store.
|
|
4371 |
|
|
4372 |
@param aPassword A descriptor containing the password data.
|
|
4373 |
@param aStorePassword If ETrue, the password is added to the password store.
|
|
4374 |
|
|
4375 |
@return KErrNone, if successful.
|
|
4376 |
KErrAlreadyExists, if the drive is already unlocked.
|
|
4377 |
KErrAccessDenied, if the drive unlock operation fails.
|
|
4378 |
|
|
4379 |
@see TBusLocalDrive::SetPassword
|
|
4380 |
@see TBusLocalDrive::Clear
|
|
4381 |
@see TBusLocalDrive::ErasePassword
|
|
4382 |
*/
|
|
4383 |
EXPORT_C TInt TBusLocalDrive::Unlock(const TDesC8& aPassword, TBool aStorePassword)
|
|
4384 |
{
|
|
4385 |
TInt err = CheckMount();
|
|
4386 |
if (err != KErrNone)
|
|
4387 |
return err;
|
|
4388 |
|
|
4389 |
if (!(Status() & KMediaAttLocked))
|
|
4390 |
return KErrAlreadyExists;
|
|
4391 |
|
|
4392 |
err = RLocalDrive::Unlock(aPassword, aStorePassword);
|
|
4393 |
|
|
4394 |
if(err == KErrLocked)
|
|
4395 |
err = KErrAccessDenied;
|
|
4396 |
|
|
4397 |
return err;
|
|
4398 |
}
|
|
4399 |
|
|
4400 |
|
|
4401 |
|
|
4402 |
|
|
4403 |
/**
|
|
4404 |
Attempt to lock password-enabled drive and optionally store the new password in the password store.
|
|
4405 |
|
|
4406 |
@param aOldPassword A descriptor containing old password.
|
|
4407 |
@param aNewPassword A descriptor containing new password.
|
|
4408 |
@param aStorePassword If ETrue, the password is added to the password store.
|
|
4409 |
|
|
4410 |
@return KErrNone, if successful.
|
|
4411 |
KErrAccessDenied, if the drive is already locked or the old password is incorrect.
|
|
4412 |
|
|
4413 |
@see TBusLocalDrive::Unlock
|
|
4414 |
@see TBusLocalDrive::Clear
|
|
4415 |
@see TBusLocalDrive::ErasePassword
|
|
4416 |
*/
|
|
4417 |
EXPORT_C TInt TBusLocalDrive::SetPassword(const TDesC8& aOldPassword, const TDesC8& aNewPassword, TBool aStorePassword)
|
|
4418 |
{
|
|
4419 |
TInt err = CheckMount();
|
|
4420 |
if (err != KErrNone)
|
|
4421 |
return err;
|
|
4422 |
|
|
4423 |
if (Status() & KMediaAttLocked)
|
|
4424 |
return KErrAccessDenied;
|
|
4425 |
|
|
4426 |
err = RLocalDrive::SetPassword(aOldPassword, aNewPassword, aStorePassword);
|
|
4427 |
if(err == KErrLocked)
|
|
4428 |
err = KErrAccessDenied;
|
|
4429 |
|
|
4430 |
return err;
|
|
4431 |
}
|
|
4432 |
|
|
4433 |
|
|
4434 |
|
|
4435 |
|
|
4436 |
/**
|
|
4437 |
Clears a password from a card - controller sets password to null.
|
|
4438 |
volume will not be password-enabled next time it is powered up.
|
|
4439 |
The password is cleared from the password store.
|
|
4440 |
|
|
4441 |
@param aPassword A descriptor containing the password.
|
|
4442 |
|
|
4443 |
@return KErrNone, if successful.
|
|
4444 |
KErrAccessDenied, if the drive is already locked or the password is incorrect.
|
|
4445 |
|
|
4446 |
@see TBusLocalDrive::Unlock
|
|
4447 |
@see TBusLocalDrive::SetPassword
|
|
4448 |
@see TBusLocalDrive::ErasePassword
|
|
4449 |
*/
|
|
4450 |
EXPORT_C TInt TBusLocalDrive::Clear(const TDesC8& aPassword)
|
|
4451 |
{
|
|
4452 |
TInt err = CheckMount();
|
|
4453 |
if (err != KErrNone)
|
|
4454 |
return err;
|
|
4455 |
|
|
4456 |
if (Status() & KMediaAttLocked)
|
|
4457 |
return KErrAccessDenied;
|
|
4458 |
|
|
4459 |
err = RLocalDrive::Clear(aPassword);
|
|
4460 |
if(err == KErrLocked)
|
|
4461 |
err = KErrAccessDenied;
|
|
4462 |
|
|
4463 |
return err;
|
|
4464 |
}
|
|
4465 |
|
|
4466 |
|
|
4467 |
|
|
4468 |
|
|
4469 |
/**
|
|
4470 |
Forcibly unlock a password-enabled drive.
|
|
4471 |
KErrAccessDenied is returned if the drive is already mounted (and therefore unlocked)
|
|
4472 |
or if the drive is not already mounted and the operation fails.
|
|
4473 |
|
|
4474 |
@return KErrNone, if successful.
|
|
4475 |
KErrAccessDenied, if the drive is not locked or the operation is not supported.
|
|
4476 |
|
|
4477 |
@see TBusLocalDrive::Unlock
|
|
4478 |
@see TBusLocalDrive::SetPassword
|
|
4479 |
@see TBusLocalDrive::ErasePassword
|
|
4480 |
*/
|
|
4481 |
EXPORT_C TInt TBusLocalDrive::ErasePassword()
|
|
4482 |
{
|
|
4483 |
TInt err = CheckMount();
|
|
4484 |
if (err != KErrNone)
|
|
4485 |
return err;
|
|
4486 |
|
|
4487 |
if (!(Status() & KMediaAttLocked))
|
|
4488 |
return KErrAccessDenied;
|
|
4489 |
|
|
4490 |
err = RLocalDrive::ErasePassword();
|
|
4491 |
if(err != KErrNone)
|
|
4492 |
err = KErrAccessDenied;
|
|
4493 |
|
|
4494 |
return err;
|
|
4495 |
}
|
|
4496 |
|
|
4497 |
|
|
4498 |
|
|
4499 |
|
|
4500 |
TInt TBusLocalDrive::CheckMount()
|
|
4501 |
//
|
|
4502 |
// Check the local drive can be, or is mounted
|
|
4503 |
//
|
|
4504 |
{
|
|
4505 |
TLocalDriveCaps caps;
|
|
4506 |
TPckg<TLocalDriveCaps> capsPckg(caps);
|
|
4507 |
TInt err = RLocalDrive::Caps(capsPckg);
|
|
4508 |
iStatus = caps.iMediaAtt;
|
|
4509 |
return err;
|
|
4510 |
}
|
|
4511 |
|
|
4512 |
|
|
4513 |
|
|
4514 |
/**
|
|
4515 |
Write the password store to the peripheral bus controller.
|
|
4516 |
|
|
4517 |
@return
|
|
4518 |
- KErrNone if Successful
|
|
4519 |
- KErrOverflow If aBuf is longer than TPasswordStore::EMaxPasswordLength
|
|
4520 |
- KErrCorrupt If store in aBuf is malformed.
|
|
4521 |
|
|
4522 |
@param aBuf Data to replace the current password store.
|
|
4523 |
*/
|
|
4524 |
EXPORT_C TInt TBusLocalDrive::WritePasswordData(const TDesC8& aBuf)
|
|
4525 |
{
|
|
4526 |
return RLocalDrive::WritePasswordData(aBuf);
|
|
4527 |
}
|
|
4528 |
|
|
4529 |
|
|
4530 |
|
|
4531 |
|
|
4532 |
EXPORT_C TInt TBusLocalDrive::ReadPasswordData(TDes8& aBuf)
|
|
4533 |
//
|
|
4534 |
// Read the entire password store from the peripheral bus controller.
|
|
4535 |
//
|
|
4536 |
{
|
|
4537 |
return RLocalDrive::ReadPasswordData(aBuf);
|
|
4538 |
}
|
|
4539 |
|
|
4540 |
|
|
4541 |
|
|
4542 |
|
|
4543 |
EXPORT_C TInt TBusLocalDrive::PasswordStoreLengthInBytes()
|
|
4544 |
//
|
|
4545 |
// Return the number of bytes used by peripheral bus controller password store.
|
|
4546 |
//
|
|
4547 |
{
|
|
4548 |
return RLocalDrive::PasswordStoreLengthInBytes();
|
|
4549 |
}
|
|
4550 |
|
|
4551 |
|
|
4552 |
|
|
4553 |
|
|
4554 |
EXPORT_C TInt TBusLocalDrive::DeleteNotify(TInt64 aPos, TInt aLength)
|
|
4555 |
//
|
|
4556 |
// Notify the media driver that an area of the partition has been deleted.
|
|
4557 |
// This is used by certain media (e.g NAND flash) for garbage collection.
|
|
4558 |
//
|
|
4559 |
{
|
|
4560 |
return RLocalDrive::DeleteNotify(aPos, aLength);
|
|
4561 |
}
|
|
4562 |
|
|
4563 |
|
|
4564 |
/**
|
|
4565 |
Query a property of the media device
|
|
4566 |
|
|
4567 |
@prototype
|
|
4568 |
@internalTechnology
|
|
4569 |
*/
|
|
4570 |
EXPORT_C TInt TBusLocalDrive::QueryDevice(TQueryDevice aQueryDevice, TDes8 &aBuf)
|
|
4571 |
{
|
|
4572 |
return RLocalDrive::QueryDevice(aQueryDevice, aBuf);
|
|
4573 |
}
|
|
4574 |
|
|
4575 |
|
|
4576 |
EXPORT_C void User::__DbgMarkStart(TBool aKernel)
|
|
4577 |
/**
|
|
4578 |
Marks the start of heap cell checking for the current thread's default heap,
|
|
4579 |
or for the kernel heap.
|
|
4580 |
|
|
4581 |
If earlier calls to __DbgMarkStart() have been made, then this
|
|
4582 |
call to __DbgMarkStart() marks the start of a new nested level of
|
|
4583 |
heap cell checking.
|
|
4584 |
|
|
4585 |
Every call to __DbgMarkStart() should be matched by a later call
|
|
4586 |
to __DbgMarkEnd() to verify that the number of heap cells allocated, at
|
|
4587 |
the current nested level, is as expected.
|
|
4588 |
This expected number of heap cells is passed to __DbgMarkEnd()
|
|
4589 |
as a parameter; however, the most common expected number is zero, reflecting
|
|
4590 |
the fact that the most common requirement is to check that all memory allocated
|
|
4591 |
since a previous call to __DbgStartCheck() has been freed.
|
|
4592 |
|
|
4593 |
@param aKernel ETrue, if checking is being done for the kernel heap;
|
|
4594 |
EFalse, if checking is being done for the current thread's
|
|
4595 |
default heap.
|
|
4596 |
*/
|
|
4597 |
{
|
|
4598 |
|
|
4599 |
if (aKernel)
|
|
4600 |
Exec::KernelHeapDebug(EDbgMarkStart,0,NULL);
|
|
4601 |
else
|
|
4602 |
GetHeap()->__DbgMarkStart();
|
|
4603 |
}
|
|
4604 |
|
|
4605 |
|
|
4606 |
|
|
4607 |
|
|
4608 |
EXPORT_C void User::__DbgMarkCheck(TBool aKernel, TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum)
|
|
4609 |
//
|
|
4610 |
// Call CheckNum for the default heap
|
|
4611 |
//
|
|
4612 |
/**
|
|
4613 |
Checks the current number of allocated heap cells for the current thread's default
|
|
4614 |
heap, or the kernel heap.
|
|
4615 |
|
|
4616 |
If aCountAll is true, the function checks that the total number of
|
|
4617 |
allocated cells on the heap is the same as aCount. If aCountAll is false,
|
|
4618 |
the function checks that the number of allocated cells at the current nested
|
|
4619 |
level is the same as aCount.
|
|
4620 |
|
|
4621 |
If checking fails, the function raises a panic. Information about the failure
|
|
4622 |
is put into the panic category, which takes the form:
|
|
4623 |
|
|
4624 |
ALLOC COUNT\\rExpected aaa\\rAllocated bbb\\rLn: ccc ddd
|
|
4625 |
|
|
4626 |
Where aaa is the value aCount, bbb is the number of allocated heap cells,
|
|
4627 |
ccc is a line number, copied from aLineNum, and ddd is a file name, copied
|
|
4628 |
from the descriptor aFileName.
|
|
4629 |
|
|
4630 |
Note that the panic number is 1.
|
|
4631 |
|
|
4632 |
@param aKernel ETrue, if checking is being done for the kernel heap;
|
|
4633 |
EFalse, if checking is being done for the current thread's
|
|
4634 |
default heap.
|
|
4635 |
@param aCountAll If true, the function checks that the total number of
|
|
4636 |
allocated cells on the heap is the same as aCount.
|
|
4637 |
If false, the function checks that the number of allocated
|
|
4638 |
cells at the current nested level is the same as aCount.
|
|
4639 |
@param aCount The expected number of allocated cells.
|
|
4640 |
@param aFileName A filename; this is displayed as part of the panic category,
|
|
4641 |
if the check fails.
|
|
4642 |
@param aLineNum A line number; this is displayed as part of the panic category,
|
|
4643 |
if the check fails.
|
|
4644 |
*/
|
|
4645 |
{
|
|
4646 |
|
|
4647 |
if (!aKernel)
|
|
4648 |
GetHeap()->__DbgMarkCheck(aCountAll,aCount,aFileName,aLineNum);
|
|
4649 |
else
|
|
4650 |
{
|
|
4651 |
TPtrC8 filename(aFileName);
|
|
4652 |
TKernelHeapMarkCheckInfo info;
|
|
4653 |
info.iCountAll=aCountAll;
|
|
4654 |
info.iFileName=&filename;
|
|
4655 |
info.iLineNum=aLineNum;
|
|
4656 |
Exec::KernelHeapDebug(EDbgMarkCheck,aCount,&info);
|
|
4657 |
}
|
|
4658 |
}
|
|
4659 |
|
|
4660 |
|
|
4661 |
|
|
4662 |
|
|
4663 |
EXPORT_C TUint32 User::__DbgMarkEnd(TBool aKernel, TInt aCount)
|
|
4664 |
//
|
|
4665 |
// Call CheckHeap for the default heap
|
|
4666 |
//
|
|
4667 |
/**
|
|
4668 |
Marks the end of heap cell checking at the current nested level for the current
|
|
4669 |
thread's default heap, or the kernel heap.
|
|
4670 |
|
|
4671 |
The function checks that the number of heap cells allocated, at the current
|
|
4672 |
nested level, is aCount. The most common value for aCount is zero, reflecting
|
|
4673 |
the fact that the most common requirement is to check that all memory allocated
|
|
4674 |
since a previous call to __DbgStartCheck() has been freed.
|
|
4675 |
|
|
4676 |
A call to this function should match an earlier call to __DbgMarkStart().
|
|
4677 |
If there are more calls to this function than calls to __DbgMarkStart(), then
|
|
4678 |
this function raises a USER 51 panic.
|
|
4679 |
|
|
4680 |
If the check fails for a user heap, the function raises an ALLOC: nnnnnnnn
|
|
4681 |
panic, where nnnnnnnn is a hexadecimal pointer to the first orphaned heap
|
|
4682 |
cell.
|
|
4683 |
|
|
4684 |
If the check fails for the kernel heap, the kernel server raises a KERN-EXEC 17
|
|
4685 |
panic.
|
|
4686 |
|
|
4687 |
@param aKernel ETrue, if checking is being done for the kernel heap;
|
|
4688 |
EFalse, if checking is being done for the current thread's
|
|
4689 |
default heap.
|
|
4690 |
@param aCount The number of allocated heap cells expected.
|
|
4691 |
|
|
4692 |
@return Zero always.
|
|
4693 |
*/
|
|
4694 |
{
|
|
4695 |
|
|
4696 |
if (!aKernel)
|
|
4697 |
{
|
|
4698 |
TUint32 badCell=GetHeap()->__DbgMarkEnd(aCount);
|
|
4699 |
if (badCell!=0)
|
|
4700 |
{
|
|
4701 |
TBuf<0x10> info=_L("ALLOC: ");
|
|
4702 |
info.AppendFormat(_L("%x\n"), badCell);
|
|
4703 |
User::Panic(info,0);
|
|
4704 |
}
|
|
4705 |
return(badCell);
|
|
4706 |
}
|
|
4707 |
else
|
|
4708 |
Exec::KernelHeapDebug(EDbgMarkEnd,aCount,NULL);
|
|
4709 |
return(0);
|
|
4710 |
}
|
|
4711 |
|
|
4712 |
|
|
4713 |
|
|
4714 |
|
|
4715 |
EXPORT_C void User::__DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aType, TInt aRate)
|
|
4716 |
//
|
|
4717 |
// Set the failure rate for allocating from the default user heap
|
|
4718 |
//
|
|
4719 |
/**
|
|
4720 |
Simulates a heap allocation failure for the current thread's default heap,
|
|
4721 |
or the kernel heap.
|
|
4722 |
|
|
4723 |
The failure occurs on subsequent calls to new or any of the functions which
|
|
4724 |
allocate memory from the heap.
|
|
4725 |
|
|
4726 |
The timing of the allocation failure depends on the type of allocation failure
|
|
4727 |
requested, i.e. on the value of aType.
|
|
4728 |
|
|
4729 |
The simulation of heap allocation failure is cancelled if aType is given
|
|
4730 |
the value RAllocator::ENone.
|
|
4731 |
|
|
4732 |
Notes:
|
|
4733 |
|
|
4734 |
1. If the failure type is RHeap::EFailNext, the next attempt to allocate from
|
|
4735 |
the heap fails; however, no further failures will occur.
|
|
4736 |
|
|
4737 |
2. For failure types RHeap::EFailNext and RHeap::ENone, set aRate to 1.
|
|
4738 |
|
|
4739 |
@param aKernel ETrue, if checking is being done for the kernel heap;
|
|
4740 |
EFalse, if checking is being done for the current thread's
|
|
4741 |
default heap.
|
|
4742 |
@param aType An enumeration which indicates how to simulate heap
|
|
4743 |
allocation failure.
|
|
4744 |
@param aRate The rate of failure; when aType is RAllocator::EDeterministic,
|
|
4745 |
heap allocation fails every aRate attempts.
|
|
4746 |
*/
|
|
4747 |
{
|
|
4748 |
|
|
4749 |
if (aKernel)
|
|
4750 |
Exec::KernelHeapDebug(EDbgSetAllocFail,aType,(TAny*)aRate);
|
|
4751 |
else
|
|
4752 |
GetHeap()->__DbgSetAllocFail(aType,aRate);
|
|
4753 |
}
|
|
4754 |
|
|
4755 |
/**
|
|
4756 |
Simulates a heap allocation failure for the current thread's default heap,
|
|
4757 |
or the kernel heap.
|
|
4758 |
|
|
4759 |
The aBurst failures will occur after subsequent calls to new or any of the
|
|
4760 |
functions which allocate memory from the heap.
|
|
4761 |
|
|
4762 |
The timing of the allocation failures will depend on the type of allocation failure
|
|
4763 |
requested, i.e. on the value of aType.
|
|
4764 |
|
|
4765 |
The simulation of heap allocation failure is cancelled if aType is given
|
|
4766 |
the value RAllocator::ENone.
|
|
4767 |
|
|
4768 |
|
|
4769 |
@param aKernel ETrue, if checking is being done for the kernel heap;
|
|
4770 |
EFalse, if checking is being done for the current thread's
|
|
4771 |
default heap.
|
|
4772 |
@param aType An enumeration which indicates how to simulate heap
|
|
4773 |
allocation failure.
|
|
4774 |
@param aRate The rate of failure; when aType is RAllocator::EDeterministic,
|
|
4775 |
heap allocation fails every aRate attempts.
|
|
4776 |
@param aBurst The number of consecutive allocations that should fail.
|
|
4777 |
|
|
4778 |
*/
|
|
4779 |
EXPORT_C void User::__DbgSetBurstAllocFail(TBool aKernel, RAllocator::TAllocFail aType, TUint aRate, TUint aBurst)
|
|
4780 |
{
|
|
4781 |
if (aKernel)
|
|
4782 |
{
|
|
4783 |
SRAllocatorBurstFail burstFail;
|
|
4784 |
burstFail.iRate = aRate;
|
|
4785 |
burstFail.iBurst = aBurst;
|
|
4786 |
Exec::KernelHeapDebug(EDbgSetBurstAllocFail, aType, (TAny*)&burstFail);
|
|
4787 |
}
|
|
4788 |
else
|
|
4789 |
GetHeap()->__DbgSetBurstAllocFail(aType, aRate, aBurst);
|
|
4790 |
}
|
|
4791 |
|
|
4792 |
|
|
4793 |
/**
|
|
4794 |
Returns the number of heap allocation failures the current debug allocator fail
|
|
4795 |
function has caused so far.
|
|
4796 |
|
|
4797 |
This is intended to only be used with fail types RAllocator::EFailNext,
|
|
4798 |
RAllocator::EBurstFailNext, RAllocator::EDeterministic and
|
|
4799 |
RAllocator::EBurstDeterministic. The return value is unreliable for
|
|
4800 |
all other fail types.
|
|
4801 |
|
|
4802 |
@return The number of heap allocation failures the current debug fail
|
|
4803 |
function has caused.
|
|
4804 |
|
|
4805 |
@see RAllocator::TAllocFail
|
|
4806 |
*/
|
|
4807 |
EXPORT_C TUint User::__DbgCheckFailure(TBool aKernel)
|
|
4808 |
{
|
|
4809 |
TUint r;
|
|
4810 |
if (aKernel)
|
|
4811 |
Exec::KernelHeapDebug(EDbgCheckFailure, 0, (TAny*)&r);
|
|
4812 |
else
|
|
4813 |
r = GetHeap()->__DbgCheckFailure();
|
|
4814 |
return r;
|
|
4815 |
}
|
|
4816 |
|
|
4817 |
EXPORT_C TInt RProcess::Create(const TDesC &aFileName,const TDesC &aCommand,TOwnerType aType)
|
|
4818 |
/**
|
|
4819 |
Starts a new process, loading the specified executable.
|
|
4820 |
|
|
4821 |
The executable can be in ROM or RAM.
|
|
4822 |
|
|
4823 |
By default, ownership of this process handle is vested in the current process,
|
|
4824 |
but can be vested in the current thread by specifying EOwnerThread as the
|
|
4825 |
third parameter to this function.
|
|
4826 |
|
|
4827 |
@param aFileName A descriptor containing the full path name of the executable
|
|
4828 |
to be loaded. If this name has no file extension,
|
|
4829 |
an extension of .EXE is appended. The length of the resulting
|
|
4830 |
full path name must not be greater than KMaxFileName.
|
|
4831 |
The length of the file name itself must not be greater
|
|
4832 |
than KMaxProcessName. If no path is specified, the system will
|
|
4833 |
look in \\sys\\bin on all drives.
|
|
4834 |
@param aCommand A descriptor containing data passed as an argument to
|
|
4835 |
the thread function of the new process's main thread,
|
|
4836 |
when it is first scheduled.
|
|
4837 |
@param aType Defines the ownership of this process handle. If not
|
|
4838 |
specified, EOwnerProcess is the default.
|
|
4839 |
|
|
4840 |
@return KErrNone if successful, otherwise one of the other system-wide error codes.
|
|
4841 |
*/
|
|
4842 |
{
|
|
4843 |
|
|
4844 |
return Create(aFileName, aCommand, TUidType(), aType);
|
|
4845 |
}
|
|
4846 |
|
|
4847 |
|
|
4848 |
|
|
4849 |
|
|
4850 |
EXPORT_C TInt RProcess::Create(const TDesC &aFileName,const TDesC &aCommand,const TUidType &aUidType, TOwnerType aType)
|
|
4851 |
/**
|
|
4852 |
Starts a new process, loading the specified executable which matches
|
|
4853 |
the specified UID type.
|
|
4854 |
|
|
4855 |
The executable can be in ROM or RAM.
|
|
4856 |
|
|
4857 |
By default, ownership of this process handle is vested in the current process,
|
|
4858 |
but can be vested in the current thread by specifying EOwnerThread as the
|
|
4859 |
fourth parameter.
|
|
4860 |
|
|
4861 |
@param aFileName A descriptor containing the full path name of the executable
|
|
4862 |
to be loaded. If this name has no file extension,
|
|
4863 |
an extension of .EXE is appended. The length of the resulting
|
|
4864 |
full path name must not be greater than KMaxFileName.
|
|
4865 |
The length of the file name itself must not be greater
|
|
4866 |
than KMaxProcessName. If no path is specified, the system will
|
|
4867 |
look in \\sys\\bin on all drives.
|
|
4868 |
@param aCommand A descriptor containing data passed as an argument to
|
|
4869 |
the thread function of the new process's main thread,
|
|
4870 |
when it is first scheduled.
|
|
4871 |
@param aUidType A UID type (a triplet of UIDs) which the executable must match.
|
|
4872 |
@param aType Defines the ownership of this process handle. If not specified,
|
|
4873 |
EOwnerProcess is the default.
|
|
4874 |
|
|
4875 |
@return KErrNone if successful, otherwise one of the other system-wide error
|
|
4876 |
codes.
|
|
4877 |
*/
|
|
4878 |
{
|
|
4879 |
|
|
4880 |
RLoader loader;
|
|
4881 |
TInt r=loader.Connect();
|
|
4882 |
if (r==KErrNone)
|
|
4883 |
r=loader.LoadProcess(iHandle,aFileName,aCommand,aUidType,aType);
|
|
4884 |
loader.Close();
|
|
4885 |
return r;
|
|
4886 |
}
|
|
4887 |
|
|
4888 |
|
|
4889 |
EXPORT_C TInt RProcess::CreateWithStackOverride(const TDesC& aFileName,const TDesC& aCommand, const TUidType &aUidType, TInt aMinStackSize, TOwnerType aType)
|
|
4890 |
/**
|
|
4891 |
Starts a new process, loading the specified executable which matches
|
|
4892 |
the specified UID type and the minimum stack size is the specified value.
|
|
4893 |
|
|
4894 |
The executable can be in ROM or RAM.
|
|
4895 |
|
|
4896 |
By default, ownership of this process handle is vested in the current process,
|
|
4897 |
but can be vested in the current thread by specifying EOwnerThread as the
|
|
4898 |
fourth parameter.
|
|
4899 |
|
|
4900 |
|
|
4901 |
@param aFileName A descriptor containing the full path name of the executable
|
|
4902 |
to be loaded. If this name has no file extension,
|
|
4903 |
an extension of .EXE is appended. The length of the resulting
|
|
4904 |
full path name must not be greater than KMaxFileName.
|
|
4905 |
The length of the file name itself must not be greater
|
|
4906 |
than KMaxProcessName. If no path is specified, the system will
|
|
4907 |
look in \\sys\\bin on all drives.
|
|
4908 |
@param aCommand A descriptor containing data passed as an argument to
|
|
4909 |
the thread function of the new process's main thread,
|
|
4910 |
when it is first scheduled.
|
|
4911 |
@param aUidType A UID type (a triplet of UIDs) which the executable must match.
|
|
4912 |
@param aMinStackSize Minimum stack size of the new process.
|
|
4913 |
@param aType Defines the ownership of this process handle. If not specified,
|
|
4914 |
EOwnerProcess is the default.
|
|
4915 |
|
|
4916 |
@return KErrNone if successful, otherwise one of the other system-wide error
|
|
4917 |
codes.
|
|
4918 |
*/
|
|
4919 |
{
|
|
4920 |
|
|
4921 |
RLoader loader;
|
|
4922 |
TInt r=loader.Connect();
|
|
4923 |
if (r==KErrNone)
|
|
4924 |
{
|
|
4925 |
r=loader.LoadProcess(iHandle,aFileName,aCommand,aUidType,aMinStackSize,aType);
|
|
4926 |
}
|
|
4927 |
loader.Close();
|
|
4928 |
return r;
|
|
4929 |
}
|
|
4930 |
|
|
4931 |
|
|
4932 |
|
|
4933 |
EXPORT_C TInt User::LoadLogicalDevice(const TDesC &aFileName)
|
|
4934 |
/**
|
|
4935 |
Loads the logical device driver (LDD) DLL with the specified filename.
|
|
4936 |
|
|
4937 |
The function searches the system path for the LDD DLL, and loads it. It then
|
|
4938 |
makes a kernel server call that:
|
|
4939 |
|
|
4940 |
1. creates the LDD factory object, an instance of a DLogicalDevice derived
|
|
4941 |
class; this involves checking the first UID value to make sure that the DLL
|
|
4942 |
is a valid LDD before proceeding to call the exported function at
|
|
4943 |
ordinal 1, which creates the LDD factory object on the kernel heap
|
|
4944 |
|
|
4945 |
2. calls the LDD factory object's Install() function to complete the installation
|
|
4946 |
|
|
4947 |
3. adds the new LDD factory object to the kernel's list of LDD factory objects.
|
|
4948 |
|
|
4949 |
@param aFileName A reference to the descriptor containing the name of the
|
|
4950 |
physical device driver DLL. If the filename has no extension,
|
|
4951 |
.LDD is assumed by default.
|
|
4952 |
|
|
4953 |
@return KErrNone if successful or one of the system-wide error codes.
|
|
4954 |
*/
|
|
4955 |
{
|
|
4956 |
RLoader loader;
|
|
4957 |
return loader.LoadDeviceDriver(aFileName, 0);
|
|
4958 |
}
|
|
4959 |
|
|
4960 |
|
|
4961 |
|
|
4962 |
|
|
4963 |
EXPORT_C TInt User::FreeLogicalDevice(const TDesC &aDeviceName)
|
|
4964 |
/**
|
|
4965 |
Frees the logical device driver DLL associated with a specified driver name.
|
|
4966 |
|
|
4967 |
@param aDeviceName The name of the logical device driver object. This must
|
|
4968 |
match the name set during installation of the logical
|
|
4969 |
device. Typically, this is done in an implementation
|
|
4970 |
of DLogicalDevice::Install() through a call to SetName().
|
|
4971 |
Note that the name is rarely the same as the device's
|
|
4972 |
filename. The name of a logical device driver object
|
|
4973 |
can be discovered by using TFindLogicalDevice.
|
|
4974 |
|
|
4975 |
@return KErrNone if successful or one of the system-wide error codes. KErrNone
|
|
4976 |
will be returned if the device is not found as it may have already been
|
|
4977 |
freed.
|
|
4978 |
*/
|
|
4979 |
{
|
|
4980 |
TBuf8<KMaxFullName> aDeviceName8;
|
|
4981 |
aDeviceName8.Copy(aDeviceName);
|
|
4982 |
return Exec::DeviceFree(aDeviceName8,0);
|
|
4983 |
}
|
|
4984 |
|
|
4985 |
|
|
4986 |
|
|
4987 |
|
|
4988 |
EXPORT_C TInt User::LoadPhysicalDevice(const TDesC &aFileName)
|
|
4989 |
/**
|
|
4990 |
Loads the physical device driver (PDD) DLL with the specified filename.
|
|
4991 |
|
|
4992 |
The function searches the system path for the PDD DLL, and loads it. It then
|
|
4993 |
makes a kernel server call that:
|
|
4994 |
|
|
4995 |
1. creates the PDD factory object, an instance of a DPhysicalDevice derived class;
|
|
4996 |
this involves checking the first UID value to make sure that the DLL is a
|
|
4997 |
valid PDD before proceeding to call the exported function at ordinal 1, which
|
|
4998 |
creates the PDD factory object on the kernel heap
|
|
4999 |
|
|
5000 |
2. calls the PDD factory object's Install() function to complete the installation
|
|
5001 |
|
|
5002 |
2. adds the new PDD factory object to the kernel's list of PDD factory objects.
|
|
5003 |
|
|
5004 |
@param aFileName A reference to the descriptor containing the name of the
|
|
5005 |
physical device driver DLL. If the filename has no extension,
|
|
5006 |
.PDD is assumed by default.
|
|
5007 |
|
|
5008 |
@return KErrNone if successful or one of the system-wide error codes.
|
|
5009 |
*/
|
|
5010 |
{
|
|
5011 |
RLoader loader;
|
|
5012 |
return loader.LoadDeviceDriver(aFileName, 1);
|
|
5013 |
}
|
|
5014 |
|
|
5015 |
|
|
5016 |
|
|
5017 |
|
|
5018 |
/**
|
|
5019 |
Frees the physical device driver DLL associated with a specified driver name.
|
|
5020 |
|
|
5021 |
@param aDeviceName The name of the physical device driver object. This must
|
|
5022 |
match the name set during installation of the physical
|
|
5023 |
device. Typically, this is done in an implementation of
|
|
5024 |
DPhysicalDevice::Install() through a call to SetName().
|
|
5025 |
Note that the name is rarely the same as the device's
|
|
5026 |
filename. The name of a physical device driver object can
|
|
5027 |
be discovered by using TFindPhysicalDevice.
|
|
5028 |
|
|
5029 |
@return KErrNone if successful or one of the system-wide error codes. KErrNone
|
|
5030 |
will be returned if the device is not found as it may have already
|
|
5031 |
been freed.
|
|
5032 |
*/
|
|
5033 |
EXPORT_C TInt User::FreePhysicalDevice(const TDesC &aDeviceName)
|
|
5034 |
|
|
5035 |
{
|
|
5036 |
TBuf8<KMaxFullName> aDeviceName8;
|
|
5037 |
aDeviceName8.Copy(aDeviceName);
|
|
5038 |
return Exec::DeviceFree(aDeviceName8,1);
|
|
5039 |
}
|
|
5040 |
|
|
5041 |
|
|
5042 |
|
|
5043 |
|
|
5044 |
EXPORT_C TInt RLoader::Connect()
|
|
5045 |
//
|
|
5046 |
// Connect with the loader.
|
|
5047 |
//
|
|
5048 |
{
|
|
5049 |
_LIT(KLoaderServerName,"!Loader");
|
|
5050 |
return CreateSession(KLoaderServerName,Version(),0);
|
|
5051 |
}
|
|
5052 |
|
|
5053 |
TVersion RLoader::Version() const
|
|
5054 |
//
|
|
5055 |
// Return the client side version number.
|
|
5056 |
//
|
|
5057 |
{
|
|
5058 |
|
|
5059 |
return TVersion(KLoaderMajorVersionNumber,KLoaderMinorVersionNumber,KE32BuildVersionNumber);
|
|
5060 |
}
|
|
5061 |
|
|
5062 |
TInt RLoader::LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TOwnerType aType)
|
|
5063 |
//
|
|
5064 |
// Execute another process.
|
|
5065 |
//
|
|
5066 |
{
|
|
5067 |
|
|
5068 |
return (LoadProcess(aHandle, aFileName, aCommand, aUidType, KDefaultStackSize, aType));
|
|
5069 |
|
|
5070 |
}
|
|
5071 |
|
|
5072 |
|
|
5073 |
/**
|
|
5074 |
Execute another process.
|
|
5075 |
|
|
5076 |
@param aHandle
|
|
5077 |
@param aFileName
|
|
5078 |
@param aCommand
|
|
5079 |
@param aUidType
|
|
5080 |
@param aMinStackSize
|
|
5081 |
@param aType
|
|
5082 |
|
|
5083 |
@return
|
|
5084 |
KErrNone if process created
|
|
5085 |
KErrBadName if aFileName.Length() > KMaxFileName
|
|
5086 |
KErrArgument if aMinStackSize < 0
|
|
5087 |
|
|
5088 |
*/
|
|
5089 |
TInt RLoader::LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TInt aMinStackSize, TOwnerType aType)
|
|
5090 |
{
|
|
5091 |
|
|
5092 |
__IF_DEBUG(Print(_L("RLoader::LoadProcess started with %d bytes stack.\n"), aMinStackSize));
|
|
5093 |
|
|
5094 |
if( 0 > aMinStackSize )
|
|
5095 |
return KErrArgument;
|
|
5096 |
|
|
5097 |
TLdrInfo info;
|
|
5098 |
info.iRequestedUids=aUidType; // match these uids only
|
|
5099 |
info.iOwnerType=aType;
|
|
5100 |
|
|
5101 |
info.iMinStackSize=aMinStackSize;
|
|
5102 |
|
|
5103 |
if (aFileName.Length()>KMaxFileName)
|
|
5104 |
return KErrBadName;
|
|
5105 |
|
|
5106 |
TPckg<TLdrInfo> infoBuf(info);
|
|
5107 |
|
|
5108 |
TInt r = SendReceive(ELoadProcess, TIpcArgs((TDes8*)&infoBuf, (const TDesC*)&aFileName, (const TDesC*)&aCommand) );
|
|
5109 |
aHandle = info.iHandle;
|
|
5110 |
__IF_DEBUG(Print(_L("LoadProcess returning %d"),r));
|
|
5111 |
return r;
|
|
5112 |
}
|
|
5113 |
|
|
5114 |
/**
|
|
5115 |
Check if the hash for the given library exists and optionally validate it.
|
|
5116 |
|
|
5117 |
@param aFileName the same as for RLoader::LoadLibrary
|
|
5118 |
@param aValidateHash if ETrue this function will validate library hash if it exists. Requires fully specified aFileName.
|
|
5119 |
|
|
5120 |
@return
|
|
5121 |
KErrNotSupported this feature is not supported by the emulator
|
|
5122 |
KErrNone if aValidateHash=EFalse, it means that the hash exists; if aValidateHash=ETrue, hash exists and valid,
|
|
5123 |
KErrCorrupt if aValidateHash=ETrue, the library hash exists but NOT valid,
|
|
5124 |
KErrNotFound no hash found
|
|
5125 |
KErrArgument bad file name
|
|
5126 |
|
|
5127 |
*/
|
|
5128 |
EXPORT_C TInt RLoader::CheckLibraryHash(const TDesC& aFileName, TBool aValidateHash/*=EFalse*/)
|
|
5129 |
{
|
|
5130 |
__IF_DEBUG(Print(_L("RLoader::CheckLibraryHash")));
|
|
5131 |
|
|
5132 |
TLdrInfo info;
|
|
5133 |
TPckg<TLdrInfo> infoBuf(info);
|
|
5134 |
info.iOwnerType=EOwnerThread;
|
|
5135 |
|
|
5136 |
TInt r = SendReceive(ECheckLibraryHash, TIpcArgs((TDes8*)&infoBuf, (const TDesC*)&aFileName, aValidateHash) );
|
|
5137 |
|
|
5138 |
return r;
|
|
5139 |
}
|
|
5140 |
|
|
5141 |
EXPORT_C TInt RLoader::LoadLibrary(TInt& aHandle, const TDesC& aFileName, const TDesC& aPath, const TUidType& aUidType, TUint32 aModuleVersion)
|
|
5142 |
//
|
|
5143 |
// Load a DLL
|
|
5144 |
//
|
|
5145 |
{
|
|
5146 |
|
|
5147 |
__IF_DEBUG(Print(_L("RLoader::LoadLibrary")));
|
|
5148 |
TLdrInfo info;
|
|
5149 |
TPckg<TLdrInfo> infoBuf(info);
|
|
5150 |
info.iRequestedUids=aUidType; // match these uids only
|
|
5151 |
info.iOwnerType=EOwnerThread;
|
|
5152 |
info.iRequestedVersion=aModuleVersion;
|
|
5153 |
if (aFileName.Length()>KMaxFileName)
|
|
5154 |
return KErrBadName;
|
|
5155 |
aHandle=0;
|
|
5156 |
|
|
5157 |
TInt r=E32Loader::WaitDllLock();
|
|
5158 |
if (r==KErrNone)
|
|
5159 |
{
|
|
5160 |
r = SendReceive(ELoadLibrary, TIpcArgs((TDes8*)&infoBuf, (const TDesC*)&aFileName, (const TDesC*)&aPath) );
|
|
5161 |
aHandle=info.iHandle;
|
|
5162 |
if (r!=KErrNone)
|
|
5163 |
E32Loader::ReleaseDllLock();
|
|
5164 |
}
|
|
5165 |
__IF_DEBUG(Print(_L("LoadLibrary returning %d"),r));
|
|
5166 |
return r;
|
|
5167 |
}
|
|
5168 |
|
|
5169 |
|
|
5170 |
EXPORT_C TInt RLoader::GetInfo(const TDesC& aFileName, TDes8& aInfoBuf)
|
|
5171 |
//
|
|
5172 |
// Get capabilities of a DLL
|
|
5173 |
//
|
|
5174 |
{
|
|
5175 |
__IF_DEBUG(Print(_L("RLoader::GetInfo")));
|
|
5176 |
TLdrInfo info;
|
|
5177 |
TPckg<TLdrInfo> infoBuf(info);
|
|
5178 |
info.iOwnerType=EOwnerThread;
|
|
5179 |
if (aFileName.Length()>KMaxFileName)
|
|
5180 |
return KErrBadName;
|
|
5181 |
TInt r = SendReceive(EGetInfo, TIpcArgs((TDes8*)&infoBuf, (const TDesC*)&aFileName, (TDes8*)&aInfoBuf) );
|
|
5182 |
__IF_DEBUG(Print(_L("GetInfo returning %d"),r));
|
|
5183 |
return r;
|
|
5184 |
}
|
|
5185 |
|
|
5186 |
|
|
5187 |
EXPORT_C TInt RLoader::Delete(const TDesC& aFileName)
|
|
5188 |
/**
|
|
5189 |
Ask the loader to delete a file. This function should be used instead
|
|
5190 |
of RFs::Delete where the supplied file may be a paged executable, although
|
|
5191 |
it can be used for any file. A file that is currently paged may be moved
|
|
5192 |
by the system, and deleted later, when the file is no longer needed. This means
|
|
5193 |
that using this function may not immediately release the disk space associated
|
|
5194 |
with the file.
|
|
5195 |
|
|
5196 |
@param aFileName Fully-qualified filename.
|
|
5197 |
@return Symbian OS error code. Additionally, KErrBadName is
|
|
5198 |
returned if the supplied filename is not fully qualified..
|
|
5199 |
@capability Tcb
|
|
5200 |
@capability AllFiles
|
|
5201 |
*/
|
|
5202 |
{
|
|
5203 |
__IF_DEBUG(Printf(">RLoader::Delete,%S", &aFileName));
|
|
5204 |
TInt r = SendReceive(ELdrDelete, TIpcArgs(0, &aFileName));
|
|
5205 |
__IF_DEBUG(Printf("<RLoader::Delete,%d", r));
|
|
5206 |
return r;
|
|
5207 |
}
|
|
5208 |
|
|
5209 |
#ifdef __WINS__
|
|
5210 |
|
|
5211 |
#include <emulator.h>
|
|
5212 |
|
|
5213 |
TInt RLoader::GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf)
|
|
5214 |
{
|
|
5215 |
__IF_DEBUG(Print(_L("RLoader::GetInfoFromHeader")));
|
|
5216 |
|
|
5217 |
TInt r = KErrNone;
|
|
5218 |
|
|
5219 |
Emulator::TModule module;
|
|
5220 |
module.iBase = aHeader.Ptr();
|
|
5221 |
TProcessCreateInfo info;
|
|
5222 |
module.GetInfo(info);
|
|
5223 |
|
|
5224 |
RLibrary::TInfoV2 ret_info;
|
|
5225 |
memclr(&ret_info,sizeof(ret_info));
|
|
5226 |
ret_info.iModuleVersion = info.iModuleVersion;
|
|
5227 |
ret_info.iUids = info.iUids;
|
|
5228 |
*(SSecurityInfo*)&ret_info.iSecurityInfo = info.iS;
|
|
5229 |
ret_info.iHardwareFloatingPoint = EFpTypeNone;
|
|
5230 |
TPckg<RLibrary::TInfoV2> ret_pckg(ret_info);
|
|
5231 |
if (aInfoBuf.MaxLength() < ret_pckg.Length())
|
|
5232 |
ret_pckg.SetLength(aInfoBuf.MaxLength());
|
|
5233 |
aInfoBuf=ret_pckg;
|
|
5234 |
|
|
5235 |
__IF_DEBUG(Print(_L("GetInfoFromHeader returning %d"),r));
|
|
5236 |
return r;
|
|
5237 |
}
|
|
5238 |
|
|
5239 |
#else // not __WINS__ ...
|
|
5240 |
|
|
5241 |
TInt RLoader::GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf)
|
|
5242 |
{
|
|
5243 |
__IF_DEBUG(Print(_L("RLoader::GetInfoFromHeader")));
|
|
5244 |
TInt r = SendReceive(EGetInfoFromHeader, TIpcArgs(&aHeader, &aInfoBuf) );
|
|
5245 |
__IF_DEBUG(Print(_L("GetInfoFromHeader returning %d"),r));
|
|
5246 |
return r;
|
|
5247 |
}
|
|
5248 |
|
|
5249 |
#endif // __WINS__
|
|
5250 |
|
|
5251 |
TInt RLoader::LoadDeviceDriver(const TDesC& aFileName, TInt aDeviceType)
|
|
5252 |
{
|
|
5253 |
TInt r=Connect();
|
|
5254 |
if (r==KErrNone)
|
|
5255 |
{
|
|
5256 |
TInt m = aDeviceType ? ELoadPhysicalDevice : ELoadLogicalDevice;
|
|
5257 |
r = SendReceive(m, TIpcArgs(0, (const TDesC*)&aFileName, 0) );
|
|
5258 |
Close();
|
|
5259 |
}
|
|
5260 |
return r;
|
|
5261 |
}
|
|
5262 |
|
|
5263 |
TInt RLoader::LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList)
|
|
5264 |
{
|
|
5265 |
TInt r=Connect();
|
|
5266 |
if (r==KErrNone)
|
|
5267 |
{
|
|
5268 |
TInt size = KNumLocaleExports * sizeof(TLibraryFunction);
|
|
5269 |
TPtr8 functionListBuf((TUint8*)aExportList, size, size);
|
|
5270 |
r = SendReceive(ELoadLocale, TIpcArgs(0, (const TDesC*)&aLocaleDllName, &functionListBuf) );
|
|
5271 |
Close();
|
|
5272 |
}
|
|
5273 |
return r;
|
|
5274 |
}
|
|
5275 |
|
|
5276 |
EXPORT_C TInt RLoader::DebugFunction(TInt aFunction, TInt a1, TInt a2, TInt a3)
|
|
5277 |
{
|
|
5278 |
return SendReceive(ELoaderDebugFunction, TIpcArgs(aFunction, a1, a2, a3) );
|
|
5279 |
}
|
|
5280 |
|
|
5281 |
EXPORT_C TInt RLoader::CancelLazyDllUnload()
|
|
5282 |
{
|
|
5283 |
return SendReceive(ELoaderCancelLazyDllUnload, TIpcArgs() );
|
|
5284 |
}
|
|
5285 |
|
|
5286 |
#ifdef __USERSIDE_THREAD_DATA__
|
|
5287 |
|
|
5288 |
EXPORT_C TInt UserSvr::DllSetTls(TInt aHandle, TAny* aPtr)
|
|
5289 |
//
|
|
5290 |
// Set the value of the Thread Local Storage variable.
|
|
5291 |
//
|
|
5292 |
{
|
|
5293 |
return LocalThreadData()->DllSetTls(aHandle, KDllUid_Default, aPtr);
|
|
5294 |
}
|
|
5295 |
|
|
5296 |
EXPORT_C TInt UserSvr::DllSetTls(TInt aHandle, TInt aDllUid, TAny* aPtr)
|
|
5297 |
//
|
|
5298 |
// Set the value of the Thread Local Storage variable.
|
|
5299 |
//
|
|
5300 |
{
|
|
5301 |
return LocalThreadData()->DllSetTls(aHandle, aDllUid, aPtr);
|
|
5302 |
}
|
|
5303 |
|
|
5304 |
EXPORT_C void UserSvr::DllFreeTls(TInt aHandle)
|
|
5305 |
//
|
|
5306 |
// Remove the Thread Local Storage variable.
|
|
5307 |
//
|
|
5308 |
{
|
|
5309 |
return LocalThreadData()->DllFreeTls(aHandle);
|
|
5310 |
}
|
|
5311 |
|
|
5312 |
#else
|
|
5313 |
|
|
5314 |
EXPORT_C TInt UserSvr::DllSetTls(TInt aHandle, TAny* aPtr)
|
|
5315 |
//
|
|
5316 |
// Set the value of the Thread Local Storage variable.
|
|
5317 |
//
|
|
5318 |
{
|
|
5319 |
return Exec::DllSetTls(aHandle, KDllUid_Default, aPtr);
|
|
5320 |
}
|
|
5321 |
|
|
5322 |
EXPORT_C TInt UserSvr::DllSetTls(TInt aHandle, TInt aDllUid, TAny* aPtr)
|
|
5323 |
//
|
|
5324 |
// Set the value of the Thread Local Storage variable.
|
|
5325 |
//
|
|
5326 |
{
|
|
5327 |
return Exec::DllSetTls(aHandle, aDllUid, aPtr);
|
|
5328 |
}
|
|
5329 |
|
|
5330 |
EXPORT_C void UserSvr::DllFreeTls(TInt aHandle)
|
|
5331 |
//
|
|
5332 |
// Remove the Thread Local Storage variable.
|
|
5333 |
//
|
|
5334 |
{
|
|
5335 |
Exec::DllFreeTls(aHandle);
|
|
5336 |
}
|
|
5337 |
|
|
5338 |
#endif
|
|
5339 |
|
|
5340 |
|
|
5341 |
|
|
5342 |
|
|
5343 |
EXPORT_C TInt RChangeNotifier::Create()
|
|
5344 |
/**
|
|
5345 |
Creates a change notifier, and opens this handle to that change notifier.
|
|
5346 |
|
|
5347 |
Ownership of this change notifier is vested in the current process.
|
|
5348 |
|
|
5349 |
@return KErrNone if successful, otherwise one of the other system-wide error codes.
|
|
5350 |
*/
|
|
5351 |
{
|
|
5352 |
return SetReturnedHandle(Exec::ChangeNotifierCreate(EOwnerProcess),*this);
|
|
5353 |
}
|
|
5354 |
|
|
5355 |
|
|
5356 |
|
|
5357 |
|
|
5358 |
EXPORT_C TInt RUndertaker::Create()
|
|
5359 |
/**
|
|
5360 |
Creates a thread-death notifier, and opens this handle to
|
|
5361 |
that thread-death notifier.
|
|
5362 |
|
|
5363 |
Ownership of this thread-death notifier is vested in the current process.
|
|
5364 |
|
|
5365 |
@return KErrNone, if successful; otherwise one of
|
|
5366 |
the other system-wide error codes.
|
|
5367 |
*/
|
|
5368 |
{
|
|
5369 |
return SetReturnedHandle(Exec::UndertakerCreate(EOwnerProcess),*this);
|
|
5370 |
}
|
|
5371 |
|
|
5372 |
|
|
5373 |
|
|
5374 |
|
|
5375 |
EXPORT_C TInt RUndertaker::Logon(TRequestStatus& aStatus, TInt& aThreadHandle) const
|
|
5376 |
/**
|
|
5377 |
Issues a request for notification of the death of a thread.
|
|
5378 |
|
|
5379 |
When another thread dies, the request completes and the TRequestStatus object
|
|
5380 |
contains the value KErrDied; in addition, aThreadHandle contains
|
|
5381 |
the handle-number of the dying thread.
|
|
5382 |
|
|
5383 |
The requesting thread can construct a proper handle for the dying thread
|
|
5384 |
using the code:
|
|
5385 |
|
|
5386 |
@code
|
|
5387 |
{
|
|
5388 |
RThread r;
|
|
5389 |
r.SetHandle(aThreadHandle);
|
|
5390 |
...r.Close();
|
|
5391 |
}
|
|
5392 |
@endcode
|
|
5393 |
|
|
5394 |
Alternatively, if an outstanding request is cancelled by a call
|
|
5395 |
to LogonCancel(), then the request completes with the value KErrCancel.
|
|
5396 |
|
|
5397 |
Note that if a request completes normally, i.e. not as a result of
|
|
5398 |
a LogonCancel(), then the handle to the dying thread must be closed
|
|
5399 |
when there is no further interest in it.
|
|
5400 |
|
|
5401 |
@param aStatus A reference to the request status object.
|
|
5402 |
@param aThreadHandle The handle-number representing the dying thread.
|
|
5403 |
|
|
5404 |
@return KErrInUse if there is an outstanding request; KErrNone otherwise.
|
|
5405 |
|
|
5406 |
@see RUndertaker::LogonCancel()
|
|
5407 |
*/
|
|
5408 |
{
|
|
5409 |
aStatus=KRequestPending;
|
|
5410 |
return Exec::UndertakerLogon(iHandle,aStatus,aThreadHandle);
|
|
5411 |
}
|
|
5412 |
|
|
5413 |
|
|
5414 |
|
|
5415 |
|
|
5416 |
EXPORT_C TInt RUndertaker::LogonCancel() const
|
|
5417 |
/**
|
|
5418 |
Cancels an outstanding notification request to the thread-death notifier.
|
|
5419 |
|
|
5420 |
@return KErrGeneral, if there is no outstanding notification request; KErrNone otherwise.
|
|
5421 |
|
|
5422 |
@see RUndertaker::Logon()
|
|
5423 |
*/
|
|
5424 |
{
|
|
5425 |
return Exec::UndertakerLogonCancel(iHandle);
|
|
5426 |
}
|
|
5427 |
|
|
5428 |
|
|
5429 |
|
|
5430 |
|
|
5431 |
/**
|
|
5432 |
Sets the machine configuration.
|
|
5433 |
|
|
5434 |
@param aConfig Descriptor containing the machine configuration data
|
|
5435 |
|
|
5436 |
@return KErrNone, if sucessful, otherwise one of the other system-wide
|
|
5437 |
error codes.
|
|
5438 |
|
|
5439 |
@capability WriteDeviceData
|
|
5440 |
*/
|
|
5441 |
EXPORT_C TInt User::SetMachineConfiguration(const TDesC8& aConfig)
|
|
5442 |
{
|
|
5443 |
return Exec::SetMachineConfiguration(aConfig);
|
|
5444 |
}
|
|
5445 |
|
|
5446 |
|
|
5447 |
|
|
5448 |
|
|
5449 |
EXPORT_C TInt User::CompressAllHeaps()
|
|
5450 |
/**
|
|
5451 |
Compresses all the chunks containing heaps.
|
|
5452 |
|
|
5453 |
@deprecated This function is no longer supported, and calling it has no effect.
|
|
5454 |
|
|
5455 |
@return KErrNone
|
|
5456 |
*/
|
|
5457 |
{
|
|
5458 |
|
|
5459 |
return KErrNone; // don't do this any more
|
|
5460 |
}
|
|
5461 |
|
|
5462 |
|
|
5463 |
|
|
5464 |
|
|
5465 |
EXPORT_C TInt UserSvr::ChangeLocale(const TDesC& aLocaleDllName)
|
|
5466 |
{
|
|
5467 |
if(aLocaleDllName.Length() == 0)
|
|
5468 |
{
|
|
5469 |
//support reverting to defaults
|
|
5470 |
TInt r = UserSvr::LocalePropertiesSetDefaults();
|
|
5471 |
if(r == KErrNone)
|
|
5472 |
Exec::SetUTCTimeAndOffset(0,0,ETimeSetOffset,EChangesLocale);
|
|
5473 |
return r;
|
|
5474 |
}
|
|
5475 |
TExtendedLocale locale;
|
|
5476 |
TInt r = locale.LoadLocale(aLocaleDllName);
|
|
5477 |
if(r == KErrNone)
|
|
5478 |
{
|
|
5479 |
r = locale.SaveSystemSettings();
|
|
5480 |
}
|
|
5481 |
return r;
|
|
5482 |
}
|
|
5483 |
|
|
5484 |
EXPORT_C TInt UserSvr::ResetMachine(TMachineStartupType aType)
|
|
5485 |
//
|
|
5486 |
// Reset the machine. Currently only aType==EStartupWarmReset is supported.
|
|
5487 |
//
|
|
5488 |
{
|
|
5489 |
|
|
5490 |
return Exec::ResetMachine(aType);
|
|
5491 |
}
|
|
5492 |
|