Google interview question

Write a semaphore with spin-lock capability

Interview Answer

Anonymous

27 May 2011

//atomic increment function available //input: A, B, C, D, E, F, G, ..., static Semaphore BufferWrite; // Data Structures typedef my_spin_lock { uint64 next_ticket; uint64 cur_ticket; }my_spin_lock_t; my_spin_lock_t my_lock; //Initialize void initialize(my_spin_lock_t *my_lock) { my_lock->cur_ticket = 1; my_lock->next_ticket = 0; } //spin lock void spin_lock(....) { uint64 temp; temp = atomic_increment(&my_lock->next_ticket); while (temp != my_lock->cur_ticket) spin_waiting(); } CRITICAL SECTION void spin_unlock(....) { atomic_increment(&my_lock->cur_ticket); } //*****************************************// void spin_lock(...){ while(&my_lock->next_ticket){ while(1){ wait(BufferWrite); //Critical section } signal(BufferWrite); } }

2