It's "locking" if it's blocking

Given a piece of code, how do you know if it's lock-based or lock-free, and why do you care?

Sounds like a trivial question – it's lock-based if it says, "lock a mutex", which is usually an OS service. If it doesn't say "lock" or "unlock", then it's lock-free. And we care because OS services like mutexes are expensive and if we don't use them, code runs faster.

Which is all true, in a way, but it doesn't really answer the question. "The OS" isn't magic – it's code. You can have code implementing userspace locks outside the OS. Or you can have an OS where there's just one address space, and then that OS's locks are "userspace" code like any other. And so the question remains: which piece of code implements "locking" and which doesn't?

It's all code, right? A piece of code is a sort if it sorts. When is code locking? What is locking, as opposed to "lock-free" code? We'll try to answer that question, and then the answer will tell us why (and when) the "locking"/"lock-free" distinction actually matters.

We'll start with two examples – atomic addition and spin locks. The code for these can be surprisingly similar, and this similarity will help highlight the one thing that really sets the two apart.

Consider an atomic addition – something like gcc's __sync_fetch_and_add(), which increments a number at some memory location and returns the old value "atomically".

"Atomic" (only) means that nobody will mess up the state midway through the operation. "Atomic" doesn't mean, for example, that a single instruction is used – in fact, often it's not the case. Nor does "atomic" imply "lock-free". An implementation of atomic addition could legitimately use:

  1. A single machine instruction
  2. A loop observing that someone messed up our state, and retrying
  3. A mutex that's locked while the incrementing is done

Let's say it's a loop, something along the lines of:

do {
  val = *addr;
while(!compare_and_swap(addr, val, val+inc));

This is atomic, because if someone modifies addr before we manage to write val+inc, then compare_and_swap (CAS – a typical primitive) will observe that addr no longer holds val, fail, and make us retry. Note that we can get stuck at the loop for an indefinite period of time.

Now consider a spinlock – a loop doing something like:

while(!compare_and_swap(addr, UNLOCKED_VAL, LOCKED_VAL));

This will wait until addr holds UNLOCKED_VAL, and will modify it to keep LOCKED_VAL – unless someone else comes ahead of us, in which case they will write LOCKED_VAL first – and we're back to calling our CAS primitive in a loop. Note that we can get stuck at the loop for an indefinite period of time.

So now you see the difference between "locking" and "lock-free": our atomic addition loop is lock-free, and our spin lock loop implements locking.

Wait, what?

They're both loops, and very similarly-looking ones. Moreover, we can get stuck at both loops for an indefinite period of time. How come they're at the opposite sides of the locking/lock-free distinction?! Where's the difference?

The difference is in whether we get stuck if another thread gets suspended.

The first loop – atomic addition – never gets stuck because of someone else being suspended. On the contrary, it will finish faster. It gets stuck if others modify addr all the time and it keeps retrying. If they're suspended, they can't modify addr, and it succeeds more quickly.

The second loop – the spin lock – will very much get stuck if another thread obtains the lock and then gets suspended before releasing it. And it will keep running until that thread gets the opportunity to finish whatever it did with the lock taken, and releases the lock.

That's why we care – and that's why, with locking, we tend to involve the OS in the first place! Having the OS involved could be a vast improvement over our spin lock loop, because the OS could notice that our thread is stuck because a suspended thread holds a lock. And if that thread is ready to run, the OS could let it run right now, knowing that otherwise, our thread won't make progress anyway.

Moreover, if our thread has a high priority, and the suspended "locker" thread has a low priority, the OS could raise the "locker's" priority until it releases the lock – because releasing the lock that a high-priority thread wants should itself have high priority. (This stuff is known as dealing with "priority inversion" – the situation where they are less important than we are, and yet they block us.)

And for all these good things to happen, the OS needs to know that a lock is taken – which it doesn't with our spin lock loop. For the OS, it's just some loop that could be doing anything. The OS would only know what happens if we used its own locking functions. (BTW, there's another option to get the OS involved: explicitly fiddle with threads and priorities inside the spin lock loop if it takes too long. It can get ugly but it can be the right thing to do.)

Of course having the OS involved will cost us, and we don't want locks in our code because of that, but that's a consequence. The root cause is that threads that lock and get suspended block other threads that lock, and this is why spin locks aren't always a great way to get rid of the pesky OS overhead.

This also shows when spin locks or similar are fine – efficient and just as good as "lock-free code". For example, if you're using hardware threads which are never suspended, such as hardware threads in XMOS processors, then locks are fine. We'd certainly see problems if suspension was possible, but it isn't.

There are other, perhaps more common situations, when locking is fine. For instance, two highest-priority threads running on two distinct physical processors can communicate using spin locks very nicely, because they can't get suspended while holding a lock (they could be if interrupts have still higher priority, but we don't care if interrupt latency is small enough – and perhaps they are interrupt handlers locking some common resource.) Such two threads don't need any help from the OS.

Or, perhaps there's a high-priority thread that sets two variables, A and B, for a low-priority thread. A is written to and then B. After getting notified that A was written, the low-priority thread reads B in a loop – as long as B is NULL, it wasn't written to yet, so keep polling.

Effectively, this is locking – if the high-priority thread gets suspended, then the low-priority thread will get stuck in the loop. But, assuming the high-priority thread has the highest priority, it won't get suspended – and again we're fine without any help from the OS.

These examples show that "locking" isn't defined by "using OS locking functions", and it can take many different forms. You don't spot it in code by looking for certain library calls or for loops having some known look. You spot locking by asking, can I get stuck at this point if someone gets suspended? (And sometimes you answer, "yes, so it's locking; but they won't get suspended, so I don't care.")

Likewise, "lock-free" isn't defined by the use of CAS or LL/SC (load linked/store conditional – two commonly available instructions that can be used to implement compare-and-swap), or by a specific sort of loops.

For instance, our atomic addition loop could be modified to check if the value exceeded a certain size, and quitting the loop if it did without modifying the value:

do {
  val = *addr;
  if(val+inc >= size) break;
while(!compare_and_swap(addr, val, val+inc));

This is still atomic addition – if someone modifies addr, it doesn't break our code. We just keep retrying until addr holds something that can be incremented without exceeding a given size, and we manage to actually increment it without someone beating us to it. This can be used to implement a sort of lock-free queue.

And this code isn't "lock-free" because CAS is used in a loop – that is true for our spin lock as well – but because we aren't blocked when threads are suspended (in fact, it helps us if they get suspended, since there are less interferences).

And this is why we never need help from the OS with lock-free code.

Before concluding, it's worth noting a way in which lock-free code isn't better than lock-based code. We've already seen that "lock-free" isn't (necessarily) better in any way when suspension doesn't threaten us. But regardless of suspensions, "lock-free" is never better in a particular way – specifically, it isn't better if you're worried about correctness.

For instance, suppose you have a counter keeping an account balance. There's a bug where money is transferred between accounts, and the value of the source account is checked before decrementing it:

if(balance - transfer > 0) {
  balance -= transfer;

But several transfers can do the check before reaching the decrementing statement. Then they will all "succeed" – each will decrement the source account balance. As a result, the account balance may reach a negative value, and transfers will be authorized that shouldn't have been.

Here, it doesn't matter if the balance counter is locked or updated using any sort of lock-free addition. Both ways are better than nothing in the sense that all decrements will eventually happen and none will be lost. Both ways are still busted because the check and the decrement should be done atomically, and not just the decrement.

A program using a lock-free counter, or container, or any sort of data structure is thus exactly as correct or buggy as a lock-based version of the same program (provided that the locking and the lock-free updates are both implemented correctly, of course). That is, you can make (or avoid) exactly the same mistakes having to do with what orders of events you allow and how you handle them.

In other words, "locking" and "lock-free" are two equivalent ways to order events, the difference being that with locking, you have to deal with suspension, while with lock-free updates, you have to deal with the effects of concurrent interferences.

(You could say that locking tends to be less buggy and potentially less efficient because a uniform approach to coding is possible: just use the OS's locks. But as we've seen, you don't always have to or want to – and on the other hand, a uniform approach to coding is possible with lock-free code as well: just use off-the-shelf lock-free data structure libraries. And just like it's not automatically clear that locks are easier to develop with, it's not automatically clear that lock-free code is more efficient; both questions depend on the details.)

So that's it; I find it interesting though it could be rather trivial for you – and if you're one of these people, you might have spotted mistakes, in which case I'll be grateful for pointing them out. (I'm not that good at this stuff; what I'm comparatively good at is getting things done without this stuff – that is, sweeping it under the rug and getting imperative, concurrent, bug-free programs. But that doesn't generalize to all types of programs and it's a subject for a separate discussion.)

P.S. according to Wikipedia, it's actually a bit subtler. Specifically, the property of not being blocked by suspended threads makes an algorithm "non-blocking", but not "lock-free". "Lock-freedom" is a stronger property – a non-blocking algorithm is lock-free if there's guaranteed progress (as opposed to a situation where threads are busy undoing the effects of each other's interferences, and make no "real" progress). And there's a still stronger property, "wait-freedom", where progress is guaranteed in a bounded number of steps.

I allowed myself to ignore the distinction between non-blocking and lock-free because it's not a key part of what distinguishes lock-based synchronization from all the other kinds, which are often collectively called "lock-free" in informal speech. Of course in practice, a non-blocking algorithm that can get stuck in an interference-undoing endless loop is useless unless there's some sort of a workaround. Presumably that's the reason why "non-blocking" used to be a synonym for "lock-free" until about 2003 – it's not easy to think how a non-blocking algorithm that can get stuck forever can be made useable enough for this sort of thing to deserve a name of its own.


#1 Josh Haberman on 12.28.12 at 9:23 pm

"A program using a lock-free counter, or container, or any sort of data structure is thus exactly as correct or buggy as a lock-based version of the same program"

While this may be true as you've stated it, I think it misses the point a bit. With the exception of simple atomic counters, lock-free programming is a significantly different design approach than traditional lock-based programming. I don't think it's meaningful to talk about lock-based and lock-free versions of the same program, as if they were slight variations of one another. If you try to make lock-based designs lock-free by just removing locks (carefully), lock-freedom will look terrible.

If you look at the literature about lock-free programming, it's not investigating how to concurrently modify a bank account balance (that's more the domain of STM, which is a more direct alternative to lock-based, shared-state programming). Lock-free literature focuses on how you can implement data structures like stacks, queues, sets, hash tables, malloc() heaps, etc. without locks. A lock-free queue, for example, can be a highly useful work-distributing and communications mechanism. It would be a great candidate for implementing Erlang mailboxes or other similar virtual machine primitives.

#2 Evgeny Lazin on 12.28.12 at 11:30 pm

OS synchronization primitives can use many useful optimizations to prevent different problems, such as thread starvation or convoying. Priority inversion is not the only trick.
That's why we should prefer OS locks instead of spin locks in most cases.

#3 yossi kreinin on 12.29.12 at 5:52 am

@Josh: my point is just as relevant with containers. If you add things to a set and you observe intermediate states of that set when you shouldn't, you have a race condition whether the set is lock-protected or lock-free.

@Evgeny: sure, I don't claim to exhaustively list the features you get from OS locking support, just the core reason why you need them. I do claim that if suspension is not a problem for whatever reason, then you are always fine without OS support.

#4 Josh Haberman on 12.29.12 at 9:25 am

@yossi: that's true, but in general lock-free algorithms are so difficult to get right that writing one is basically a research-level problem. If you need a lock-free set, you don't go to a white-board, you go to a paper like

#5 Yossi Kreinin on 12.29.12 at 9:55 am

I didn't mean bugs in the set. I meant bugs in using it. What my account example was supposed to show was not a bug in implementing the counter but the fact that you have bugs with perfectly correct atomic counters. Likewise, with a perfectly correct set, you can have bugs where you fill the set, access it concurrently with filling it, and get the wrong idea of who's a member of the set because you looked to early. The set is fine – concurrent and all – doesn't matter if it's lock-based or lock-free. But your program still has race conditions. That's my point (I intend to make it in a separate post; working title: "there's no such thing as thread-safe data structures" – precisely because the fact that a data structure is thread-safe doesn't mean that the program using it is correct.)

#6 Josh Haberman on 12.29.12 at 2:54 pm

I see what you are saying though I would put it slightly differently. There *are* such things as thread-safe data structures, inasmuch as they can make API guarantees and honor them. Your account example is broken because the code is trying to provide *more* guarantees than the underlying counter does but is failing to implement those guarantees correctly.

The point I was trying to make is complementary to this. My point is: for lock-free programming to actually be a win, one needs to approach it not as "removing locks" but as "designing so that the program doesn't *need* locks." The primary tool for accomplishing this is ensuring that operations that logically need to be serialized happen on the same thread.

So in your account example (which we both agree is bad), the problem is that it attempts to avoid locks but still uses a fundamentally shared-state design where threads are performing a mix of business logic and mutation on the same data in parallel. The ideal lock-free design would be to ensure that each account is assigned to a particular thread and only modified from that thread. Obviously for this design to be effective, you would need to be able to handle all mutations on a single thread, or partition your object space such that transactions don't need to span threads. If neither of these is possible, then you're fundamentally looking a a concurrent mutators design, and should probably just use locks instead of trying to be clever about removing them.

#7 Sanjoy Das on 12.31.12 at 12:06 am


+1 on the "correct program vs. correct data structure" issue.

There is a very nice talk by Cliff Click [1] describing a lock-free hash-table, with `hash_table[key]` semantically equivalent to a global variable shared among threads. Threads can still have races, stomp on each others writes etc.; but the hash-table itself doesn't crash.

My experience with lock-free programming [2] is that it is rather difficult to get right, even for extremely simple data structures.


#8 neleai on 12.31.12 at 3:38 am

@Josh: A lock-free map is just bunch of lock-free list that you select by hash function. Why should someone write a paper about something that obvious?

#9 Sanjoy Das on 12.31.12 at 4:17 am


A bucketed (each bucket being a linked list) hash-table has terrible cache performance; so you'd want a probing hash-table. And then you'd want to be able to resize the hash-table from time to time. All this adds complexity (but maybe not enough to warrant a research paper).

#10 Aristotle Pagaltzis on 12.31.12 at 7:03 am


If neither of these is possible, then you're fundamentally looking a a concurrent mutators design, and should probably just use locks instead of trying to be clever about removing them.

Yossi’s point was precisely that in that situation you can’t “just” use locks and expect your concurrent mutator design to be correct. (Nor, conversely, “just” use lock-free data structures in a situation that calls for it, and automatically expect correctness.)

#11 Josh Haberman on 01.02.13 at 4:09 pm

@neleai: I think you mean a bunch of lock-free *sets*. The paper I referenced describes both lock-free sets and hash tables in the same paper. Implementing a lock-free set is not obvious.

@Aristotle: If you use locks to serialize concurrent mutators, then you avoid race conditions. There shouldn't be anything controversial about that statement. If you wrapped Yossi's example in a lock, it would no longer have the bug he was describing.

Does proper serialization of a single data structure guarantee that your entire program is correct? Of course not. No data structure or API can guarantee that its clients are correct. You wouldn't say "there's no such this as a correct sorting algorithm" just because a client can mis-implement the comparator. Likewise it doesn't make sense to say "there's no such thing as a thread-safe data structure" just because clients can have synchronization bugs in how they use it.

#12 Chris on 05.15.14 at 9:21 pm

"if(balance – transfer > 0) balance -= transfer;"

The obvious place locks are better is somewhere like this:
if (CanGetKeysToSafe()) GetKeysToSafe();

If we wrap the whole thing in a lock then it is correct, otherwise there can be a race condition. But yes, in the first example given enough time eventually the state will be correct. You just don't want to enable the user to close their account while doing multiple withdrawals that could go negative at the same time :)

#13 Cellcast™ Australia on 04.07.19 at 12:49 pm

Thanks for sharing your info. I truly appreciate your efforts and I am waiting for
your next write ups thank you once again.

#14 on 04.08.19 at 4:32 am

I absolutely love your blog and find most of your post's to be what precisely I'm looking for.
Does one offer guest writers to write content for you personally?
I wouldn't mind creating a post or elaborating on a few
of the subjects you write about here. Again, awesome website!

#15 moving companies in sarasota fl on 04.14.19 at 3:30 pm

Thanks for finally talking about > It's "locking" if
it's blocking < Loved it!

#16 cat Test&Talk Kit Software on 04.15.19 at 1:21 am

Wonderful blog! I found it while browsing on Yahoo News.
Do you have any tips on how to get listed in Yahoo News?

I've been trying for a while but I never seem to get there!
Thank you

#17 LANcat System6 Manuals on 04.15.19 at 7:05 am

Appreciate this post. Will try it out.

#18 Wilcom f6222 manuals on 04.16.19 at 2:57 am

Usually I don't read post on blogs, but I would like
to say that this write-up very forced me to try and do so!
Your writing style has been amazed me. Thanks, quite nice article.

#19 SimpliFiber Data Sheet on 04.17.19 at 1:17 am

I used to be able to find good information from
your blog posts.

#20 Click here on 04.18.19 at 3:30 pm

Heya i'm for the first time here. I found this board and I find
It really useful & it helped me out much. I hope to give something back and aid others like
you helped me.

#21 affordable moving services on 05.02.19 at 3:02 am

Hey! I know this is somewhat off topic but I was
wondering which blog platform are you using for this website?

I'm getting fed up of WordPress because I've had issues with hackers and I'm looking at options for another platform.
I would be awesome if you could point me in the direction of a
good platform.

#22 Topcon GLS-2000 on 05.02.19 at 1:43 pm

Every weekend i used to visit this web page, for the reason that
i want enjoyment, since this this web site conations really good
funny information too.

#23 packing boxes for moving on 05.03.19 at 4:05 pm

Definitely believe that which you said. Your favorite reason seemed to be on the net the simplest thing to be aware of.
I say to you, I definitely get annoyed while people think about worries
that they plainly don't know about. You managed to hit the
nail upon the top and defined out the whole thing without having side-effects ,
people could take a signal. Will probably be back to get more.

#24 ts415 on 05.03.19 at 6:48 pm

Excellent blog here! Also your site loads up fast! What web host are you using?
Can I get your affiliate link to your host? I wish
my web site loaded up as fast as yours lol

#25 Spectra Precision EPOCH 50 on 05.04.19 at 10:27 pm

I do not even know how I ended up here, but I thought this post was great.

I don't know who you are but definitely you're going to a
famous blogger if you are not already ;) Cheers!

#26 MS992 Manual on 05.05.19 at 5:08 am

Hello, I enjoy reading all of your article. I wanted to write
a little comment to support you.

#27 Topcon DL-503 on 05.05.19 at 12:37 pm

Hi there to all, how is the whole thing, I think
every one is getting more from this website, and your views are fastidious in support of
new people.

#28 on 05.07.19 at 5:25 pm

Pretty! This has been an incredibly wonderful post.

Many thanks for supplying this information.

#29 Topcon FC-120 on 05.07.19 at 8:41 pm

Fine way of describing, and fastidious paragraph to take facts on the topic of my presentation topic,
which i am going to deliver in school.

#30 Trimble Geo XH 2008 on 05.08.19 at 3:51 pm

Wow, that's what I was seeking for, what a material!
existing here at this blog, thanks admin of this

#31 newz aimbot on 05.15.19 at 8:19 pm

Intresting, will come back here once in a while.

#32 Isaac Erath on 05.15.19 at 8:46 pm

I'm pleased by the manner in which covers this kind of subject. Generally on point, sometimes contentious, consistently well-written and thought-provoking.

#33 Sokkia Power Level SDL50 Data Sheet on 05.16.19 at 10:19 am

I truly love your website.. Very nice colors & theme. Did you build this website yourself?

Please reply back as I'm hoping to create my very own blog and would love to learn where you got this from or what the theme is named.
Thank you!

#34 Leica ScanStation C10 Brochure on 05.16.19 at 10:31 am

I absolutely love your website.. Excellent colors & theme.
Did you develop this site yourself? Please reply back as
I'm hoping to create my own site and would love to learn where
you got this from or just what the theme is named.
Thank you!

#35 fortnite aimbot download on 05.16.19 at 1:22 pm

Enjoyed examining this, very good stuff, thanks .

#36 fortnite aimbot download on 05.16.19 at 5:16 pm

This does interest me

#37 fx-101 on 05.17.19 at 4:58 am

This is very interesting, You are a very skilled blogger.
I've joined your rss feed and look forward to seeking more of your magnificent post.

Also, I have shared your website in my social networks!

#38 nonsense diamond 1.9 on 05.17.19 at 7:32 am

I conceive this web site holds some real superb information for everyone : D.

#39 fallout 76 hacks on 05.17.19 at 10:56 am

I conceive you have mentioned some very interesting details , appreciate it for the post.

#40 red dead redemption 2 digital key resale on 05.17.19 at 4:06 pm

yahoo bring me here. Thanks!

#41 redline v3.0 on 05.17.19 at 7:10 pm

Hi, here from baidu, me enjoyng this, will come back soon.

#42 badoo superpowers free on 05.18.19 at 8:36 am

I’m impressed, I have to admit. Genuinely rarely should i encounter a weblog that’s both educative and entertaining, and let me tell you, you may have hit the nail about the head. Your idea is outstanding; the problem is an element that insufficient persons are speaking intelligently about. I am delighted we came across this during my look for something with this.

#43 led ryggsäck on 05.18.19 at 3:27 pm

I truly enjoy looking through on this web site , it holds superb content .

#44 mining simulator codes 2019 on 05.19.19 at 7:29 am

Enjoyed reading through this, very good stuff, thankyou .

#45 TP-L4GV on 05.19.19 at 9:02 am

Magnificent site. Plenty of helpful info here.
I'm sending it to several buddies ans additionally sharing in delicious.
And of course, thank you for your effort!

#46 how to get help in windows 10 on 05.20.19 at 11:32 am

Thanks very interesting blog!

#47 smutstone on 05.20.19 at 12:08 pm

Me enjoying, will read more. Cheers!

#48 redline v3.0 on 05.21.19 at 7:40 am

Ha, here from google, this is what i was looking for.

#49 free fire hack version unlimited diamond on 05.21.19 at 4:58 pm

I must say, as a lot as I enjoyed reading what you had to say, I couldnt help but lose interest after a while.

#50 GCS900 PDF on 05.22.19 at 1:23 am

whoah this weblog is wonderful i really like studying your articles.
Stay up the great work! You realize, many individuals are searching round for this info, you can help them greatly.

#51 nonsense diamond on 05.22.19 at 6:48 pm

I like this site because so much useful stuff on here : D.

#52 krunker hacks on 05.23.19 at 7:07 am

I consider something really special in this site.

#53 bitcoin adder v.1.3.00 free download on 05.23.19 at 10:47 am

Some truly cool article on this web site , appreciate it for contribution.

#54 vn hax on 05.23.19 at 7:30 pm

I love reading through and I believe this website got some genuinely utilitarian stuff on it! .

#55 Leica TS06 Manual on 05.23.19 at 10:42 pm

Thanks for sharing your thoughts on WDM / DWDM Analyzers.

#56 v9 on 05.24.19 at 8:18 am

Cheers, great stuff, I like.

#57 ispoofer pogo activate seriale on 05.24.19 at 6:50 pm

Respect to website author , some wonderful entropy.

#58 Probiotics with antibiotics on 05.25.19 at 1:19 am

you are actually a good webmaster. The web site loading speed is incredible.
It seems that you're doing any unique trick. Moreover, The contents are
masterpiece. you have done a excellent task in this subject!

#59 cheats for hempire game on 05.26.19 at 6:53 am

Your web has proven useful to me.

#60 iobit uninstaller 7.5 key on 05.26.19 at 9:38 am

Some truly fine goodies on this web site , appreciate it for contribution.

#61 gamefly free trial on 05.26.19 at 3:47 pm

Thanks in favor of sharing such a nice opinion, paragraph is good,
thats why i have read it fully

#62 smart defrag 6.2 serial key on 05.26.19 at 4:05 pm

I really enjoy examining on this website , it has got fine goodies .

#63 resetter epson l1110 on 05.26.19 at 6:52 pm

Found this on MSN and I’m happy I did. Well written website.

#64 sims 4 seasons code free on 05.27.19 at 8:10 am

I like this website its a master peace ! Glad I found this on google .

#65 rust hacks on 05.27.19 at 8:36 pm

Deference to op , some superb selective information .

#66 gamefly free trial on 05.28.19 at 7:41 am

Hello mates, nice article and nice urging commented here, I am really
enjoying by these.

#67 strucid hacks on 05.28.19 at 10:54 am

You got yourself a new rader.

#68 how to get help in windows 10 on 05.28.19 at 1:02 pm

Heya i am for the first time here. I came across this board and I find It truly useful & it helped me out much.

I hope to give something back and help others
like you aided me.

#69 expressvpn key on 05.28.19 at 7:56 pm

Me like, will read more. Thanks!

#70 ispoofer activation key on 05.29.19 at 9:14 am

I am glad to be one of the visitors on this great website (:, appreciate it for posting .

#71 aimbot free download fortnite on 05.29.19 at 1:14 pm

Good Day, happy that i found on this in google. Thanks!

#72 redline v3.0 on 05.29.19 at 5:39 pm

Respect to website author , some wonderful entropy.

#73 vn hax on 05.30.19 at 6:56 am

I must say, as a lot as I enjoyed reading what you had to say, I couldnt help but lose interest after a while.

#74 xbox one mods free download on 05.31.19 at 1:28 pm

Your website has proven useful to me.

#75 fortnite aimbot download on 05.31.19 at 4:11 pm

I am glad to be one of the visitors on this great website (:, appreciate it for posting .

#76 helicopter charter  on 06.01.19 at 3:28 am

Good write-up. I definitely appreciate this website.
Continue the good work!

#77 gamefly free trial on 06.01.19 at 11:27 am

I am curious to find out what blog system you are utilizing?

I'm experiencing some small security problems with my latest site and I'd like to find
something more risk-free. Do you have any suggestions?

#78 mpl pro on 06.01.19 at 6:54 pm

Intresting, will come back here once in a while.

#79 gamefly free trial on 06.02.19 at 3:04 am

Hi, I log on to your new stuff like every
week. Your humoristic style is awesome, keep doing what you're doing!

#80 hacks counter blox script on 06.02.19 at 7:04 am

You got yourself a new follower.

#81 fortnite aimbot download on 06.03.19 at 10:54 am

Enjoyed reading through this, very good stuff, thankyou .

#82 gamefly free trial on 06.04.19 at 11:54 pm

I think this is among the most important information for me.
And i'm glad reading your article. But wanna remark on some general things, The website style is wonderful,
the articles is really great : D. Good job, cheers

#83 gamefly free trial on 06.05.19 at 7:39 pm

Its such as you learn my mind! You seem to grasp so much about this, like you
wrote the book in it or something. I believe that you just can do with some p.c.
to pressure the message house a little bit, however instead of that, this is fantastic blog.

A fantastic read. I'll certainly be back.

#84 gamefly free trial on 06.06.19 at 4:05 am

Hello there! Would you mind if I share your blog with my zynga
group? There's a lot of folks that I think would really enjoy your
content. Please let me know. Cheers

#85 gamefly free trial on 06.06.19 at 10:15 pm

I think this is among the most significant info for me.
And i'm glad reading your article. However wanna remark on some common issues, The
website style is perfect, the articles is in reality nice :
D. Just right process, cheers

#86 야마토 릴게임 on 06.06.19 at 10:16 pm

I am regular reader, how are you everybody?
This article posted at this site is actually fastidious.

#87 토토솔루션임대 on 06.06.19 at 11:31 pm

What's up, the whole thing is going sound here and ofcourse every one is sharing
information, that's actually good, keep up writing.

#88 ps4 games 2019-20 on 06.08.19 at 12:59 am

Thanks designed for sharing such a pleasant opinion, post
is good, thats why i have read it entirely

#89 Natalia Jonassen on 06.08.19 at 1:15 am

In my view, does a good job of covering subjects like this! Even if ofttimes intentionally polemic, the information is more often than not thoughtful and thought-provoking.

#90 gamefly free trial 2019 coupon on 06.10.19 at 1:01 pm

Greetings! Very helpful advice in this particular post! It is the
little changes that make the greatest changes. Thanks for

#91 gamefly free trial 2019 coupon on 06.10.19 at 9:15 pm

Wow, amazing blog layout! How long have you been blogging for?
you make blogging look easy. The overall look of your web site is fantastic, as well as the

#92 안전놀이터 배팅맨 on 06.11.19 at 4:08 am

I am sure this piece of writing has touched all the internet
users, its really really good paragraph on building up new

#93 playstation 4 best games ever made 2019 on 06.12.19 at 4:03 am

What's Going down i am new to this, I stumbled upon this I have discovered
It absolutely useful and it has aided me out loads.
I'm hoping to give a contribution & aid different users like its helped me.
Good job.

#94 playstation 4 best games ever made 2019 on 06.12.19 at 3:21 pm

I really like your blog.. very nice colors & theme. Did you design this website yourself or did you hire someone to do it for
you? Plz answer back as I'm looking to create my own blog and would like to know where u
got this from. thanks a lot

#95 quest bars cheap on 06.14.19 at 1:07 pm

I am in fact thankful to the owner of this web page who has shared this fantastic paragraph
at at this place.

#96 quest bars cheap on 06.14.19 at 4:33 pm

Hi there! Quick question that's totally off topic.

Do you know how to make your site mobile friendly? My weblog looks weird when viewing from my iphone.
I'm trying to find a template or plugin that might be
able to resolve this problem. If you have any suggestions, please
share. Many thanks!

#97 quest bars cheap on 06.15.19 at 5:27 am

Hi, Neat post. There's an issue along with your site in web explorer, would check this?
IE still is the marketplace leader and a large part of other
people will miss your fantastic writing due to this problem.

#98 quest bars on 06.16.19 at 7:17 pm

I delight in, lead to I discovered just what I was looking for.
You've ended my four day long hunt! God Bless you man. Have a great day.

#99 quest bars cheap on 06.17.19 at 9:48 am

It's really a great and useful piece of information.
I'm glad that you simply shared this helpful
information with us. Please stay us informed like this.
Thanks for sharing.

#100 bloxburg money glitch on 06.17.19 at 12:14 pm

Thanks for this post. I definitely agree with what you are saying.

#101 SEO on 06.17.19 at 5:55 pm

I pay a visit each day some websites and websites
to read articles or reviews, however this webpage presents quality based content.

#102 ciech epidian deco on 06.17.19 at 6:27 pm

Have you ever thought about including a little bit more than just your
articles? I mean, what you say is valuable and all. However think of if you added some great visuals
or video clips to give your posts more, "pop"!
Your content is excellent but with images and videos, this site could undeniably be
one of the best in its field. Very good blog!

#103 on 06.18.19 at 12:55 am

Awesome site you have here but I was wanting to know if
you knew of any community forums that cover the same topics discussed
here? I'd really love to be a part of online community where
I can get responses from other experienced people that share
the same interest. If you have any suggestions, please let
me know. Thank you!

#104 먹튀검증 커뮤니티 on 06.18.19 at 4:03 am

Very great post. I just stumbled upon your weblog and wished to say that I've truly enjoyed browsing your blog posts.
In any case I'll be subscribing in your feed and I am hoping you write once more soon!

#105 사설토토사이트 on 06.18.19 at 4:14 am

Thanks for sharing your info. I really appreciate your efforts and I
will be waiting for your further write ups thank you once again.

#106 proxo key generator on 06.19.19 at 1:54 pm

I really got into this web. I found it to be interesting and loaded with unique points of interest.

#107 vn hax download on 06.20.19 at 10:27 pm

Appreciate it for this howling post, I am glad I observed this internet site on yahoo.

#108 poseidonhd on 06.21.19 at 7:34 am

Hello There. I discovered your weblog using msn. This is a very neatly
written article. I'll be sure to bookmark it and come back to read extra of your useful
info. Thank you for the post. I will certainly return.

#109 poseidonhd on 06.21.19 at 9:26 am

These are in fact wonderful ideas in concerning blogging.
You have touched some pleasant points here. Any way keep up wrinting.

#110 nonsense diamond on 06.21.19 at 11:32 am

Respect to website author , some wonderful entropy.

#111 plenty of fish dating site on 06.22.19 at 3:50 am

When I initially commented I clicked the "Notify me when new comments are added" checkbox and
now each time a comment is added I get four emails with the same comment.
Is there any way you can remove me from that service?


#112 star valor cheats on 06.23.19 at 8:51 pm

Enjoyed reading through this, very good stuff, thankyou .

#113 awards winning web agency Manchester on 06.24.19 at 8:42 am

Great beat ! I wish to apprentice while you amend your web site,
how could i subscribe for a blog website? The account helped me a
appropriate deal. I have been tiny bit acquainted of this your broadcast provided vivid transparent idea

#114 gx tool pro on 06.24.19 at 6:47 pm

I conceive you have mentioned some very interesting details , appreciate it for the post.

#115 사설토토 on 06.25.19 at 1:51 am

Hi there! I just wanted to ask if you ever have
any issues with hackers? My last blog (wordpress) was hacked
and I ended up losing many months of hard work due to no backup.
Do you have any methods to protect against hackers?

#116 on 06.25.19 at 2:05 am

Attractive section of content. I just stumbled upon your website and in accession capital to assert that
I acquire actually enjoyed account your blog posts.

Anyway I will be subscribing to your feeds
and even I achievement you access consistently quickly.

#117 Garrett on 06.25.19 at 12:25 pm

naturally like your web site however you have to take a look
at the spelling on quite a few of your posts. A number of them are rife with spelling issues and I to
find it very troublesome to inform the truth however I
will surely come back again.

#118 qureka pro apk on 06.25.19 at 11:30 pm

Hi, i really think i will be back to your site

#119 krunker aimbot on 06.26.19 at 9:58 am

Me enjoying, will read more. Thanks!

Leave a Comment