tag:blogger.com,1999:blog-18292057199550065202024-03-08T01:42:00.630-08:00piggymemowoobahttp://www.blogger.com/profile/08043549879963991554noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-1829205719955006520.post-11331835488648580782010-10-28T21:14:00.000-07:002010-10-28T21:25:57.882-07:00CAS/CAS2 for lock free queue on x86_64Just ported lock-free queue to x86_64<div>
<br /></div><div>here is CAS, CAS2 macros</div><div>
<br /></div><div><blockquote></blockquote></div><blockquote><div>
<br /></div><div><code></code></div><div><div><code>#ifdef __x86_64__</code></div><div><code>#define __xg(x) ((volatile long *)(x))<span class="Apple-tab-span" style="white-space:pre"> </span>// stole from linux kernel source</code></div><div><code>
<br /></code></div><div><code>// CAS2(ret, &q->tail, head, tag2, next, tag2 + 1);</code></div><div><code>
<br /></code></div><div><code>#define CAS2(ret, mem, old1, old2, new1, new2) \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>do {\</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>asm volatile( \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>".align 8 \n" \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>"movq $0, %0 \n" \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>"LOCK cmpxchg16b %1\n" \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>"setz %0 \n" \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>"1:\n" \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>: "=m" (ret) \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>: "m" (*__xg(mem)), "a" (old1), "d" (old2), "b" (new1), "c" (new2) \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>: "memory", "cc" \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>); \</code></div><div><code><span class="Apple-tab-span" style="white-space:pre"> </span>/* ret = ( (ret & (1 <<><div><span class="Apple-tab-span" style="white-space:pre"> </span>} while(0);</div><div>
<br /></div><div>#else</div><div>#define CAS2(ret, mem, old1, old2, new1, new2) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>do {\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>asm volatile( \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>".align 4 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"movl $0, %0 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"LOCK cmpxchg8b (%%esi)\n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"setz %0 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"1:\n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "=m" (ret) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "S" (mem), "a" (old1), "d" (old2), "b" (new1), "c" (new2) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "memory", "cc" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>); \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>/* ret = ( (ret & (1 <<><div><span class="Apple-tab-span" style="white-space:pre"> </span>} while(0);</div><div>#endif</div><div>
<br /></div><div>#define DEAD_NODE(q) \</div><div> &((q)->stone)</div><div>
<br /></div><div>
<br /></div><div>#ifdef __x86_64__</div><div>
<br /></div><div>#define CAS(ret, mem, old, new) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>do {\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>asm volatile( \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>".align 8 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"movq $0, %0 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"LOCK cmpxchgq %1, %2 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"setz %0 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "=m" (ret) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "d" (new), "m" (*__xg(mem)), "a" (old) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "memory", "cc" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>); \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>} while(0);</div><div>
<br /></div><div>#else</div><div>#define CAS(ret, mem, old, new) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>do {\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>asm volatile( \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>".align 4 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"movl $0, %0 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"LOCK cmpxchgl %%edx, (%%esi) \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>"setz %0 \n" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "=m" (ret) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "d" (new), "S" (mem), "a" (old) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>: "memory", "cc" \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>); \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>} while(0);</div><div>#endif</div></div></code></div></div></blockquote><div><div><code><div><div></div></div></code><div><code></code></div><div>
<br /></div><div>Note: you will have to use long/unsigned long type for each variables for CAS/CAS2, if use int type, gcc might use e*x registers as operand of q suffix instructions, it will make you very unhappy.</div><meta charset="utf-8"></div></div>woobahttp://www.blogger.com/profile/08043549879963991554noreply@blogger.com0tag:blogger.com,1999:blog-1829205719955006520.post-35247248381498305032010-03-25T20:45:00.000-07:002010-03-25T21:54:27.343-07:00patch for amfphp AMF3 ByteArray serialization bugBase on amfphp 1.9, there are bugs of AMF3 ByteArray serialization, if you want to send a ByteArray from PHP to flash, you will have to modify core/amf/io/AMFSerializer.php:writeAmf3ByteArray function.<div><br /></div><div>Line 991:</div><div>Original code:</div><div><div><span class="Apple-tab-span" style="white-space:pre"></span></div><blockquote><div><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">function writeAmf3ByteArray($d)</span></div><div><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">{</span></div><div><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">$this->writeByte(0x0C);</span></div><div><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">$this->writeAmf3String($d, true);</span></div><div><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">$this->writeAmf3ByteArrayBody($d);</span></div><div><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">}</span></div></blockquote><div></div><div>change to:</div><div><div></div><blockquote><div><span class="Apple-style-span" style="color:#009900;"><span class="Apple-style-span" style="color: rgb(0, 0, 0); "><div><span class="Apple-style-span" style="color:#000099;">function writeAmf3ByteArray($d)</span></div><div><span class="Apple-tab-span" style="white-space: pre; "><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">{</span></div><div><span class="Apple-tab-span" style="white-space: pre; "><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">$this->writeByte(0x0C);</span></div><div><span class="Apple-tab-span" style="white-space: pre; "><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">$this->writeAmf3ByteArrayBody($d);</span></div><div><span class="Apple-tab-span" style="white-space: pre; "><span class="Apple-style-span" style="color:#000099;"> </span></span><span class="Apple-style-span" style="color:#000099;">}</span></div></span></span></div><div></div></blockquote><div>It fixed two issues:</div><div>1. writeAmf3String and writeAmf3ByteArrayBody writes ByteArray body content twice</div><div>2. writeAmf3String uses U29S-ref, ByteArray should be U29O-ref ( ref AMF3-spec)</div><div><br /></div><div>Hope helpful</div></div><div><br /></div></div>woobahttp://www.blogger.com/profile/08043549879963991554noreply@blogger.com0