4 * Copyright 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
8 * Woojin Jung <woojin2.jung@samsung.com>
9 * Jaewon Lim <jaewon81.lim@samsung.com>
10 * Juyoung Kim <j0.kim@samsung.com>
11 * Anastasia Lyupa <a.lyupa@samsung.com>
13 * This library is free software; you can redistribute it and/or modify it under
14 * the terms of the GNU Lesser General Public License as published by the
15 * Free Software Foundation; either version 2.1 of the License, or (at your option)
18 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
19 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
21 * License for more details.
23 * You should have received a copy of the GNU Lesser General Public License
24 * along with this library; if not, write to the Free Software Foundation, Inc., 51
25 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 * - Samsung RnD Institute Russia
37 #include "probeinfo.h"
43 static enum DaOptions _sopt = OPT_THREAD;
45 int pthread_mutex_init(pthread_mutex_t *mutex,
46 const pthread_mutexattr_t *attr) {
47 static int (*pthread_mutex_initp)(pthread_mutex_t *mutex,
48 const pthread_mutexattr_t *attr);
50 BEFORE_ORIGINAL_SYNC(pthread_mutex_init, LIBPTHREAD);
52 ret = pthread_mutex_initp(mutex, attr);
54 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutex_init,
55 ret, mutex, SYNC_PTHREAD_MUTEX,
56 SYNC_API_OTHER, "pp", mutex, attr);
61 int pthread_mutex_destroy(pthread_mutex_t *mutex) {
62 static int (*pthread_mutex_destroyp)(pthread_mutex_t *mutex);
64 BEFORE_ORIGINAL_SYNC(pthread_mutex_destroy, LIBPTHREAD);
66 ret = pthread_mutex_destroyp(mutex);
68 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutex_destroy,
69 ret, mutex, SYNC_PTHREAD_MUTEX,
70 SYNC_API_OTHER, "p", mutex);
75 int real_pthread_mutex_lock(pthread_mutex_t *mutex) {
76 static int (*pthread_mutex_lockp)(pthread_mutex_t *mutex);
78 GET_REAL_FUNC(pthread_mutex_lock, LIBPTHREAD);
80 return pthread_mutex_lockp(mutex);
83 int pthread_mutex_lock(pthread_mutex_t *mutex) {
84 static int (*pthread_mutex_lockp)(pthread_mutex_t *mutex);
86 DECLARE_VARIABLE_STANDARD;
87 GET_REAL_FUNC(pthread_mutex_lock, LIBPTHREAD);
89 PRE_PROBEBLOCK_BEGIN();
92 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
93 API_ID_pthread_mutex_lock,
95 PACK_COMMON_END(0, 0, blockresult);
96 PACK_SYNC(mutex, SYNC_PTHREAD_MUTEX, SYNC_API_ACQUIRE_WAIT_START);
101 ret = pthread_mutex_lockp(mutex);
105 if(postBlockBegin(blockresult)) {
106 setProbePoint(&probeInfo);
109 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
110 API_ID_pthread_mutex_lock,
112 PACK_COMMON_END(ret, errno, blockresult);
113 PACK_SYNC(mutex, SYNC_PTHREAD_MUTEX, SYNC_API_ACQUIRE_WAIT_END);
122 int pthread_mutex_timedlock(pthread_mutex_t *mutex,
123 const struct timespec *abs_timeout) {
124 static int (*pthread_mutex_timedlockp)(pthread_mutex_t *mutex,
125 const struct timespec *abs_timeout);
127 DECLARE_VARIABLE_STANDARD;
128 GET_REAL_FUNC(pthread_mutex_timedlock, LIBPTHREAD);
130 PRE_PROBEBLOCK_BEGIN();
133 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
134 API_ID_pthread_mutex_timedlock,
135 "pp", mutex, abs_timeout);
136 PACK_COMMON_END(0, 0, blockresult);
137 PACK_SYNC(mutex, SYNC_PTHREAD_MUTEX, SYNC_API_ACQUIRE_WAIT_START);
140 PRE_PROBEBLOCK_END();
142 ret = pthread_mutex_timedlockp(mutex, abs_timeout);
146 if(postBlockBegin(blockresult)) {
147 setProbePoint(&probeInfo);
150 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
151 API_ID_pthread_mutex_timedlock,
152 "pp", mutex, abs_timeout);
153 PACK_COMMON_END(ret, errno, blockresult);
154 PACK_SYNC(mutex, SYNC_PTHREAD_MUTEX, SYNC_API_ACQUIRE_WAIT_END);
163 int pthread_mutex_trylock(pthread_mutex_t *mutex) {
164 static int (*pthread_mutex_trylockp)(pthread_mutex_t *mutex);
166 BEFORE_ORIGINAL_SYNC(pthread_mutex_trylock, LIBPTHREAD);
168 ret = pthread_mutex_trylockp(mutex);
170 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutex_trylock,
171 ret, mutex, SYNC_PTHREAD_MUTEX,
172 SYNC_API_TRY_ACQUIRE, "p", mutex);
177 int real_pthread_mutex_unlock(pthread_mutex_t *mutex) {
178 static int (*pthread_mutex_unlockp)(pthread_mutex_t *mutex);
180 GET_REAL_FUNC(pthread_mutex_unlock, LIBPTHREAD);
182 return pthread_mutex_unlockp(mutex);
185 int pthread_mutex_unlock(pthread_mutex_t *mutex) {
186 static int (*pthread_mutex_unlockp)(pthread_mutex_t *mutex);
188 BEFORE_ORIGINAL_SYNC(pthread_mutex_unlock, LIBPTHREAD);
190 ret = pthread_mutex_unlockp(mutex);
192 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutex_unlock,
193 ret, mutex, SYNC_PTHREAD_MUTEX,
194 SYNC_API_RELEASE, "p", mutex);
199 int pthread_mutexattr_init(pthread_mutexattr_t *attr) {
200 static int (*pthread_mutexattr_initp)(pthread_mutexattr_t *attr);
202 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_init, LIBPTHREAD);
204 ret = pthread_mutexattr_initp(attr);
206 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_init,
207 ret, 0, SYNC_PTHREAD_MUTEX,
208 SYNC_API_OTHER, "p", attr);
213 int pthread_mutexattr_destroy(pthread_mutexattr_t *attr) {
214 static int (*pthread_mutexattr_destroyp)(pthread_mutexattr_t *attr);
216 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_destroy, LIBPTHREAD);
218 ret = pthread_mutexattr_destroyp(attr);
220 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_destroy,
221 ret, 0, SYNC_PTHREAD_MUTEX,
222 SYNC_API_OTHER, "p", attr);
227 int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *attr,
229 static int (*pthread_mutexattr_getprioceilingp)(
230 const pthread_mutexattr_t *attr, int *prioceiling);
232 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_getprioceiling, LIBPTHREAD);
234 ret = pthread_mutexattr_getprioceilingp(attr, prioceiling);
236 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_getprioceiling,
237 ret, 0, SYNC_PTHREAD_MUTEX,
238 SYNC_API_OTHER, "pp", attr, prioceiling);
243 int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr,
245 static int (*pthread_mutexattr_setprioceilingp)(
246 pthread_mutexattr_t *attr, int prioceiling);
248 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_setprioceiling, LIBPTHREAD);
250 ret = pthread_mutexattr_setprioceilingp(attr, prioceiling);
252 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_setprioceiling,
253 ret, 0, SYNC_PTHREAD_MUTEX,
254 SYNC_API_OTHER, "pd", attr, prioceiling);
259 int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr,
261 static int (*pthread_mutexattr_getprotocolp)(
262 const pthread_mutexattr_t *attr, int *protocol);
264 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_getprotocol, LIBPTHREAD);
266 ret = pthread_mutexattr_getprotocolp(attr, protocol);
268 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_getprotocol,
269 ret, 0, SYNC_PTHREAD_MUTEX,
270 SYNC_API_OTHER, "pp", attr, protocol);
275 int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr,
277 static int (*pthread_mutexattr_setprotocolp)(
278 pthread_mutexattr_t *attr, int protocol);
280 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_setprotocol, LIBPTHREAD);
282 ret = pthread_mutexattr_setprotocolp(attr, protocol);
284 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_setprotocol,
285 ret, 0, SYNC_PTHREAD_MUTEX,
286 SYNC_API_OTHER, "pd", attr, protocol);
291 int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,
293 static int (*pthread_mutexattr_getpsharedp)(
294 const pthread_mutexattr_t *attr, int *pshared);
296 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_getpshared, LIBPTHREAD);
298 ret = pthread_mutexattr_getpsharedp(attr, pshared);
300 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_getpshared,
301 ret, 0, SYNC_PTHREAD_MUTEX,
302 SYNC_API_OTHER, "pp", attr, pshared);
307 int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,
309 static int (*pthread_mutexattr_setpsharedp)(
310 pthread_mutexattr_t *attr, int pshared);
312 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_setpshared, LIBPTHREAD);
314 ret = pthread_mutexattr_setpsharedp(attr, pshared);
316 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_setpshared,
317 ret, 0, SYNC_PTHREAD_MUTEX,
318 SYNC_API_OTHER, "pd", attr, pshared);
323 int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type) {
324 static int (*pthread_mutexattr_gettypep)(
325 const pthread_mutexattr_t *attr, int *type);
327 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_gettype, LIBPTHREAD);
329 ret = pthread_mutexattr_gettypep(attr, type);
331 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_gettype,
332 ret, 0, SYNC_PTHREAD_MUTEX,
333 SYNC_API_OTHER, "pp", attr, type);
338 int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type) {
339 static int (*pthread_mutexattr_settypep)(
340 pthread_mutexattr_t *attr, int type);
342 BEFORE_ORIGINAL_SYNC(pthread_mutexattr_settype, LIBPTHREAD);
344 ret = pthread_mutexattr_settypep(attr, type);
346 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_mutexattr_settype,
347 ret, 0, SYNC_PTHREAD_MUTEX,
348 SYNC_API_OTHER, "pd", attr, type);
354 int pthread_mutex_getprioceiling(const pthread_mutex_t *mutex,
356 int pthread_mutex_setprioceiling(pthread_mutex_t *mutex,
357 int prioceiling, int *old_ceiling);
360 int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) {
361 static int (*pthread_cond_initp)(pthread_cond_t *cond,
362 const pthread_condattr_t *attr);
364 BEFORE_ORIGINAL_SYNC(pthread_cond_init, LIBPTHREAD);
366 ret = pthread_cond_initp(cond, attr);
368 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_cond_init,
369 ret, cond, SYNC_PTHREAD_COND_VARIABLE,
370 SYNC_API_OTHER, "pp", cond, attr);
375 int pthread_cond_destroy(pthread_cond_t *cond) {
376 static int (*pthread_cond_destroyp)(pthread_cond_t *cond);
378 BEFORE_ORIGINAL_SYNC(pthread_cond_destroy, LIBPTHREAD);
380 ret = pthread_cond_destroyp(cond);
382 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_cond_destroy,
383 ret, cond, SYNC_PTHREAD_COND_VARIABLE,
384 SYNC_API_OTHER, "p", cond);
389 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) {
390 static int (*pthread_cond_waitp)(pthread_cond_t *cond,
391 pthread_mutex_t *mutex);
393 DECLARE_VARIABLE_STANDARD;
394 GET_REAL_FUNC(pthread_cond_wait, LIBPTHREAD);
396 PRE_PROBEBLOCK_BEGIN();
397 // send WAIT_START log
400 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
401 API_ID_pthread_cond_wait,
403 PACK_COMMON_END(0, 0, blockresult);
404 PACK_SYNC(cond, SYNC_PTHREAD_COND_VARIABLE, SYNC_API_COND_WAIT_START);
407 PRE_PROBEBLOCK_END();
409 ret = pthread_cond_waitp(cond, mutex);
413 if(postBlockBegin(blockresult)) {
414 setProbePoint(&probeInfo);
417 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
418 API_ID_pthread_cond_wait,
420 PACK_COMMON_END(ret, errno, blockresult);
421 PACK_SYNC(cond, SYNC_PTHREAD_COND_VARIABLE, SYNC_API_COND_WAIT_END);
430 int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
431 const struct timespec *abstime) {
432 static int (*pthread_cond_timedwaitp)(pthread_cond_t *cond,
433 pthread_mutex_t *mutex, const struct timespec *abstime);
435 DECLARE_VARIABLE_STANDARD;
436 GET_REAL_FUNC(pthread_cond_timedwait, LIBPTHREAD);
438 PRE_PROBEBLOCK_BEGIN();
439 // send WAIT_START log
442 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
443 API_ID_pthread_cond_timedwait,
444 "ppp", cond, mutex, abstime);
445 PACK_COMMON_END(0, 0, blockresult);
446 PACK_SYNC(cond, SYNC_PTHREAD_COND_VARIABLE, SYNC_API_COND_WAIT_START);
449 PRE_PROBEBLOCK_END();
451 ret = pthread_cond_timedwaitp(cond, mutex, abstime);
455 if(postBlockBegin(blockresult)) {
456 setProbePoint(&probeInfo);
459 PACK_COMMON_BEGIN(MSG_PROBE_SYNC,
460 API_ID_pthread_cond_timedwait,
461 "ppp", cond, mutex, abstime);
462 PACK_COMMON_END(ret, errno, blockresult);
463 PACK_SYNC(cond, SYNC_PTHREAD_COND_VARIABLE, SYNC_API_COND_WAIT_END);
472 int pthread_cond_signal(pthread_cond_t *cond) {
473 static int (*pthread_cond_signalp)(pthread_cond_t *cond);
475 BEFORE_ORIGINAL_SYNC(pthread_cond_signal, LIBPTHREAD);
477 ret = pthread_cond_signalp(cond);
479 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_cond_signal,
480 ret, cond, SYNC_PTHREAD_COND_VARIABLE,
481 SYNC_API_NOTIFY, "p", cond);
486 int pthread_cond_broadcast(pthread_cond_t *cond) {
487 static int (*pthread_cond_broadcastp)(pthread_cond_t *cond);
489 BEFORE_ORIGINAL_SYNC(pthread_cond_broadcast, LIBPTHREAD);
491 ret = pthread_cond_broadcastp(cond);
493 AFTER_PACK_ORIGINAL_SYNC(API_ID_pthread_cond_broadcast,
494 ret, cond, SYNC_PTHREAD_COND_VARIABLE,
495 SYNC_API_NOTIFY_ALL, "p", cond);
501 int pthread_condattr_init(pthread_condattr_t *attr);
502 int pthread_condattr_destroy(pthread_condattr_t *attr);
503 int pthread_condattr_getclock(const pthread_condattr_t *attr,
504 clockid_t *clock_id);
505 int pthread_condattr_setclock(pthread_condattr_t *attr,
507 int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared);
508 int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
512 int pthread_rwlock_init(pthread_rwlock_t *rwlock,
513 const pthread_rwlockattr_t *attr);
514 int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
515 int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
516 int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
517 int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock,
518 const struct timespec *abs_timeout);
519 int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock,
520 const struct timespec *abs_timeout);
521 int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
522 int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
523 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
524 int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
525 int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
526 int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr,
528 int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,
531 int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
532 int pthread_spin_destroy(pthread_spinlock_t *lock);
533 int pthread_spin_lock(pthread_spinlock_t *lock);
534 int pthread_spin_trylock(pthread_spinlock_t *lock);
535 int pthread_spin_unlock(pthread_spinlock_t *lock);
537 int pthread_barrier_init(pthread_barrier_t *barrier,
538 const pthread_barrierattr_t *attr, unsigned int count);
539 int pthread_barrier_destroy(pthread_barrier_t *barrier);
540 int pthread_barrier_wait(pthread_barrier_t *barrier);
541 int pthread_barrierattr_init(pthread_barrierattr_t *attr);
542 int pthread_barrierattr_destroy(pthread_barrierattr_t *attr);
543 int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr,
545 int pthread_barrierattr_setpshared(pthread_barrierattr_t,