00001
00007 #include <pthread.h>
00008 #include <core/tx.h>
00009 #include <core/config.h>
00010 #include <core/txdesc.h>
00011 #include <misc/debug.h>
00012 #include <misc/errno.h>
00013 #include <xcalls/xcalls.h>
00014
00015 int
00016 XCALL_DEF(x_pthread_mutex_init)(pthread_mutex_t *mutex,
00017 const pthread_mutexattr_t *attr,
00018 int *result)
00019 {
00020 txc_tx_t *txd;
00021 int ret;
00022 int local_result = 0;
00023
00024 txd = txc_tx_get_txd();
00025
00026 switch(txc_tx_get_xactstate(txd)) {
00027 case TXC_XACTSTATE_TRANSACTIONAL_RETRYABLE:
00028 case TXC_XACTSTATE_TRANSACTIONAL_IRREVOCABLE:
00029 case TXC_XACTSTATE_NONTRANSACTIONAL:
00030 if ((ret = pthread_mutex_init(mutex, attr)) != 0) {
00031 local_result = ret;
00032 goto done;
00033 }
00034 }
00035 done:
00036 if (result) {
00037 *result = local_result;
00038 }
00039 return ret;
00040 }