Module: E:\source\tmp\spin.cpp Group: 'DGROUP' CONST,CONST2,_DATA,_BSS Segment: _TEXT PARA USE32 00000327 bytes #define INCL_NOPMAPI #define WIN32_LEAN_AND_MEAN #define BIFINCL_THREAD #define BIFINCL_SEMAPHORES #include // A few low-level operations extern "C" void LockedIncrement(unsigned *p); #pragma aux LockedIncrement = \ ".386p " \ "lock inc dword ptr [eax] " \ parm [eax] modify []; extern "C" void LockedDecrement(unsigned *p); #pragma aux LockedDecrement = \ ".386p "\ "lock dec dword ptr [eax] "\ parm [eax] modify []; extern "C" unsigned LockedExchange(unsigned *p, unsigned v); #pragma aux LockedExchange = \ ".386p "\ "lock xchg ecx,[eax] "\ parm [eax] [ecx] modify [] value [ecx]; const spin_retries=100; /////////////////////////////////////////////////////////////////////////////// //FSpinMutex class FSpinMutex { unsigned toggle; unsigned waiters; FEventSemaphore try_again; public: FSpinMutex() : toggle(0), waiters(0), try_again() {} void Request(); void Release(); }; void FSpinMutex::Request() { 0000 void near FSpinMutex::Request(): 0000 53 push ebx 0001 51 push ecx 0002 52 push edx 0003 56 push esi 0004 89 c3 mov ebx,eax 0006 31 f6 xor esi,esi 0008 b9 01 00 00 00 L1 mov ecx,00000001H 000d 89 d8 mov eax,ebx 000f f0 87 08 lock xchg ecx,[eax] 0012 85 c9 test ecx,ecx 0014 74 3d je L4 for(unsigned spin=0; spin0) goto OkeyDokey; } 027a 83 3f 00 L30 cmp dword ptr [edi],00000000H 027d 77 13 ja L31 027f 43 inc ebx 0280 83 fb 64 cmp ebx,00000064H 0283 72 f5 jb L30 notzero.Wait(); 0285 ba ff ff ff ff mov edx,0ffffffffH 028a 8d 47 04 lea eax,+4H[edi] 028d e8 00 00 00 00 call int near FEventSemaphore::Wait( long ) OkeyDokey: 0292 8d 5f 1c L31 lea ebx,+1cH[edi] 0295 31 f6 xor esi,esi 0297 b9 01 00 00 00 L32 mov ecx,00000001H 029c 89 d8 mov eax,ebx 029e f0 87 08 lock xchg ecx,[eax] 02a1 85 c9 test ecx,ecx 02a3 74 3a je L35 02a5 46 inc esi 02a6 83 fe 64 cmp esi,00000064H 02a9 72 ec jb L32 change_mutex.Request(); 02ab 8d 43 04 lea eax,+4H[ebx] 02ae f0 ff 00 lock inc dword ptr [eax] 02b1 8d 73 08 lea esi,+8H[ebx] 02b4 b9 01 00 00 00 L33 mov ecx,00000001H 02b9 89 d8 mov eax,ebx 02bb f0 87 08 lock xchg ecx,[eax] 02be 85 c9 test ecx,ecx 02c0 75 08 jne L34 02c2 8d 43 04 lea eax,+4H[ebx] 02c5 f0 ff 08 lock dec dword ptr [eax] 02c8 eb 15 jmp L35 02ca ba ff ff ff ff L34 mov edx,0ffffffffH 02cf 89 f0 mov eax,esi 02d1 e8 00 00 00 00 call int near FEventSemaphore::Wait( long ) 02d6 89 f0 mov eax,esi 02d8 e8 00 00 00 00 call int near FEventSemaphore::Reset() 02dd eb d5 jmp L33 LockedDecrement(&count); 02df 89 f8 L35 mov eax,edi 02e1 f0 ff 08 lock dec dword ptr [eax] if(count==0) 02e4 83 3f 00 cmp dword ptr [edi],00000000H 02e7 75 08 jne L36 notzero.Reset(); 02e9 8d 47 04 lea eax,+4H[edi] 02ec e8 00 00 00 00 call int near FEventSemaphore::Reset() change_mutex.Release(); 02f1 8d 5f 1c L36 lea ebx,+1cH[edi] 02f4 8b 4b 04 mov ecx,+4H[ebx] 02f7 c7 03 00 00 00 00 mov dword ptr [ebx],00000000H 02fd 85 c9 test ecx,ecx 02ff 74 08 je L37 0301 8d 43 08 lea eax,+8H[ebx] 0304 e8 00 00 00 00 call int near FEventSemaphore::Post() wait_mutex.Release(); 0309 83 c7 0c L37 add edi,0000000cH 030c 8b 77 04 mov esi,+4H[edi] 030f c7 07 00 00 00 00 mov dword ptr [edi],00000000H 0315 85 f6 test esi,esi 0317 74 08 je L38 0319 8d 47 08 lea eax,+8H[edi] 031c e8 00 00 00 00 call int near FEventSemaphore::Post() } 0321 5f L38 pop edi 0322 5e pop esi 0323 5a pop edx 0324 59 pop ecx 0325 5b pop ebx 0326 c3 ret No disassembly errors ------------------------------------------------------------