182 BufferIterator(varp, vartype, 0); |
182 BufferIterator(varp, vartype, 0); |
183 } |
183 } |
184 |
184 |
185 extern int TryEnterDebugSection(void); |
185 extern int TryEnterDebugSection(void); |
186 extern long AtomicCompareExchange(long*, long, long); |
186 extern long AtomicCompareExchange(long*, long, long); |
|
187 extern long long AtomicCompareExchange64(long long* , long long , long long); |
187 extern void LeaveDebugSection(void); |
188 extern void LeaveDebugSection(void); |
188 extern void ValidateRetainBuffer(void); |
189 extern void ValidateRetainBuffer(void); |
189 extern void InValidateRetainBuffer(void); |
190 extern void InValidateRetainBuffer(void); |
190 |
191 |
191 void __publish_debug(void) |
192 void __publish_debug(void) |
374 old_cursor = LogCursor[level]; |
375 old_cursor = LogCursor[level]; |
375 buffpos = (uint32_t)old_cursor; |
376 buffpos = (uint32_t)old_cursor; |
376 tail.msgidx = (old_cursor >> 32); |
377 tail.msgidx = (old_cursor >> 32); |
377 new_cursor = ((uint64_t)(tail.msgidx + 1)<<32) |
378 new_cursor = ((uint64_t)(tail.msgidx + 1)<<32) |
378 | (uint64_t)((buffpos + size + sizeof(mTail)) & LOG_BUFFER_MASK); |
379 | (uint64_t)((buffpos + size + sizeof(mTail)) & LOG_BUFFER_MASK); |
379 }while(!__sync_bool_compare_and_swap(&LogCursor[level],old_cursor,new_cursor)); |
380 }while(AtomicCompareExchange64( |
|
381 (long long*)&LogCursor[level], |
|
382 (long long)old_cursor, |
|
383 (long long)new_cursor)!=old_cursor); |
380 |
384 |
381 copy_to_log(level, buffpos, buf, size); |
385 copy_to_log(level, buffpos, buf, size); |
382 copy_to_log(level, (buffpos + size) & LOG_BUFFER_MASK, &tail, sizeof(mTail)); |
386 copy_to_log(level, (buffpos + size) & LOG_BUFFER_MASK, &tail, sizeof(mTail)); |
383 |
387 |
384 return 1; /* Success */ |
388 return 1; /* Success */ |