summaryrefslogtreecommitdiffstats
path: root/src/sbefw/core/sbeTimerSvc.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbefw/core/sbeTimerSvc.C')
-rw-r--r--src/sbefw/core/sbeTimerSvc.C102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/sbefw/core/sbeTimerSvc.C b/src/sbefw/core/sbeTimerSvc.C
new file mode 100644
index 00000000..eea43b17
--- /dev/null
+++ b/src/sbefw/core/sbeTimerSvc.C
@@ -0,0 +1,102 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/sbefw/core/sbeTimerSvc.C $ */
+/* */
+/* OpenPOWER sbe Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2015,2017 */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+/*
+ * @file: src/sbefw/sbeTimerSvc.C
+ *
+ * @brief This file contains the SBE timer service
+ *
+ */
+
+#include "sbetrace.H"
+#include "sbeTimerSvc.H"
+#include "sbe_sp_intf.H"
+#include "pk.h"
+
+uint32_t timerService::startTimer(uint32_t i_time, PkTimerCallback i_callBack )
+{
+ #define SBE_FUNC "timerService::startTimer "
+ uint32_t l_rc = SBE_SEC_OPERATION_SUCCESSFUL;
+ do
+ {
+ int l_pkRc = 0;
+ if( !init )
+ {
+ l_pkRc = pk_timer_create(&fixedTimer, i_callBack, NULL);
+ if(l_pkRc)
+ {
+ SBE_ERROR(SBE_FUNC" Pk Timer Create failed, RC=[%d]", l_pkRc);
+ l_rc = SBE_SEC_OS_FAILURE;
+ break;
+ }
+ init = true;
+ }
+ if( isActive() )
+ {
+ SBE_ERROR(SBE_FUNC" Timer already started");
+ l_rc = SBE_SEC_TIMER_ALREADY_STARTED;
+ break;
+ }
+ // Schedule the timer
+ l_pkRc = pk_timer_schedule(&fixedTimer,
+ PK_MILLISECONDS((uint32_t)i_time));
+ if(l_pkRc)
+ {
+ SBE_ERROR(SBE_FUNC" Pk Timer Schedule failed, RC=[%d]", l_pkRc);
+ l_rc = SBE_SEC_OS_FAILURE;
+ break;
+ }
+ } while(0);
+ return l_rc;
+ #undef SBE_FUNC
+}
+
+uint32_t timerService::stopTimer( )
+{
+ #define SBE_FUNC "timerService::stopTimer "
+ uint32_t l_rc = SBE_SEC_OPERATION_SUCCESSFUL;
+ PkMachineContext ctx;
+ do
+ {
+ // The critical section enter/exit set is done to ensure
+ // pk_timer_cancel operations are non-interrupible.
+ pk_critical_section_enter(&ctx);
+ if( !isActive() )
+ {
+ SBE_INFO(SBE_FUNC" Timer is not running");
+ break;
+ }
+ // Cancel the timer
+ int l_pkRc = pk_timer_cancel(&fixedTimer );
+ if(l_pkRc)
+ {
+ SBE_ERROR(SBE_FUNC" Pk Timer cancel failed, RC=[%d]", l_pkRc);
+ l_rc = SBE_SEC_OS_FAILURE;
+ break;
+ }
+ } while(0);
+ pk_critical_section_exit(&ctx);
+ return l_rc;
+ #undef SBE_FUNC
+}
+
OpenPOWER on IntegriCloud