diff --git a/libpthread/Makefile b/libpthread/Makefile
index 89aee0a0..4805d5de 100644
--- a/libpthread/Makefile
+++ b/libpthread/Makefile
@@ -14,6 +14,7 @@ OBJS=\
pthread_equal.o \
pthread_initialize.o \
pthread_mutex_lock.o \
+pthread_mutex_trylock.o \
pthread_mutex_unlock.o \
pthread_self.o \
diff --git a/libpthread/include/pthread.h b/libpthread/include/pthread.h
index 8475fbde..fec3d7ef 100644
--- a/libpthread/include/pthread.h
+++ b/libpthread/include/pthread.h
@@ -210,7 +210,7 @@ int pthread_equal(pthread_t, pthread_t);
int pthread_mutex_lock(pthread_mutex_t*);
/* TODO: pthread_mutex_setprioceiling */
/* TODO: pthread_mutex_timedlock */
-/* TODO: pthread_mutex_trylock */
+int pthread_mutex_trylock(pthread_mutex_t*);
int pthread_mutex_unlock(pthread_mutex_t*);
/* TODO: pthread_mutexattr_destroy */
/* TODO: pthread_mutexattr_getprioceiling */
diff --git a/libpthread/pthread_mutex_trylock.c++ b/libpthread/pthread_mutex_trylock.c++
new file mode 100644
index 00000000..062de9ce
--- /dev/null
+++ b/libpthread/pthread_mutex_trylock.c++
@@ -0,0 +1,43 @@
+/*******************************************************************************
+
+ Copyright(C) Jonas 'Sortie' Termansen 2013, 2014.
+
+ This file is part of Sortix libpthread.
+
+ Sortix libpthread is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by the
+ Free Software Foundation, either version 3 of the License, or (at your
+ option) any later version.
+
+ Sortix libpthread is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with Sortix libpthread. If not, see .
+
+ pthread_mutex_trylock.c++
+ Attempts to lock a mutex.
+
+*******************************************************************************/
+
+#include
+#include
+
+static const unsigned long UNLOCKED_VALUE = 0;
+static const unsigned long LOCKED_VALUE = 1;
+
+extern "C" int pthread_mutex_trylock(pthread_mutex_t* mutex)
+{
+ if ( !__sync_bool_compare_and_swap(&mutex->lock, UNLOCKED_VALUE, LOCKED_VALUE) )
+ {
+ if ( mutex->type == PTHREAD_MUTEX_RECURSIVE &&
+ (pthread_t) mutex->owner == pthread_self() )
+ return mutex->recursion++, 0;
+ return errno = EBUSY;
+ }
+ mutex->owner = (unsigned long) pthread_self();
+ mutex->recursion = 0;
+ return 0;
+}