summaryrefslogtreecommitdiffstats
path: root/src/usr/trace/bufferpage.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/trace/bufferpage.C')
-rw-r--r--src/usr/trace/bufferpage.C79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/usr/trace/bufferpage.C b/src/usr/trace/bufferpage.C
new file mode 100644
index 000000000..b4e655980
--- /dev/null
+++ b/src/usr/trace/bufferpage.C
@@ -0,0 +1,79 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/trace/bufferpage.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2012 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+#include "bufferpage.H"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <kernel/pagemgr.H>
+
+namespace TRACE
+{
+
+ Entry* BufferPage::claimEntry(size_t i_size)
+ {
+ uint64_t l_usedSize = this->usedSize;
+
+ // Verify there is enough space.
+ while ((usedSize + i_size) < (PAGESIZE - sizeof(BufferPage)))
+ {
+ // Atomically attempt to claim i_size worth.
+ uint64_t newSize = l_usedSize + i_size;
+ if (!__sync_bool_compare_and_swap(&this->usedSize,
+ l_usedSize,
+ newSize))
+ {
+ // Failed race to atomically update.
+ // Re-read size, try again.
+ l_usedSize = this->usedSize;
+ continue;
+ }
+
+ // Successful at claiming an entry, return pointer to it.
+ return reinterpret_cast<Entry*>(&this->data[0] + l_usedSize);
+ }
+
+ return NULL;
+ }
+
+ BufferPage* BufferPage::allocate(bool i_common)
+ {
+ BufferPage* page = NULL;
+
+ page = reinterpret_cast<BufferPage*>(PageManager::allocatePage());
+ memset(page, '\0', PAGESIZE);
+
+ if (i_common)
+ {
+ page->commonPage = 1;
+ }
+
+ return page;
+ }
+
+ void BufferPage::deallocate(BufferPage* i_page)
+ {
+ PageManager::freePage(i_page);
+ }
+
+}
OpenPOWER on IntegriCloud