1/* 2 * Copyright (c) 2008-2013 Apple Inc. All rights reserved. 3 * 4 * @APPLE_APACHE_LICENSE_HEADER_START@ 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * @APPLE_APACHE_LICENSE_HEADER_END@ 19 */ 20 21/* 22 * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch 23 * which are subject to change in future releases of Mac OS X. Any applications 24 * relying on these interfaces WILL break. 25 */ 26 27#ifndef __DISPATCH_SHIMS_PERFMON__ 28#define __DISPATCH_SHIMS_PERFMON__ 29 30#if DISPATCH_PERF_MON && !DISPATCH_INTROSPECTION 31 32#if defined (USE_APPLE_TSD_OPTIMIZATIONS) && defined(SIMULATE_5491082) && \ 33 (defined(__i386__) || defined(__x86_64__)) 34#ifdef __LP64__ 35#define _dispatch_perfmon_workitem_inc() asm("incq %%gs:%0" : "+m" \ 36 (*(void **)(dispatch_bcounter_key * sizeof(void *) + \ 37 _PTHREAD_TSD_OFFSET)) :: "cc") 38#define _dispatch_perfmon_workitem_dec() asm("decq %%gs:%0" : "+m" \ 39 (*(void **)(dispatch_bcounter_key * sizeof(void *) + \ 40 _PTHREAD_TSD_OFFSET)) :: "cc") 41#else 42#define _dispatch_perfmon_workitem_inc() asm("incl %%gs:%0" : "+m" \ 43 (*(void **)(dispatch_bcounter_key * sizeof(void *) + \ 44 _PTHREAD_TSD_OFFSET)) :: "cc") 45#define _dispatch_perfmon_workitem_dec() asm("decl %%gs:%0" : "+m" \ 46 (*(void **)(dispatch_bcounter_key * sizeof(void *) + \ 47 _PTHREAD_TSD_OFFSET)) :: "cc") 48#endif 49#else /* !USE_APPLE_TSD_OPTIMIZATIONS */ 50static inline void 51_dispatch_perfmon_workitem_inc(void) 52{ 53 unsigned long cnt; 54 cnt = (unsigned long)_dispatch_thread_getspecific(dispatch_bcounter_key); 55 _dispatch_thread_setspecific(dispatch_bcounter_key, (void *)++cnt); 56} 57static inline void 58_dispatch_perfmon_workitem_dec(void) 59{ 60 unsigned long cnt; 61 cnt = (unsigned long)_dispatch_thread_getspecific(dispatch_bcounter_key); 62 _dispatch_thread_setspecific(dispatch_bcounter_key, (void *)--cnt); 63} 64#endif /* USE_APPLE_TSD_OPTIMIZATIONS */ 65 66#define _dispatch_perfmon_start() \ 67 uint64_t start = _dispatch_absolute_time() 68#define _dispatch_perfmon_end() \ 69 _dispatch_queue_merge_stats(start) 70#else 71 72#define _dispatch_perfmon_workitem_inc() 73#define _dispatch_perfmon_workitem_dec() 74#define _dispatch_perfmon_start() 75#define _dispatch_perfmon_end() 76 77#endif // DISPATCH_PERF_MON 78 79#endif 80