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 }