summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/freechain.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/freechain.c')
-rw-r--r--cpukit/score/src/freechain.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/cpukit/score/src/freechain.c b/cpukit/score/src/freechain.c
new file mode 100644
index 0000000000..101a11e001
--- /dev/null
+++ b/cpukit/score/src/freechain.c
@@ -0,0 +1,47 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreFreechain
+ *
+ * @brief Freechain Handler Implementation
+ */
+
+/*
+ * Copyright (c) 2013 Gedare Bloom.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <rtems/score/freechain.h>
+#include <rtems/score/chainimpl.h>
+
+void _Freechain_Initialize(
+ Freechain_Control *freechain,
+ Freechain_Extend extend
+)
+{
+ _Chain_Initialize_empty( &freechain->Freechain );
+ freechain->extend = extend;
+}
+
+void *_Freechain_Get(Freechain_Control *freechain)
+{
+ if ( _Chain_Is_empty( &freechain->Freechain ) ) {
+ if ( !( *freechain->extend )( freechain ) ) {
+ return NULL;
+ }
+ }
+
+ return _Chain_Get_first_unprotected( &freechain->Freechain );
+}
+
+void _Freechain_Put( Freechain_Control *freechain, void *node )
+{
+ _Chain_Prepend_unprotected( &freechain->Freechain, node );
+}