38 CSessionFs *CSessionFs::NewL() |
38 CSessionFs *CSessionFs::NewL() |
39 { |
39 { |
40 return new(ELeave) CSessionFs; |
40 return new(ELeave) CSessionFs; |
41 } |
41 } |
42 |
42 |
43 CSessionFs::~CSessionFs() |
43 |
|
44 void CSessionFs::Cleanup() |
44 { |
45 { |
45 __PRINT1(_L("CSessionFs::~CSessionFs() deleting... = 0x%x"),this); |
46 __PRINT1(_L("CSessionFs::~CSessionFs() deleting... = 0x%x"),this); |
|
47 |
|
48 CancelAsyncRequests(this); |
46 |
49 |
47 FsNotify::CancelSession(this); |
50 FsNotify::CancelSession(this); |
48 |
51 |
49 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION |
52 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION |
50 FsNotificationManager::RemoveNotificationRequest(this); |
53 FsNotificationManager::RemoveNotificationRequest(this); |
72 if (iHandles) |
75 if (iHandles) |
73 delete iHandles; |
76 delete iHandles; |
74 |
77 |
75 |
78 |
76 delete iPath; |
79 delete iPath; |
77 iSessionFlagsLock.Close(); |
|
78 |
80 |
79 #if defined(_DEBUG) || defined(_DEBUG_RELEASE) |
81 #if defined(_DEBUG) || defined(_DEBUG_RELEASE) |
80 __e32_atomic_add_ord32(&SessionCount, (TUint32) -1); |
82 __e32_atomic_add_ord32(&SessionCount, (TUint32) -1); |
81 #endif |
83 #endif |
82 } |
84 } |
83 |
85 |
|
86 CSessionFs::~CSessionFs() |
|
87 { |
|
88 } |
|
89 |
84 void CSessionFs::Close() |
90 void CSessionFs::Close() |
85 { |
91 { |
86 TheFileServer->SessionQueueLockWait(); |
|
87 |
|
88 if (iAccessCount == 1) |
|
89 { |
|
90 // close the objects owned by this session |
|
91 // NB closing a CFileShare may allocate a request to flush dirty data which will |
|
92 // in turn increment iAccessCount on this session |
|
93 if (iHandles) |
|
94 { |
|
95 // Cancel any ASYNC requests belonging to this session BEFORE |
|
96 // CSessionFs is deleted to avoid a KERN-EXEC 44 (EBadMessageHandle) |
|
97 CancelAsyncRequests(this); |
|
98 delete iHandles; |
|
99 iHandles = NULL; |
|
100 } |
|
101 } |
|
102 |
|
103 if (__e32_atomic_tas_ord32(&iAccessCount, 1, -1, 0) == 1) |
92 if (__e32_atomic_tas_ord32(&iAccessCount, 1, -1, 0) == 1) |
104 { |
93 { |
105 RMessage2 message = iMessage; |
94 RMessage2 message = iMessage; |
|
95 Cleanup(); |
|
96 TheFileServer->SessionQueueLockWait(); |
106 delete this; |
97 delete this; |
|
98 TheFileServer->SessionQueueLockSignal(); |
107 // NB Must complete the message AFTER the session has been deleted... |
99 // NB Must complete the message AFTER the session has been deleted... |
108 message.Complete(KErrNone); |
100 message.Complete(KErrNone); |
109 } |
101 } |
110 |
|
111 TheFileServer->SessionQueueLockSignal(); |
|
112 } |
102 } |
113 |
103 |
114 void CSessionFs::CreateL() |
104 void CSessionFs::CreateL() |
115 // |
105 // |
116 // Create any additional resources. |
106 // Create any additional resources. |
117 // |
107 // |
118 { |
108 { |
119 __PRINT1(_L("CSessionFs::CreateL 0x%x"),this); |
109 __PRINT1(_L("CSessionFs::CreateL 0x%x"),this); |
120 |
110 |
121 iHandles=CFsObjectIx::NewL(); |
111 iHandles=CFsObjectIx::NewL(); |
122 TInt r = iSessionFlagsLock.CreateLocal(); |
|
123 User::LeaveIfError(r); |
|
124 } |
112 } |
125 |
113 |
126 TInt CSessionFs::CurrentDrive() |
114 TInt CSessionFs::CurrentDrive() |
127 // |
115 // |
128 // Return the current drive. |
116 // Return the current drive. |
229 } |
217 } |
230 |
218 |
231 |
219 |
232 TBool CSessionFs::TestSessionFlags(TUint32 aFlags) |
220 TBool CSessionFs::TestSessionFlags(TUint32 aFlags) |
233 { |
221 { |
234 iSessionFlagsLock.Wait(); |
222 return (TBool) ((iSessionFlags & aFlags) == aFlags); |
235 TBool b = (iSessionFlags & aFlags) == aFlags; |
|
236 iSessionFlagsLock.Signal(); |
|
237 return(b); |
|
238 } |
223 } |
239 |
224 |
240 |
225 |
241 void CSessionFs::SetSessionFlags(TUint32 aBitsToSet, TUint32 aBitsToClear) |
226 void CSessionFs::SetSessionFlags(TUint32 aBitsToSet, TUint32 aBitsToClear) |
242 { |
227 { |
243 iSessionFlagsLock.Wait(); |
228 // currently this only called from the main thread. |
244 |
229 __CHECK_MAINTHREAD(); |
245 iSessionFlags &= ~aBitsToClear; |
230 |
246 iSessionFlags |= aBitsToSet; |
231 __e32_atomic_ior_ord_ptr(&iSessionFlags, aBitsToSet); |
247 |
232 __e32_atomic_and_ord_ptr(&iSessionFlags, ~aBitsToClear); |
248 iSessionFlagsLock.Signal(); |
|
249 } |
233 } |
250 |
234 |
251 void CSessionFs::CloseRequestCountInc() |
235 void CSessionFs::CloseRequestCountInc() |
252 { |
236 { |
253 iSessionFlagsLock.Wait(); |
237 __e32_atomic_add_ord32(&iCloseRequestCount, (TUint32) 1); |
254 iCloseRequestCount++; |
|
255 iSessionFlagsLock.Signal(); |
|
256 } |
238 } |
257 |
239 |
258 void CSessionFs::CloseRequestCountDec() |
240 void CSessionFs::CloseRequestCountDec() |
259 { |
241 { |
260 iSessionFlagsLock.Wait(); |
242 __e32_atomic_add_ord32(&iCloseRequestCount, (TUint32) -1); |
261 iCloseRequestCount--; |
|
262 iSessionFlagsLock.Signal(); |
|
263 } |
243 } |
264 |
244 |
265 // |
245 // |
266 // Start resource count |
246 // Start resource count |
267 // |
247 // |