kernel/eka/euser/epoc/win32/uc_utl.cpp
changeset 201 43365a9b78a3
parent 0 a41df078684a
child 257 3e88ff8f41d5
--- a/kernel/eka/euser/epoc/win32/uc_utl.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/euser/epoc/win32/uc_utl.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -114,6 +114,21 @@
 		RSemaphore::Wait();
 	}
 
+EXPORT_C __NAKED__ TInt RFastLock::Poll()
+	{
+	_asm xor eax, eax
+	_asm xor edx, edx
+	_asm dec edx
+
+	/* if ([ecx+4]==0) { [ecx+4]=-1; ZF=1;} else {eax=[ecx+4]; ZF=0;} */
+	_asm lock cmpxchg [ecx+4], edx
+	_asm jz short fastlock_poll_done
+	_asm mov eax, -33
+
+	fastlock_poll_done:
+	_asm ret
+	}
+
 EXPORT_C void RFastLock::Signal()
 	{
 	if (InterlockedIncrement((LPLONG)&iCount) < 0)