X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FMicroSpinLock.h;h=1318d9e9f0e02d9445d17553cb4e722674eacfec;hb=95e7a3bad41357c9f78d0a993b542b002f17e00e;hp=6a7588f9416b842e15436b25c901ac03df774fbc;hpb=65220fefdfd7fa2595e420baa784319e32ffab2e;p=folly.git diff --git a/folly/MicroSpinLock.h b/folly/MicroSpinLock.h index 6a7588f9..1318d9e9 100644 --- a/folly/MicroSpinLock.h +++ b/folly/MicroSpinLock.h @@ -1,5 +1,5 @@ /* - * Copyright 2015 Facebook, Inc. + * Copyright 2016 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,22 @@ * limitations under the License. */ +/* + * N.B. You most likely do _not_ want to use MicroSpinLock or any + * other kind of spinlock. Consider MicroLock instead. + * + * In short, spinlocks in preemptive multi-tasking operating systems + * have serious problems and fast mutexes like std::mutex are almost + * certainly the better choice, because letting the OS scheduler put a + * thread to sleep is better for system responsiveness and throughput + * than wasting a timeslice repeatedly querying a lock held by a + * thread that's blocked, and you can't prevent userspace + * programs blocking. + * + * Spinlocks in an operating system kernel make much more sense than + * they do in userspace. + */ + #pragma once /* @@ -123,11 +139,9 @@ struct FOLLY_ALIGNED_MAX SpinLockArray { "Invalid size of PaddedSpinLock"); // Check if T can theoretically cross a cache line. - // NOTE: It should be alignof(std::max_align_t), but max_align_t - // isn't supported by gcc 4.6.2. - static_assert(alignof(MaxAlign) > 0 && - FOLLY_CACHE_LINE_SIZE % alignof(MaxAlign) == 0 && - sizeof(T) <= alignof(MaxAlign), + static_assert(alignof(std::max_align_t) > 0 && + FOLLY_CACHE_LINE_SIZE % alignof(std::max_align_t) == 0 && + sizeof(T) <= alignof(std::max_align_t), "T can cross cache line boundaries"); char padding_[FOLLY_CACHE_LINE_SIZE];