Add PTHREAD_PRIO_PROTECT to sm mutexes

- rename mutexes from generic name '_mutex'
- create common util functions for initializing and destroying mutexes
- add mutex initialize/finalize functions
  and run them in sm_main_process_initialize
- update copyright info to 2023

Test plan:

PASS - AIO-DX: iso install
PASS - AIO-DX: verify ha swact
PASS - AIO-DX: failover swact test

PASS - AIO-DX: run pi_stress (rt-tests)
               to confirm priority inheritance POSIX attribute is working
-------------------------------------------------------------------
sysadmin@localhost:~$ sudo pi_stress --uniprocessor --duration=10s
Starting PI Stress Test
Number of thread groups: 3
Duration of test run: 10 seconds
Number of inversions per group: unlimited
     Admin thread SCHED_FIFO priority 4
3 groups of 3 threads will be created
      High thread SCHED_FIFO priority 3
       Med thread SCHED_FIFO priority 2
       Low thread SCHED_FIFO priority 1
Current Inversions: 992034
Stopping test
Total inversion performed: 992038
Test Duration: 0 days, 0 hours, 0 minutes, 11 seconds
-------------------------------------------------------------------

PASS - AIO-DX: valgrind helgrind
                * test for inconsistence lock ordering
                * test race conditions
                  [ detected outside scope of jira ]
                * test for deadlocks

Task: 47503
Story: 2010609

Signed-off-by: Kyale, Eliud <Eliud.Kyale@windriver.com>
Change-Id: Ic77f08ca7c3a687b1cc219ac9cba5711979206e8
This commit is contained in:
Kyale, Eliud 2023-02-16 09:24:06 -05:00 committed by Eliud Kyale
parent 48ec1759ed
commit b65eb7b2f6
29 changed files with 547 additions and 239 deletions

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -25,6 +25,7 @@
#include "sm_debug.h" #include "sm_debug.h"
#include "sm_selobj.h" #include "sm_selobj.h"
#include "sm_netlink.h" #include "sm_netlink.h"
#include "sm_util_types.h"
typedef struct typedef struct
{ {
@ -36,9 +37,19 @@ typedef struct
SmHwCallbacksT callbacks; SmHwCallbacksT callbacks;
} SmHwThreadInfoT; } SmHwThreadInfoT;
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t hw_mutex;
static SmHwThreadInfoT _threads[SM_THREADS_MAX]; static SmHwThreadInfoT _threads[SM_THREADS_MAX];
SmErrorT sm_hw_mutex_initialize ( void )
{
return sm_mutex_initialize(&hw_mutex, false);
}
SmErrorT sm_hw_mutex_finalize ( void )
{
return sm_mutex_finalize(&hw_mutex);
}
// **************************************************************************** // ****************************************************************************
// Hardware - Find Thread Info // Hardware - Find Thread Info
// =========================== // ===========================
@ -270,7 +281,7 @@ SmErrorT sm_hw_get_if_state( const char if_name[], bool* enabled )
SmErrorT sm_hw_get_all_qdisc_async( void ) SmErrorT sm_hw_get_all_qdisc_async( void )
{ {
struct nlmsghdr hdr; struct nlmsghdr hdr;
struct tcmsg tc; struct tcmsg tc;
SmHwThreadInfoT* thread_info; SmHwThreadInfoT* thread_info;
SmErrorT error; SmErrorT error;
@ -361,7 +372,7 @@ static void sm_hw_netlink_if_msg_dispatch( SmHwThreadInfoT* thread_info,
return; return;
} }
snprintf( if_change_data.interface_name, snprintf( if_change_data.interface_name,
sizeof(if_change_data.interface_name), "%s", sizeof(if_change_data.interface_name), "%s",
(char*) RTA_DATA( if_msg_attr[IFLA_IFNAME] ) ); (char*) RTA_DATA( if_msg_attr[IFLA_IFNAME] ) );
@ -601,7 +612,7 @@ static void sm_hw_netlink_qdisc_msg_dispatch( SmHwThreadInfoT* thread_info,
// **************************************************************************** // ****************************************************************************
// Hardware - Netlink Message Dispatch // Hardware - Netlink Message Dispatch
// =================================== // ===================================
static void sm_hw_netlink_msg_dispatch( int socket_fd, static void sm_hw_netlink_msg_dispatch( int socket_fd,
struct sockaddr_nl* address, struct nlmsghdr* payload, struct sockaddr_nl* address, struct nlmsghdr* payload,
void* invocation_data ) void* invocation_data )
{ {
@ -673,7 +684,7 @@ SmErrorT sm_hw_initialize( SmHwCallbacksT* callbacks )
SmHwThreadInfoT* thread_info = NULL; SmHwThreadInfoT* thread_info = NULL;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &hw_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -727,7 +738,7 @@ SmErrorT sm_hw_initialize( SmHwCallbacksT* callbacks )
if( NULL != callbacks ) if( NULL != callbacks )
{ {
error = sm_netlink_open( &(thread_info->netlink_receive_socket), error = sm_netlink_open( &(thread_info->netlink_receive_socket),
RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_LINK | RTMGRP_IPV4_IFADDR |
RTMGRP_IPV6_IFADDR | RTMGRP_TC ); RTMGRP_IPV6_IFADDR | RTMGRP_TC );
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -757,7 +768,7 @@ SmErrorT sm_hw_initialize( SmHwCallbacksT* callbacks )
thread_info->thread_id = pthread_self(); thread_info->thread_id = pthread_self();
thread_info->inuse = true; thread_info->inuse = true;
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &hw_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -766,7 +777,7 @@ SmErrorT sm_hw_initialize( SmHwCallbacksT* callbacks )
return( SM_OKAY ); return( SM_OKAY );
ERROR: ERROR:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &hw_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -784,7 +795,7 @@ SmErrorT sm_hw_finalize( void )
SmHwThreadInfoT* thread_info; SmHwThreadInfoT* thread_info;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &hw_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -817,7 +828,7 @@ SmErrorT sm_hw_finalize( void )
} }
DONE: DONE:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &hw_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -126,6 +126,18 @@ extern SmErrorT sm_hw_initialize( SmHwCallbacksT* callbacks );
extern SmErrorT sm_hw_finalize( void ); extern SmErrorT sm_hw_finalize( void );
// *************************************************************************** // ***************************************************************************
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_hw_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_hw_mutex_finalize ( void );
// ****************************************************************************
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -20,10 +20,11 @@
#include "sm_types.h" #include "sm_types.h"
#include "sm_debug.h" #include "sm_debug.h"
#include "sm_list.h" #include "sm_list.h"
#include "sm_util_types.h"
#define SM_SEL_OBJ_ENTRY_VALID 0xFDFDFDFD #define SM_SEL_OBJ_ENTRY_VALID 0xFDFDFDFD
typedef struct typedef struct
{ {
uint32_t valid; uint32_t valid;
int selobj; int selobj;
@ -40,9 +41,19 @@ typedef struct
SmSelObjSelectEntryT selobjs[SM_THREAD_SELECT_OBJS_MAX]; SmSelObjSelectEntryT selobjs[SM_THREAD_SELECT_OBJS_MAX];
} SmSelObjThreadInfoT; } SmSelObjThreadInfoT;
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t selobj_mutex;
static SmSelObjThreadInfoT _threads[SM_THREADS_MAX]; static SmSelObjThreadInfoT _threads[SM_THREADS_MAX];
SmErrorT sm_selobj_mutex_initialize ( void )
{
return sm_mutex_initialize(&selobj_mutex, false);
}
SmErrorT sm_selobj_mutex_finalize ( void )
{
return sm_mutex_finalize(&selobj_mutex);
}
// **************************************************************************** // ****************************************************************************
// Selection Object - Find Thread Info // Selection Object - Find Thread Info
// =================================== // ===================================
@ -85,7 +96,7 @@ static SmSelObjSelectEntryT* sm_selobj_find( SmSelObjThreadInfoT* thread_info,
} }
} }
} }
return( NULL ); return( NULL );
} }
// **************************************************************************** // ****************************************************************************
@ -170,7 +181,7 @@ SmErrorT sm_selobj_deregister( int selobj )
thread_info->last_selobj = entry->selobj; thread_info->last_selobj = entry->selobj;
} }
} }
} }
} }
return( SM_OKAY ); return( SM_OKAY );
@ -198,11 +209,11 @@ SmErrorT sm_selobj_dispatch( unsigned int timeout_in_ms )
num_fds = thread_info->last_selobj; num_fds = thread_info->last_selobj;
fds = thread_info->selobjs_set; fds = thread_info->selobjs_set;
tv.tv_sec = timeout_in_ms / 1000; tv.tv_sec = timeout_in_ms / 1000;
tv.tv_usec = (timeout_in_ms % 1000) * 1000; tv.tv_usec = (timeout_in_ms % 1000) * 1000;
result = select( num_fds+1, &fds, NULL, NULL, &tv ); result = select( num_fds+1, &fds, NULL, NULL, &tv );
if( 0 > result ) if( 0 > result )
{ {
if( errno == EINTR ) if( errno == EINTR )
@ -246,7 +257,7 @@ SmErrorT sm_selobj_initialize( void )
{ {
SmSelObjThreadInfoT* thread_info = NULL; SmSelObjThreadInfoT* thread_info = NULL;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &selobj_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -260,21 +271,21 @@ SmErrorT sm_selobj_initialize( void )
thread_info = &(_threads[thread_i]); thread_info = &(_threads[thread_i]);
break; break;
} }
} }
if( NULL == thread_info ) if( NULL == thread_info )
{ {
DPRINTFE( "Failed to allocate thread information." ); DPRINTFE( "Failed to allocate thread information." );
goto ERROR; goto ERROR;
} }
memset( thread_info, 0, sizeof(SmSelObjThreadInfoT) ); memset( thread_info, 0, sizeof(SmSelObjThreadInfoT) );
thread_info->inuse = true; thread_info->inuse = true;
thread_info->thread_id = pthread_self(); thread_info->thread_id = pthread_self();
FD_ZERO( &(thread_info->selobjs_set) ); FD_ZERO( &(thread_info->selobjs_set) );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &selobj_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -282,7 +293,7 @@ SmErrorT sm_selobj_initialize( void )
return( SM_OKAY ); return( SM_OKAY );
ERROR: ERROR:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &selobj_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -299,7 +310,7 @@ SmErrorT sm_selobj_finalize( void )
{ {
SmSelObjThreadInfoT* thread_info; SmSelObjThreadInfoT* thread_info;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &selobj_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -315,7 +326,7 @@ SmErrorT sm_selobj_finalize( void )
memset( thread_info, 0, sizeof(SmSelObjThreadInfoT) ); memset( thread_info, 0, sizeof(SmSelObjThreadInfoT) );
FD_ZERO( &(thread_info->selobjs_set) ); FD_ZERO( &(thread_info->selobjs_set) );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &selobj_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -18,6 +18,18 @@ extern "C" {
typedef void (*SmSelObjCallbackT) (int selobj, int64_t user_data); typedef void (*SmSelObjCallbackT) (int selobj, int64_t user_data);
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_selobj_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_selobj_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Selection Object - Register // Selection Object - Register
// =========================== // ===========================

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -14,6 +14,7 @@
#include "sm_types.h" #include "sm_types.h"
#include "sm_debug.h" #include "sm_debug.h"
#include "sm_time.h" #include "sm_time.h"
#include "sm_util_types.h"
#define SM_THREAD_HEALTH_CHECK_INTERVAL_IN_MS 1000 #define SM_THREAD_HEALTH_CHECK_INTERVAL_IN_MS 1000
@ -23,11 +24,21 @@ typedef struct
char thread_name[SM_THREAD_NAME_MAX_CHAR]; char thread_name[SM_THREAD_NAME_MAX_CHAR];
long warn_after_elapsed_ms; long warn_after_elapsed_ms;
long fail_after_elapsed_ms; long fail_after_elapsed_ms;
SmTimeT last_health_update; SmTimeT last_health_update;
} SmThreadHealthT; } SmThreadHealthT;
static SmThreadHealthT _threads[SM_THREADS_MAX]; static SmThreadHealthT _threads[SM_THREADS_MAX];
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t thread_health_mutex;
SmErrorT sm_thread_health_mutex_initialize ( void )
{
return sm_mutex_initialize(&thread_health_mutex, false);
}
SmErrorT sm_thread_health_mutex_finalize ( void)
{
return sm_mutex_finalize(&thread_health_mutex);
}
// **************************************************************************** // ****************************************************************************
// Thread Health - Register // Thread Health - Register
@ -35,7 +46,7 @@ static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
SmErrorT sm_thread_health_register( const char thread_name[], SmErrorT sm_thread_health_register( const char thread_name[],
long warn_after_elapsed_ms, long fail_after_elapsed_ms ) long warn_after_elapsed_ms, long fail_after_elapsed_ms )
{ {
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -60,7 +71,7 @@ SmErrorT sm_thread_health_register( const char thread_name[],
} }
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -75,7 +86,7 @@ SmErrorT sm_thread_health_register( const char thread_name[],
// ========================== // ==========================
SmErrorT sm_thread_health_deregister( const char thread_name[] ) SmErrorT sm_thread_health_deregister( const char thread_name[] )
{ {
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -98,7 +109,7 @@ SmErrorT sm_thread_health_deregister( const char thread_name[] )
} }
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -113,7 +124,7 @@ SmErrorT sm_thread_health_deregister( const char thread_name[] )
// ====================== // ======================
SmErrorT sm_thread_health_update( const char thread_name[] ) SmErrorT sm_thread_health_update( const char thread_name[] )
{ {
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -136,7 +147,7 @@ SmErrorT sm_thread_health_update( const char thread_name[] )
} }
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -168,7 +179,7 @@ SmErrorT sm_thread_health_check( bool* healthy )
sm_time_get( &last_check ); sm_time_get( &last_check );
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -199,7 +210,7 @@ SmErrorT sm_thread_health_check( bool* healthy )
} }
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &thread_health_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -14,6 +14,18 @@
extern "C" { extern "C" {
#endif #endif
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_thread_health_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_thread_health_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Thread Health - Register // Thread Health - Register
// ======================== // ========================

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -23,6 +23,7 @@
#include "sm_time.h" #include "sm_time.h"
#include "sm_debug.h" #include "sm_debug.h"
#include "sm_selobj.h" #include "sm_selobj.h"
#include "sm_util_types.h"
#define SM_TIMER_ENTRY_INUSE 0xFDFDFDFD #define SM_TIMER_ENTRY_INUSE 0xFDFDFDFD
#define SM_MAX_TIMERS 512 #define SM_MAX_TIMERS 512
@ -70,9 +71,19 @@ typedef struct
static SmTimerIdT _next_timer_id = 1; static SmTimerIdT _next_timer_id = 1;
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t timer_mutex;
static SmTimerThreadInfoT _threads[SM_THREADS_MAX]; static SmTimerThreadInfoT _threads[SM_THREADS_MAX];
SmErrorT sm_timer_mutex_initialize ( void )
{
return sm_mutex_initialize(&timer_mutex, false);
}
SmErrorT sm_timer_mutex_finalize ( void )
{
return sm_mutex_finalize(&timer_mutex);
}
// **************************************************************************** // ****************************************************************************
// Timer - Find Thread Info // Timer - Find Thread Info
// ======================== // ========================
@ -225,7 +236,7 @@ static SmErrorT sm_timer_schedule( SmTimerThreadInfoT* thread_info )
for( timer_i=0; SM_MAX_TIMERS > timer_i; ++timer_i ) for( timer_i=0; SM_MAX_TIMERS > timer_i; ++timer_i )
{ {
timer_entry = &(thread_info->timers[timer_i]); timer_entry = &(thread_info->timers[timer_i]);
if( SM_TIMER_ENTRY_INUSE == timer_entry->inuse ) if( SM_TIMER_ENTRY_INUSE == timer_entry->inuse )
{ {
ms_expired = sm_time_get_elapsed_ms( &timer_entry->arm_timestamp ); ms_expired = sm_time_get_elapsed_ms( &timer_entry->arm_timestamp );
@ -307,7 +318,7 @@ static void sm_timer_dispatch( int selobj, int64_t user_data )
DPRINTFE( "Failed to find thread information." ); DPRINTFE( "Failed to find thread information." );
return; return;
} }
ms_expired = sm_time_get_elapsed_ms( &thread_info->sched_timestamp ); ms_expired = sm_time_get_elapsed_ms( &thread_info->sched_timestamp );
if( ms_expired >= (thread_info->tick_interval_in_ms*SM_MAX_TICK_INTERVALS) ) if( ms_expired >= (thread_info->tick_interval_in_ms*SM_MAX_TICK_INTERVALS) )
{ {
@ -342,13 +353,13 @@ static void sm_timer_dispatch( int selobj, int64_t user_data )
if( SM_TIMER_ENTRY_INUSE == timer_entry->inuse ) if( SM_TIMER_ENTRY_INUSE == timer_entry->inuse )
{ {
ms_expired = sm_time_get_elapsed_ms( &timer_entry->arm_timestamp ); ms_expired = sm_time_get_elapsed_ms( &timer_entry->arm_timestamp );
if( ms_expired >= timer_entry->ms_interval ) if( ms_expired >= timer_entry->ms_interval )
{ {
bool rearm; bool rearm;
uint64_t timer_instance = timer_entry->timer_instance; uint64_t timer_instance = timer_entry->timer_instance;
SmTimerHistoryEntryT* history_entry; SmTimerHistoryEntryT* history_entry;
history_entry = &(history[total_timers_fired]); history_entry = &(history[total_timers_fired]);
history_entry->inuse = SM_TIMER_ENTRY_INUSE; history_entry->inuse = SM_TIMER_ENTRY_INUSE;
@ -542,7 +553,7 @@ SmErrorT sm_timer_initialize( unsigned int tick_interval_in_ms )
SmTimerThreadInfoT* thread_info = NULL; SmTimerThreadInfoT* thread_info = NULL;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &timer_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -577,7 +588,7 @@ SmErrorT sm_timer_initialize( unsigned int tick_interval_in_ms )
if( 0 > thread_info->tick_timer_fd ) if( 0 > thread_info->tick_timer_fd )
{ {
DPRINTFE( "Failed to create tick timer, error=%s.", DPRINTFE( "Failed to create tick timer, error=%s.",
strerror( errno ) ); strerror( errno ) );
goto ERROR; goto ERROR;
} }
@ -610,7 +621,7 @@ SmErrorT sm_timer_initialize( unsigned int tick_interval_in_ms )
goto ERROR; goto ERROR;
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &timer_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -619,7 +630,7 @@ SmErrorT sm_timer_initialize( unsigned int tick_interval_in_ms )
return( SM_OKAY ); return( SM_OKAY );
ERROR: ERROR:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &timer_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -637,7 +648,7 @@ SmErrorT sm_timer_finalize( void )
SmTimerThreadInfoT* thread_info; SmTimerThreadInfoT* thread_info;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &timer_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -665,7 +676,7 @@ SmErrorT sm_timer_finalize( void )
} }
DONE: DONE:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &timer_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -18,12 +18,24 @@
extern "C" { extern "C" {
#endif #endif
#define SM_TIMER_ID_INVALID -1 #define SM_TIMER_ID_INVALID -1
typedef int64_t SmTimerIdT; typedef int64_t SmTimerIdT;
typedef bool (*SmTimerCallbackT) (SmTimerIdT timer_id, int64_t user_data ); typedef bool (*SmTimerCallbackT) (SmTimerIdT timer_id, int64_t user_data );
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_timer_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_timer_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Timer - Register // Timer - Register
// ================ // ================

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -25,6 +25,7 @@
#include "sm_types.h" #include "sm_types.h"
#include "sm_debug.h" #include "sm_debug.h"
#include "sm_trap_thread.h" #include "sm_trap_thread.h"
#include "sm_util_types.h"
typedef struct typedef struct
{ {
@ -37,7 +38,7 @@ static int _trap_fd = -1;
static int _process_id; static int _process_id;
static char _process_name[SM_PROCESS_NAME_MAX_CHAR]; static char _process_name[SM_PROCESS_NAME_MAX_CHAR];
static SmTrapThreadInfoT _threads[SM_THREADS_MAX]; static SmTrapThreadInfoT _threads[SM_THREADS_MAX];
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t trap_mutex;
static pthread_spinlock_t _thread_spinlock; static pthread_spinlock_t _thread_spinlock;
// *************************************************************************** // ***************************************************************************
@ -158,12 +159,12 @@ void sm_trap_set_thread_info( void )
int thread_id; int thread_id;
SmTrapThreadInfoT* info; SmTrapThreadInfoT* info;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &trap_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return; return;
} }
thread_id = (int) syscall( SYS_gettid ); thread_id = (int) syscall( SYS_gettid );
info = sm_trap_find_thread_info( thread_id ); info = sm_trap_find_thread_info( thread_id );
@ -185,7 +186,7 @@ void sm_trap_set_thread_info( void )
} }
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &trap_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return; return;
@ -207,6 +208,8 @@ SmErrorT sm_trap_initialize( const char process_name[] )
int dummy_trace_count; int dummy_trace_count;
SmErrorT error = SM_FAILED; SmErrorT error = SM_FAILED;
sm_mutex_initialize(&trap_mutex, false);
_process_id = (int) getpid(); _process_id = (int) getpid();
snprintf( _process_name, sizeof(_process_name), "%s", process_name ); snprintf( _process_name, sizeof(_process_name), "%s", process_name );
@ -258,9 +261,9 @@ SmErrorT sm_trap_initialize( const char process_name[] )
printf( "Failed to set flags, error=%s.\n", strerror( errno ) ); printf( "Failed to set flags, error=%s.\n", strerror( errno ) );
error = SM_FAILED; error = SM_FAILED;
goto ERROR; goto ERROR;
} }
} }
error = sm_trap_thread_start( trap_fds[0] ); error = sm_trap_thread_start( trap_fds[0] );
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -312,9 +315,7 @@ ERROR:
// =============== // ===============
SmErrorT sm_trap_finalize( void ) SmErrorT sm_trap_finalize( void )
{ {
SmErrorT error; SmErrorT error = sm_trap_thread_stop();
error = sm_trap_thread_stop();
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
printf( "Failed to stop trap thread, error=%s.\n", printf( "Failed to stop trap thread, error=%s.\n",
@ -327,6 +328,8 @@ SmErrorT sm_trap_finalize( void )
_trap_fd = -1; _trap_fd = -1;
} }
sm_mutex_finalize(&trap_mutex);
return( SM_OKAY ); return( SM_OKAY );
} }
// *************************************************************************** // ***************************************************************************

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2018 Wind River Systems, Inc. // Copyright (c) 2018,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -8,10 +8,57 @@
#include "sm_util_types.h" #include "sm_util_types.h"
#include "sm_debug.h" #include "sm_debug.h"
SmErrorT sm_mutex_initialize ( pthread_mutex_t* mutex, bool mutex_recursive )
{
SmErrorT error = SM_OKAY;
pthread_mutexattr_t attr;
if(mutex)
{
pthread_mutexattr_init(&attr);
if(mutex_recursive)
{
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
}
pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_INHERIT);
int res = pthread_mutex_init(mutex, &attr);
if( res != 0 )
{
DPRINTFE("Failed to initialize mutex, error %d", res);
error = SM_FAILED;
}
}
else
{
DPRINTFE("Failed to initialize mutex, NULL ptr");
error = SM_FAILED;
}
return error;
}
SmErrorT sm_mutex_finalize ( pthread_mutex_t* mutex )
{
SmErrorT error = SM_OKAY;
if(mutex)
{
int res = pthread_mutex_destroy(mutex);
if( res != 0 )
{
DPRINTFE("Failed to destroy mutex, error %d", res);
error = SM_FAILED;
}
}
else
{
DPRINTFE("Failed to destroy mutex, NULL ptr");
error = SM_FAILED;
}
return error;
}
mutex_holder::mutex_holder(pthread_mutex_t* mutex) mutex_holder::mutex_holder(pthread_mutex_t* mutex)
{ {
this->_mutex = mutex; this->m_mutex = mutex;
if( 0 != pthread_mutex_lock( this->_mutex ) ) if( 0 != pthread_mutex_lock( this->m_mutex ) )
{ {
DPRINTFE("Critical error, failed to obtain the mutex. Quit..."); DPRINTFE("Critical error, failed to obtain the mutex. Quit...");
abort(); abort();
@ -20,7 +67,7 @@ mutex_holder::mutex_holder(pthread_mutex_t* mutex)
mutex_holder::~mutex_holder() mutex_holder::~mutex_holder()
{ {
if( 0 != pthread_mutex_unlock( this->_mutex ) ) if( 0 != pthread_mutex_unlock( this->m_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }

View File

@ -1,20 +1,34 @@
// //
// Copyright (c) 2018 Wind River Systems, Inc. // Copyright (c) 2018,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
#ifndef __SM_UTIL_TYPES_H__ #ifndef __SM_UTIL_TYPES_H__
#define __SM_UTIL_TYPES_H__ #define __SM_UTIL_TYPES_H__
#include <stdbool.h>
#include <pthread.h> #include <pthread.h>
#include "sm_types.h"
class mutex_holder class mutex_holder
{ {
private: private:
pthread_mutex_t* _mutex; pthread_mutex_t* m_mutex;
public: public:
mutex_holder(pthread_mutex_t* mutex); mutex_holder(pthread_mutex_t* mutex);
virtual ~mutex_holder(); virtual ~mutex_holder();
}; };
// ****************************************************************************
// initialize mutex
// ==============
SmErrorT sm_mutex_initialize ( pthread_mutex_t* mutex, bool mutex_recursive );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
SmErrorT sm_mutex_finalize ( pthread_mutex_t* mutex );
// ****************************************************************************
#endif //__SM_UTIL_TYPES_H__ #endif //__SM_UTIL_TYPES_H__

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -8,25 +8,36 @@
#include <pthread.h> #include <pthread.h>
#include "sm_debug.h" #include "sm_debug.h"
#include "sm_util_types.h"
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t fm_api_mutex;
SmErrorT fm_mutex_initialize ( void )
{
return sm_mutex_initialize(&fm_api_mutex, false);
}
SmErrorT fm_mutex_finalize ( void )
{
return sm_mutex_finalize(&fm_api_mutex);
}
// **************************************************************************** // ****************************************************************************
// FM Wrapper - FM Set Fault // FM Wrapper - FM Set Fault
// ========================= // =========================
EFmErrorT fm_set_fault_wrapper( const SFmAlarmDataT* alarm, fm_uuid_t* uuid ) EFmErrorT fm_set_fault_wrapper( const SFmAlarmDataT* alarm, fm_uuid_t* uuid )
{ {
EFmErrorT fm_error; EFmErrorT fm_error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( FM_ERR_NOCONNECT ); return( FM_ERR_NOCONNECT );
} }
fm_error = fm_set_fault( alarm, uuid ); fm_error = fm_set_fault( alarm, uuid );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -40,17 +51,17 @@ EFmErrorT fm_set_fault_wrapper( const SFmAlarmDataT* alarm, fm_uuid_t* uuid )
// =========================== // ===========================
EFmErrorT fm_clear_fault_wrapper( AlarmFilter* filter ) EFmErrorT fm_clear_fault_wrapper( AlarmFilter* filter )
{ {
EFmErrorT fm_error; EFmErrorT fm_error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( FM_ERR_NOCONNECT ); return( FM_ERR_NOCONNECT );
} }
fm_error = fm_clear_fault( filter ); fm_error = fm_clear_fault( filter );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -64,17 +75,17 @@ EFmErrorT fm_clear_fault_wrapper( AlarmFilter* filter )
// ========================= // =========================
EFmErrorT fm_clear_all_wrapper( fm_ent_inst_t* inst_id ) EFmErrorT fm_clear_all_wrapper( fm_ent_inst_t* inst_id )
{ {
EFmErrorT fm_error; EFmErrorT fm_error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( FM_ERR_NOCONNECT ); return( FM_ERR_NOCONNECT );
} }
fm_error = fm_clear_all( inst_id ); fm_error = fm_clear_all( inst_id );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -88,17 +99,17 @@ EFmErrorT fm_clear_all_wrapper( fm_ent_inst_t* inst_id )
// ========================= // =========================
EFmErrorT fm_get_fault_wrapper( AlarmFilter* filter, SFmAlarmDataT* alarm ) EFmErrorT fm_get_fault_wrapper( AlarmFilter* filter, SFmAlarmDataT* alarm )
{ {
EFmErrorT fm_error; EFmErrorT fm_error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( FM_ERR_NOCONNECT ); return( FM_ERR_NOCONNECT );
} }
fm_error = fm_get_fault( filter, alarm ); fm_error = fm_get_fault( filter, alarm );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -113,17 +124,17 @@ EFmErrorT fm_get_fault_wrapper( AlarmFilter* filter, SFmAlarmDataT* alarm )
EFmErrorT fm_get_faults_wrapper( fm_ent_inst_t* inst_id, SFmAlarmDataT* alarm, EFmErrorT fm_get_faults_wrapper( fm_ent_inst_t* inst_id, SFmAlarmDataT* alarm,
unsigned int* max_alarms_to_get ) unsigned int* max_alarms_to_get )
{ {
EFmErrorT fm_error; EFmErrorT fm_error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( FM_ERR_NOCONNECT ); return( FM_ERR_NOCONNECT );
} }
fm_error = fm_get_faults( inst_id, alarm, max_alarms_to_get ); fm_error = fm_get_faults( inst_id, alarm, max_alarms_to_get );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -135,20 +146,20 @@ EFmErrorT fm_get_faults_wrapper( fm_ent_inst_t* inst_id, SFmAlarmDataT* alarm,
// **************************************************************************** // ****************************************************************************
// FM Wrapper - FM Get Faults By Id // FM Wrapper - FM Get Faults By Id
// ================================ // ================================
EFmErrorT fm_get_faults_by_id_wrapper( fm_alarm_id* alarm_id, EFmErrorT fm_get_faults_by_id_wrapper( fm_alarm_id* alarm_id,
SFmAlarmDataT* alarm, unsigned int* max_alarms_to_get ) SFmAlarmDataT* alarm, unsigned int* max_alarms_to_get )
{ {
EFmErrorT fm_error; EFmErrorT fm_error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( FM_ERR_NOCONNECT ); return( FM_ERR_NOCONNECT );
} }
fm_error = fm_get_faults_by_id( alarm_id, alarm, max_alarms_to_get ); fm_error = fm_get_faults_by_id( alarm_id, alarm, max_alarms_to_get );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &fm_api_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -8,6 +8,7 @@
#include <fmAPI.h> #include <fmAPI.h>
#include "sm_types.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -17,7 +18,7 @@ extern "C" {
// The following functions are wrapped to guarantee thread safety of the // The following functions are wrapped to guarantee thread safety of the
// FM API library. // FM API library.
// //
extern EFmErrorT fm_set_fault_wrapper( const SFmAlarmDataT* alarm, extern EFmErrorT fm_set_fault_wrapper( const SFmAlarmDataT* alarm,
fm_uuid_t* uuid); fm_uuid_t* uuid);
extern EFmErrorT fm_clear_fault_wrapper( AlarmFilter *filter ); extern EFmErrorT fm_clear_fault_wrapper( AlarmFilter *filter );
@ -27,10 +28,14 @@ extern EFmErrorT fm_clear_all_wrapper( fm_ent_inst_t *inst_id );
extern EFmErrorT fm_get_fault_wrapper( AlarmFilter *filter, extern EFmErrorT fm_get_fault_wrapper( AlarmFilter *filter,
SFmAlarmDataT* alarm ); SFmAlarmDataT* alarm );
extern SmErrorT fm_mutex_initialize ( void );
extern SmErrorT fm_mutex_finalize ( void );
EFmErrorT fm_get_faults_wrapper( fm_ent_inst_t *inst_id, EFmErrorT fm_get_faults_wrapper( fm_ent_inst_t *inst_id,
SFmAlarmDataT *alarm, unsigned int* max_alarms_to_get ); SFmAlarmDataT *alarm, unsigned int* max_alarms_to_get );
EFmErrorT fm_get_faults_by_id_wrapper( fm_alarm_id* alarm_id, EFmErrorT fm_get_faults_by_id_wrapper( fm_alarm_id* alarm_id,
SFmAlarmDataT* alarm, unsigned int* max_alarms_to_get ); SFmAlarmDataT* alarm, unsigned int* max_alarms_to_get );
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -11,7 +11,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
@ -26,6 +26,7 @@
#include "sm_time.h" #include "sm_time.h"
#include "sm_node_utils.h" #include "sm_node_utils.h"
#include "sm_alarm_thread.h" #include "sm_alarm_thread.h"
#include "sm_util_types.h"
#define SM_ALARM_ENTRY_INUSE 0xA5A5A5A5 #define SM_ALARM_ENTRY_INUSE 0xA5A5A5A5
@ -51,7 +52,7 @@ typedef struct
static int _server_fd = -1; static int _server_fd = -1;
static int _client_fd = -1; static int _client_fd = -1;
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t alarm_mutex;
static SmAlarmEntryT _alarms[SM_ALARMS_MAX]; static SmAlarmEntryT _alarms[SM_ALARMS_MAX];
// **************************************************************************** // ****************************************************************************
@ -77,7 +78,7 @@ static SmAlarmEntryT* sm_alarm_find_empty( void )
// **************************************************************************** // ****************************************************************************
// Alarm - Find // Alarm - Find
// ============ // ============
static SmAlarmEntryT* sm_alarm_find( const SmAlarmT alarm, static SmAlarmEntryT* sm_alarm_find( const SmAlarmT alarm,
const SmAlarmNodeNameT node_name, const SmAlarmDomainNameT domain_name, const SmAlarmNodeNameT node_name, const SmAlarmDomainNameT domain_name,
const SmAlarmEntityNameT entity_name ) const SmAlarmEntityNameT entity_name )
{ {
@ -112,7 +113,7 @@ static bool sm_alarm_throttle( const SmAlarmT alarm, SmAlarmStateT alarm_state,
bool throttle = false; bool throttle = false;
SmAlarmEntryT* entry; SmAlarmEntryT* entry;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
abort(); abort();
@ -129,7 +130,7 @@ static bool sm_alarm_throttle( const SmAlarmT alarm, SmAlarmStateT alarm_state,
} }
memset( entry, 0, sizeof(SmAlarmEntryT) ); memset( entry, 0, sizeof(SmAlarmEntryT) );
entry->inuse = SM_ALARM_ENTRY_INUSE; entry->inuse = SM_ALARM_ENTRY_INUSE;
entry->alarm = alarm; entry->alarm = alarm;
snprintf( entry->alarm_node_name, sizeof(entry->alarm_node_name), snprintf( entry->alarm_node_name, sizeof(entry->alarm_node_name),
@ -167,7 +168,7 @@ static bool sm_alarm_throttle( const SmAlarmT alarm, SmAlarmStateT alarm_state,
} }
RELEASE_MUTEX: RELEASE_MUTEX:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
abort(); abort();
@ -210,7 +211,7 @@ bool sm_alarm_write_alarm_additional_text( const char data[],
// **************************************************************************** // ****************************************************************************
// Alarm - Raise // Alarm - Raise
// ============= // =============
static void sm_alarm_raise( const SmAlarmT alarm, static void sm_alarm_raise( const SmAlarmT alarm,
const SmAlarmNodeNameT node_name, const SmAlarmDomainNameT domain_name, const SmAlarmNodeNameT node_name, const SmAlarmDomainNameT domain_name,
const SmAlarmEntityNameT entity_name, SmAlarmDataT* data ) const SmAlarmEntityNameT entity_name, SmAlarmDataT* data )
{ {
@ -251,7 +252,7 @@ static void sm_alarm_raise( const SmAlarmT alarm,
if( 0 > result ) if( 0 > result )
{ {
DPRINTFE( "Failed to raise alarm (%i) for domain (%s) entity (%s), " DPRINTFE( "Failed to raise alarm (%i) for domain (%s) entity (%s), "
"error=%s.", alarm, domain_name, entity_name, "error=%s.", alarm, domain_name, entity_name,
strerror( errno ) ); strerror( errno ) );
} }
} }
@ -292,7 +293,7 @@ void sm_alarm_raise_state_alarm( const SmAlarmT alarm,
"%s", entity_condition ); "%s", entity_condition );
data.threshold_info.applicable = false; data.threshold_info.applicable = false;
if( '\0' == proposed_repair_action[0] ) if( '\0' == proposed_repair_action[0] )
{ {
snprintf( data.proposed_repair_action, snprintf( data.proposed_repair_action,
@ -554,7 +555,7 @@ void sm_alarm_clear( const SmAlarmT alarm, const SmAlarmNodeNameT node_name,
if( 0 > result ) if( 0 > result )
{ {
DPRINTFE( "Failed to clear alarm (%i) for domain (%s) entity (%s), " DPRINTFE( "Failed to clear alarm (%i) for domain (%s) entity (%s), "
"error=%s.", alarm, domain_name, entity_name, "error=%s.", alarm, domain_name, entity_name,
strerror( errno ) ); strerror( errno ) );
} }
} }
@ -569,7 +570,7 @@ void sm_alarm_clear_all( const SmAlarmDomainNameT domain_name )
SmAlarmThreadMsgClearAllAlarmsT* clear_all_alarms = &(msg.u.clear_all_alarms); SmAlarmThreadMsgClearAllAlarmsT* clear_all_alarms = &(msg.u.clear_all_alarms);
int result; int result;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
abort(); abort();
@ -577,7 +578,7 @@ void sm_alarm_clear_all( const SmAlarmDomainNameT domain_name )
memset( _alarms, 0, sizeof(_alarms) ); memset( _alarms, 0, sizeof(_alarms) );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
abort(); abort();
@ -647,7 +648,9 @@ SmErrorT sm_alarm_initialize( void )
DPRINTFD( "Alarm message size is %i bytes.", DPRINTFD( "Alarm message size is %i bytes.",
(int) sizeof(SmAlarmThreadMsgT) ); (int) sizeof(SmAlarmThreadMsgT) );
if( 0 != pthread_mutex_lock( &_mutex ) ) sm_mutex_initialize(&alarm_mutex, false);
if( 0 != pthread_mutex_lock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
abort(); abort();
@ -655,12 +658,12 @@ SmErrorT sm_alarm_initialize( void )
memset( _alarms, 0, sizeof(_alarms) ); memset( _alarms, 0, sizeof(_alarms) );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
abort(); abort();
} }
result = socketpair( AF_UNIX, SOCK_DGRAM, 0, sockets ); result = socketpair( AF_UNIX, SOCK_DGRAM, 0, sockets );
if( 0 > result ) if( 0 > result )
{ {
@ -684,7 +687,7 @@ SmErrorT sm_alarm_initialize( void )
if( 0 > result ) if( 0 > result )
{ {
DPRINTFE( "Failed to set alarm communication socket (%i) to " DPRINTFE( "Failed to set alarm communication socket (%i) to "
"non-blocking, error=%s.", socket_i, "non-blocking, error=%s.", socket_i,
strerror( errno ) ); strerror( errno ) );
return( SM_FAILED ); return( SM_FAILED );
} }
@ -720,7 +723,7 @@ SmErrorT sm_alarm_initialize( void )
sm_error_str( error ) ); sm_error_str( error ) );
return( error ); return( error );
} }
return( SM_OKAY ); return( SM_OKAY );
} }
// **************************************************************************** // ****************************************************************************
@ -731,7 +734,7 @@ SmErrorT sm_alarm_initialize( void )
SmErrorT sm_alarm_finalize( void ) SmErrorT sm_alarm_finalize( void )
{ {
SmErrorT error; SmErrorT error;
error = sm_alarm_thread_stop(); error = sm_alarm_thread_stop();
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -751,7 +754,7 @@ SmErrorT sm_alarm_finalize( void )
_client_fd = -1; _client_fd = -1;
} }
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
abort(); abort();
@ -759,12 +762,14 @@ SmErrorT sm_alarm_finalize( void )
memset( _alarms, 0, sizeof(_alarms) ); memset( _alarms, 0, sizeof(_alarms) );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &alarm_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
abort(); abort();
} }
sm_mutex_finalize(&alarm_mutex);
return( SM_OKAY ); return( SM_OKAY );
} }
// **************************************************************************** // ****************************************************************************

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2018 Wind River Systems, Inc. // Copyright (c) 2018,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -23,6 +23,7 @@
#include "sm_selobj.h" #include "sm_selobj.h"
#include "sm_worker_thread.h" #include "sm_worker_thread.h"
#include "sm_node_utils.h" #include "sm_node_utils.h"
#include "sm_util_types.h"
// uncomment when debugging this module to enabled DPRINTFD output to log file // uncomment when debugging this module to enabled DPRINTFD output to log file
// #define __DEBUG__MSG__ // #define __DEBUG__MSG__
@ -117,7 +118,7 @@ void log_cluster_hbs_state(const SmClusterHbsStateT& state)
} }
} }
pthread_mutex_t SmClusterHbsInfoMsg::_mutex; pthread_mutex_t SmClusterHbsInfoMsg::sm_cluster_hbs_mutex;
const unsigned short Invalid_Req_Id = 0; const unsigned short Invalid_Req_Id = 0;
int SmClusterHbsInfoMsg::_sock = -1; int SmClusterHbsInfoMsg::_sock = -1;
SmClusterHbsStateT SmClusterHbsInfoMsg::_cluster_hbs_state_current; SmClusterHbsStateT SmClusterHbsInfoMsg::_cluster_hbs_state_current;
@ -228,7 +229,7 @@ bool SmClusterHbsInfoMsg::_process_cluster_hbs_history(mtce_hbs_cluster_history_
void SmClusterHbsInfoMsg::_cluster_hbs_info_msg_received( int selobj, int64_t user_data ) void SmClusterHbsInfoMsg::_cluster_hbs_info_msg_received( int selobj, int64_t user_data )
{ {
mtce_hbs_cluster_type msg = {0}; mtce_hbs_cluster_type msg = {0};
mutex_holder holder(&_mutex); mutex_holder holder(&sm_cluster_hbs_mutex);
while(true) while(true)
{ {
int bytes_read = recv( selobj, &msg, sizeof(msg), MSG_NOSIGNAL | MSG_DONTWAIT ); int bytes_read = recv( selobj, &msg, sizeof(msg), MSG_NOSIGNAL | MSG_DONTWAIT );
@ -349,7 +350,7 @@ bool SmClusterHbsInfoMsg::cluster_hbs_info_query(cluster_hbs_query_ready_callbac
unsigned short reqid; unsigned short reqid;
struct timespec ts; struct timespec ts;
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_cluster_hbs_mutex);
if(alive_pulse) if(alive_pulse)
{ {
reqid = 0; reqid = 0;
@ -473,14 +474,10 @@ SmErrorT SmClusterHbsInfoMsg::open_socket()
SmErrorT SmClusterHbsInfoMsg::initialize() SmErrorT SmClusterHbsInfoMsg::initialize()
{ {
SmErrorT error; SmErrorT error;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr); error = sm_mutex_initialize(&sm_cluster_hbs_mutex, true);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); if( error != SM_OKAY )
int res = pthread_mutex_init(&_mutex, &attr);
if( 0 != res )
{ {
DPRINTFE("Failed to initialize mutex, error %d", res);
return SM_FAILED; return SM_FAILED;
} }
@ -530,13 +527,15 @@ SmErrorT SmClusterHbsInfoMsg::initialize()
SmErrorT SmClusterHbsInfoMsg::finalize() SmErrorT SmClusterHbsInfoMsg::finalize()
{ {
mutex_holder holder(&_mutex);
if(_sock > 0)
{ {
close(_sock); mutex_holder holder(&sm_cluster_hbs_mutex);
_sock = -1; if(_sock > 0)
{
close(_sock);
_sock = -1;
}
} }
pthread_mutex_destroy(&_mutex); pthread_mutex_destroy(&sm_cluster_hbs_mutex);
return SM_OKAY; return SM_OKAY;
} }

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2018 Wind River Systems, Inc. // Copyright (c) 2018,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -86,7 +86,7 @@ class SmClusterHbsInfoMsg
private: private:
static int _sock; static int _sock;
static unsigned short _last_reqid; static unsigned short _last_reqid;
static pthread_mutex_t _mutex; static pthread_mutex_t sm_cluster_hbs_mutex;
static SmClusterHbsStateT _cluster_hbs_state_current; static SmClusterHbsStateT _cluster_hbs_state_current;
static SmClusterHbsStateT _cluster_hbs_state_previous; static SmClusterHbsStateT _cluster_hbs_state_previous;
static hbs_query_respond_callback _callbacks; static hbs_query_respond_callback _callbacks;
@ -104,4 +104,4 @@ class SmClusterHbsInfoMsg
static int this_controller_index; static int this_controller_index;
}; };
#endif // __SM_CLUSTER_HBS_INFO_MSG_H__ #endif // __SM_CLUSTER_HBS_INFO_MSG_H__

View File

@ -139,7 +139,7 @@ static SmFailoverInterfaceInfo* _mgmt_interface_info = NULL;
static SmFailoverInterfaceInfo* _cluster_host_interface_info = NULL; static SmFailoverInterfaceInfo* _cluster_host_interface_info = NULL;
static SmFailoverInterfaceInfo* _admin_interface_info = NULL; static SmFailoverInterfaceInfo* _admin_interface_info = NULL;
static SmFailoverInterfaceInfo _peer_if_list[SM_INTERFACE_MAX]; static SmFailoverInterfaceInfo _peer_if_list[SM_INTERFACE_MAX];
static pthread_mutex_t _mutex; static pthread_mutex_t sm_failover_mutex;
static SmDbHandleT* _sm_db_handle = NULL; static SmDbHandleT* _sm_db_handle = NULL;
static SmNodeScheduleStateT _host_state; static SmNodeScheduleStateT _host_state;
@ -160,6 +160,16 @@ SmErrorT sm_exec_json_command(const char* cmd, char result_buf[], int result_len
SmErrorT sm_failover_get_node_oper_state(char* node_name, SmNodeOperationalStateT *state); SmErrorT sm_failover_get_node_oper_state(char* node_name, SmNodeOperationalStateT *state);
void _log_nodes_state(); void _log_nodes_state();
SmErrorT sm_failover_mutex_initialize ( void )
{
return sm_mutex_initialize(&sm_failover_mutex, true);
}
SmErrorT sm_failover_mutex_finalize ( void )
{
return sm_mutex_finalize(&sm_failover_mutex);
}
// **************************************************************************** // ****************************************************************************
// Failover - interface check // Failover - interface check
// ================== // ==================
@ -254,7 +264,7 @@ static SmFailoverInterfaceInfo* find_interface_info( SmFailoverInterfaceT* inter
// ================== // ==================
void sm_failover_lost_hello_msg() void sm_failover_lost_hello_msg()
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
if(_hello_msg_alive) if(_hello_msg_alive)
{ {
@ -268,7 +278,7 @@ void sm_failover_lost_hello_msg()
// ================== // ==================
void sm_failover_hello_msg_restore() void sm_failover_hello_msg_restore()
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
SmFailoverInterfaceInfo* iter; SmFailoverInterfaceInfo* iter;
for(iter = _my_if_list; iter < _end_of_list; iter ++) for(iter = _my_if_list; iter < _end_of_list; iter ++)
@ -287,7 +297,7 @@ void sm_failover_hello_msg_restore()
// ================== // ==================
void sm_failover_lost_heartbeat( SmFailoverInterfaceT* interface ) void sm_failover_lost_heartbeat( SmFailoverInterfaceT* interface )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
SmFailoverInterfaceInfo* if_info = find_interface_info( interface ); SmFailoverInterfaceInfo* if_info = find_interface_info( interface );
if ( NULL == if_info ) if ( NULL == if_info )
@ -319,7 +329,7 @@ void sm_failover_lost_heartbeat( SmFailoverInterfaceT* interface )
// ================== // ==================
void sm_failover_heartbeat_restore( SmFailoverInterfaceT* interface ) void sm_failover_heartbeat_restore( SmFailoverInterfaceT* interface )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
SmFailoverInterfaceInfo* if_info = find_interface_info( interface ); SmFailoverInterfaceInfo* if_info = find_interface_info( interface );
if ( NULL == if_info ) if ( NULL == if_info )
@ -364,7 +374,7 @@ void sm_failover_heartbeat_restore( SmFailoverInterfaceT* interface )
// ================== // ==================
void sm_failover_interface_down( const char* const interface_name ) void sm_failover_interface_down( const char* const interface_name )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
SmFailoverInterfaceInfo* iter; SmFailoverInterfaceInfo* iter;
int impacted = 0; int impacted = 0;
@ -398,7 +408,7 @@ void sm_failover_interface_down( const char* const interface_name )
// ================== // ==================
void sm_failover_interface_up( const char* const interface_name ) void sm_failover_interface_up( const char* const interface_name )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
SmFailoverInterfaceInfo* iter; SmFailoverInterfaceInfo* iter;
int impacted = 0; int impacted = 0;
@ -468,7 +478,7 @@ void sm_failover_if_state_update(const char node_name[], SmHeartbeatMsgIfStateT
{ {
if( 0 == strcmp(node_name, _peer_name) ) if( 0 == strcmp(node_name, _peer_name) )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
if( _peer_if_state != if_state ) if( _peer_if_state != if_state )
{ {
@ -575,7 +585,7 @@ int sm_failover_get_if_state()
// ================== // ==================
SmHeartbeatMsgIfStateT sm_failover_if_state_get() SmHeartbeatMsgIfStateT sm_failover_if_state_get()
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
int if_state_flag = sm_failover_get_if_state(); int if_state_flag = sm_failover_get_if_state();
return (if_state_flag & 0b0111); //the lower 3 bits i/f state flag return (if_state_flag & 0b0111); //the lower 3 bits i/f state flag
} }
@ -586,7 +596,7 @@ SmHeartbeatMsgIfStateT sm_failover_if_state_get()
// ================== // ==================
SmHeartbeatMsgIfStateT sm_failover_get_peer_if_state() SmHeartbeatMsgIfStateT sm_failover_get_peer_if_state()
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
return (_peer_if_state & 0b0111); //the lower 3 bits i/f state flag return (_peer_if_state & 0b0111); //the lower 3 bits i/f state flag
} }
@ -993,7 +1003,7 @@ SmErrorT sm_failover_set_system(const SmSystemFailoverStatus& failover_status)
// ======================= // =======================
void sm_failover_audit() void sm_failover_audit()
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_failover_mutex);
timespec now; timespec now;
time_t now_ms; time_t now_ms;
@ -1291,17 +1301,6 @@ SmErrorT sm_failover_initialize( void )
bool enabled; bool enabled;
SmErrorT error; SmErrorT error;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
int res = pthread_mutex_init(&_mutex, &attr);
if( 0 != res )
{
DPRINTFE("Failed to initialize mutex, error %d", res);
return SM_FAILED;
}
error = SmFailoverFSM::initialize(); error = SmFailoverFSM::initialize();
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -1460,7 +1459,6 @@ SmErrorT sm_failover_finalize( void )
DPRINTFE( "Failed to finalize failover FSM, error %s.", sm_error_str( error ) ); DPRINTFE( "Failed to finalize failover FSM, error %s.", sm_error_str( error ) );
} }
pthread_mutex_destroy(&_mutex);
return SM_OKAY; return SM_OKAY;
} }
// **************************************************************************** // ****************************************************************************

View File

@ -40,6 +40,18 @@ typedef enum
SM_FAILOVER_PEER_DISABLED = 0x4000, SM_FAILOVER_PEER_DISABLED = 0x4000,
}SmFailoverCommFaultBitFlagT; }SmFailoverCommFaultBitFlagT;
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_failover_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_failover_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Failover - check // Failover - check
// ================== // ==================

View File

@ -10,7 +10,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <errno.h> #include <errno.h>
@ -36,6 +36,7 @@
#include "sm_log.h" #include "sm_log.h"
#include "sm_failover.h" #include "sm_failover.h"
#include "sm_cluster_hbs_info_msg.h" #include "sm_cluster_hbs_info_msg.h"
#include "sm_util_types.h"
#define SM_HEARTBEAT_THREAD_NAME "sm_heartbeat" #define SM_HEARTBEAT_THREAD_NAME "sm_heartbeat"
#define SM_HEARTBEAT_THREAD_TICK_INTERVAL_IN_MS 100 #define SM_HEARTBEAT_THREAD_TICK_INTERVAL_IN_MS 100
@ -96,7 +97,7 @@ typedef struct
static sig_atomic_t _stay_on; static sig_atomic_t _stay_on;
static bool _thread_created = false; static bool _thread_created = false;
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t heartbeat_mutex;
static pthread_t _heartbeat_thread; static pthread_t _heartbeat_thread;
static sig_atomic_t _messaging_enabled = 0; static sig_atomic_t _messaging_enabled = 0;
static sig_atomic_t _heartbeat_required = 1; static sig_atomic_t _heartbeat_required = 1;
@ -129,6 +130,17 @@ static bool operator != ( const SmNetworkAddressT& src, const SmNetworkAddressT&
} }
// **************************************************************************** // ****************************************************************************
SmErrorT sm_heartbeat_thread_mutex_initialize ( void )
{
return sm_mutex_initialize(&heartbeat_mutex, false);
}
SmErrorT sm_heartbeat_thread_mutex_finalize ( void )
{
return sm_mutex_finalize(&heartbeat_mutex);
}
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Disable heartbeat // Heartbeat Thread - Disable heartbeat
// ========================= // =========================
@ -200,7 +212,7 @@ SmErrorT sm_heartbeat_thread_add_interface( const SmServiceDomainInterfaceT& dom
SmHeartbeatThreadInterfaceT* interface; SmHeartbeatThreadInterfaceT* interface;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -248,7 +260,7 @@ SmErrorT sm_heartbeat_thread_add_interface( const SmServiceDomainInterfaceT& dom
( interface->network_peer_port != domain_interface.network_peer_heartbeat_port )) ( interface->network_peer_port != domain_interface.network_peer_heartbeat_port ))
{ {
// Same id, but not the same instance data. // Same id, but not the same instance data.
error = sm_heartbeat_msg_close_sockets( error = sm_heartbeat_msg_close_sockets(
&(interface->multicast_socket) ); &(interface->multicast_socket) );
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -307,7 +319,7 @@ SmErrorT sm_heartbeat_thread_add_interface( const SmServiceDomainInterfaceT& dom
interface->interface_name ); interface->interface_name );
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -316,7 +328,7 @@ SmErrorT sm_heartbeat_thread_add_interface( const SmServiceDomainInterfaceT& dom
return( SM_OKAY ); return( SM_OKAY );
ERROR: ERROR:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -333,7 +345,7 @@ SmErrorT sm_heartbeat_thread_delete_interface( int64_t id )
{ {
SmHeartbeatThreadInterfaceT* interface; SmHeartbeatThreadInterfaceT* interface;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -347,7 +359,7 @@ SmErrorT sm_heartbeat_thread_delete_interface( int64_t id )
free( interface ); free( interface );
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -442,7 +454,7 @@ static bool sm_heartbeat_peer_alarm_on_interface( SmTimerIdT timer_id,
return( true ); return( true );
} }
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( true ); return( true );
@ -579,7 +591,7 @@ static bool sm_heartbeat_peer_alarm_on_interface( SmTimerIdT timer_id,
sm_log_communication_state_change( network_type, peer_interface->log_text ); sm_log_communication_state_change( network_type, peer_interface->log_text );
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -587,19 +599,19 @@ static bool sm_heartbeat_peer_alarm_on_interface( SmTimerIdT timer_id,
return( true ); return( true );
ERROR: ERROR:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
return( rearm ); return( rearm );
} }
// **************************************************************************** // ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Add Peer Interface // Heartbeat Thread - Add Peer Interface
// ===================================== // =====================================
SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id, SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id,
char interface_name[], SmNetworkAddressT* network_address, char interface_name[], SmNetworkAddressT* network_address,
int network_port, int dead_interval ) int network_port, int dead_interval )
{ {
@ -613,7 +625,7 @@ SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id,
return( SM_OKAY ); return( SM_OKAY );
} }
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -664,7 +676,7 @@ SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id,
(SmListEntryDataPtrT) peer_interface ); (SmListEntryDataPtrT) peer_interface );
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -673,7 +685,7 @@ SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id,
return( SM_OKAY ); return( SM_OKAY );
ERROR: ERROR:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -684,7 +696,7 @@ ERROR:
// **************************************************************************** // ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Delete Peer Interface // Heartbeat Thread - Delete Peer Interface
// ======================================== // ========================================
SmErrorT sm_heartbeat_thread_delete_peer_interface( char interface_name[], SmErrorT sm_heartbeat_thread_delete_peer_interface( char interface_name[],
SmNetworkAddressT* network_address, int network_port ) SmNetworkAddressT* network_address, int network_port )
@ -692,7 +704,7 @@ SmErrorT sm_heartbeat_thread_delete_peer_interface( char interface_name[],
SmHeartbeatThreadPeerInterfaceT* peer_interface; SmHeartbeatThreadPeerInterfaceT* peer_interface;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -722,7 +734,7 @@ SmErrorT sm_heartbeat_thread_delete_peer_interface( char interface_name[],
free( peer_interface ); free( peer_interface );
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -759,13 +771,13 @@ static SmHeartbeatThreadPeerNodeT* sm_heartbeat_thread_find_peer_node(
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Peer Alive In Period // Heartbeat Thread - Peer Alive In Period
// ======================================= // =======================================
bool sm_heartbeat_thread_peer_alive_in_period( char node_name[], bool sm_heartbeat_thread_peer_alive_in_period( char node_name[],
unsigned int period_in_ms ) unsigned int period_in_ms )
{ {
bool peer_alive = false; bool peer_alive = false;
SmHeartbeatThreadPeerNodeT* peer_node; SmHeartbeatThreadPeerNodeT* peer_node;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( true ); return( true );
@ -781,7 +793,7 @@ bool sm_heartbeat_thread_peer_alive_in_period( char node_name[],
peer_alive = ( period_in_ms >= ms_expired ); peer_alive = ( period_in_ms >= ms_expired );
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -800,7 +812,7 @@ static bool sm_heartbeat_alive_timer( SmTimerIdT timer_id, int64_t user_data )
SmHeartbeatThreadInterfaceT* interface; SmHeartbeatThreadInterfaceT* interface;
SmErrorT error; SmErrorT error;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( true ); return( true );
@ -965,7 +977,7 @@ static bool sm_heartbeat_alive_timer( SmTimerIdT timer_id, int64_t user_data )
} }
DONE: DONE:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( true ); return( true );
@ -987,7 +999,7 @@ static bool sm_heartbeat_thread_auth_message( char interface_name[],
SmHeartbeatThreadInterfaceT* interface; SmHeartbeatThreadInterfaceT* interface;
SmSha512HashT hash; SmSha512HashT hash;
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( true ); return( true );
@ -1020,7 +1032,7 @@ static bool sm_heartbeat_thread_auth_message( char interface_name[],
DONE: DONE:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return( true ); return( true );
@ -1041,7 +1053,7 @@ static void sm_heartbeat_thread_receive_alive_message( char node_name[],
DPRINTFD( "Received alive message from node (%s).", node_name ); DPRINTFD( "Received alive message from node (%s).", node_name );
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return; return;
@ -1095,7 +1107,7 @@ static void sm_heartbeat_thread_receive_alive_message( char node_name[],
} }
DONE: DONE:
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
return; return;

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014-2017 Wind River Systems, Inc. // Copyright (c) 2014-2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -16,6 +16,18 @@
extern "C" { extern "C" {
#endif #endif
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_heartbeat_thread_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_heartbeat_thread_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Disable heartbeat // Heartbeat Thread - Disable heartbeat
// ========================= // =========================
@ -50,7 +62,7 @@ extern SmErrorT sm_heartbeat_thread_delete_interface( int64_t id );
// **************************************************************************** // ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Add Peer Interface // Heartbeat Thread - Add Peer Interface
// ===================================== // =====================================
extern SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id, extern SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id,
char interface_name[], SmNetworkAddressT* network_address, char interface_name[], SmNetworkAddressT* network_address,
@ -58,7 +70,7 @@ extern SmErrorT sm_heartbeat_thread_add_peer_interface( int64_t id,
// **************************************************************************** // ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Heartbeat Thread - Delete Peer Interface // Heartbeat Thread - Delete Peer Interface
// ======================================== // ========================================
extern SmErrorT sm_heartbeat_thread_delete_peer_interface( extern SmErrorT sm_heartbeat_thread_delete_peer_interface(
char interface_name[], SmNetworkAddressT* network_address, char interface_name[], SmNetworkAddressT* network_address,

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -43,6 +43,7 @@
#include "sm_service_group_api.h" #include "sm_service_group_api.h"
#include "sm_service_api.h" #include "sm_service_api.h"
#include "sm_service_action.h" #include "sm_service_action.h"
#include "sm_service_enable.h"
#include "sm_service_heartbeat_api.h" #include "sm_service_heartbeat_api.h"
#include "sm_service_heartbeat_thread.h" #include "sm_service_heartbeat_thread.h"
#include "sm_service_domain_scheduler.h" #include "sm_service_domain_scheduler.h"
@ -55,6 +56,8 @@
#include "sm_worker_thread.h" #include "sm_worker_thread.h"
#include "sm_configuration_table.h" #include "sm_configuration_table.h"
#include "sm_cluster_hbs_info_msg.h" #include "sm_cluster_hbs_info_msg.h"
#include "fm_api_wrapper.h"
#include "sm_swact_state.h"
#define SM_PROCESS_DB_CHECKPOINT_INTERVAL_IN_MS 30000 #define SM_PROCESS_DB_CHECKPOINT_INTERVAL_IN_MS 30000
#define SM_PROCESS_TICK_INTERVAL_IN_MS 200 #define SM_PROCESS_TICK_INTERVAL_IN_MS 200
@ -170,6 +173,18 @@ static SmErrorT sm_process_initialize( void )
{ {
SmErrorT error; SmErrorT error;
// mutexes
fm_mutex_initialize();
sm_failover_mutex_initialize();
sm_service_enable_mutex_initialize();
sm_swact_state_mutex_initialize();
sm_service_heartbeat_api_mutex_initialize();
sm_heartbeat_thread_mutex_initialize();
sm_thread_health_mutex_initialize();
sm_selobj_mutex_initialize();
sm_timer_mutex_initialize();
sm_hw_mutex_initialize();
error = sm_selobj_initialize(); error = sm_selobj_initialize();
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -538,6 +553,18 @@ static SmErrorT sm_process_finalize( void )
sm_error_str( error ) ); sm_error_str( error ) );
} }
// mutexes
fm_mutex_finalize();
sm_failover_mutex_finalize();
sm_service_enable_mutex_finalize();
sm_swact_state_mutex_finalize();
sm_service_heartbeat_api_mutex_finalize();
sm_heartbeat_thread_mutex_finalize();
sm_thread_health_mutex_finalize();
sm_selobj_mutex_finalize();
sm_timer_mutex_finalize();
sm_hw_mutex_finalize();
return( SM_OKAY ); return( SM_OKAY );
} }
// **************************************************************************** // ****************************************************************************

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -29,7 +29,7 @@
#define EXTRA_CORES_STORAGE "/etc/platform/.task_affining_incomplete" #define EXTRA_CORES_STORAGE "/etc/platform/.task_affining_incomplete"
#define PLATFORM_CORES_FILE "/var/run/sm/.platform_cores" #define PLATFORM_CORES_FILE "/var/run/sm/.platform_cores"
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t sm_service_enable_mutex;
static sem_t sem; static sem_t sem;
static int num_initial_cores = 0; static int num_initial_cores = 0;
static sem_t sem_more_cores; static sem_t sem_more_cores;
@ -37,13 +37,22 @@ static bool check_more_cores_available = false;
static bool more_cores_available = false; static bool more_cores_available = false;
static int num_extra_cores = 0; static int num_extra_cores = 0;
SmErrorT sm_service_enable_mutex_initialize ( void )
{
return sm_mutex_initialize(&sm_service_enable_mutex, false);
}
SmErrorT sm_service_enable_mutex_finalize ( void )
{
return sm_mutex_finalize(&sm_service_enable_mutex);
}
// **************************************************************************** // ****************************************************************************
// add more cores for enabling service // add more cores for enabling service
// ============== // ==============
void sm_service_enable_throttle_add_cores( bool additional_cores ) void sm_service_enable_throttle_add_cores( bool additional_cores )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_service_enable_mutex);
check_more_cores_available = additional_cores; check_more_cores_available = additional_cores;
if (!additional_cores) if (!additional_cores)
@ -187,7 +196,7 @@ REPORT:
static bool sm_service_enable_timeout( SmTimerIdT timer_id, int64_t user_data ) static bool sm_service_enable_timeout( SmTimerIdT timer_id, int64_t user_data )
{ {
int64_t id = user_data; int64_t id = user_data;
SmServiceT* service; SmServiceT* service;
SmServiceActionT action_running; SmServiceActionT action_running;
SmServiceActionResultT action_result; SmServiceActionResultT action_result;
SmServiceStateT service_state; SmServiceStateT service_state;
@ -236,7 +245,7 @@ static bool sm_service_enable_timeout( SmTimerIdT timer_id, int64_t user_data )
DPRINTFI( "Action (%s) timeout with result (%s), state (%s), " DPRINTFI( "Action (%s) timeout with result (%s), state (%s), "
"status (%s), and condition (%s) for service (%s), " "status (%s), and condition (%s) for service (%s), "
"reason_text=%s, exit_code=%i.", "reason_text=%s, exit_code=%i.",
sm_service_action_str( action_running ), sm_service_action_str( action_running ),
sm_service_action_result_str( action_result ), sm_service_action_result_str( action_result ),
sm_service_state_str( service_state ), sm_service_state_str( service_state ),
@ -276,7 +285,7 @@ static bool sm_service_enable_timeout( SmTimerIdT timer_id, int64_t user_data )
static void sm_service_enable_complete( pid_t pid, int exit_code, static void sm_service_enable_complete( pid_t pid, int exit_code,
int64_t user_data ) int64_t user_data )
{ {
SmServiceT* service; SmServiceT* service;
SmServiceActionT action_running; SmServiceActionT action_running;
SmServiceActionResultT action_result; SmServiceActionResultT action_result;
SmServiceStateT service_state; SmServiceStateT service_state;
@ -297,7 +306,7 @@ static void sm_service_enable_complete( pid_t pid, int exit_code,
(int) pid, sm_error_str(SM_NOT_FOUND) ); (int) pid, sm_error_str(SM_NOT_FOUND) );
return; return;
} }
sm_service_enable_throttle_uncheck(); sm_service_enable_throttle_uncheck();
if( SM_SERVICE_ACTION_ENABLE != service->action_running ) if( SM_SERVICE_ACTION_ENABLE != service->action_running )
@ -319,7 +328,7 @@ static void sm_service_enable_complete( pid_t pid, int exit_code,
"service (%s), error=%s.", "service (%s), error=%s.",
sm_service_action_str( service->action_running ), sm_service_action_str( service->action_running ),
service->name, sm_error_str( error ) ); service->name, sm_error_str( error ) );
} }
} }
action_running = service->action_running; action_running = service->action_running;
@ -335,7 +344,7 @@ static void sm_service_enable_complete( pid_t pid, int exit_code,
service_condition = SM_SERVICE_CONDITION_UNKNOWN; service_condition = SM_SERVICE_CONDITION_UNKNOWN;
} else { } else {
error = sm_service_action_result( exit_code, service->name, error = sm_service_action_result( exit_code, service->name,
service->action_running, service->action_running,
&action_result, &service_state, &action_result, &service_state,
&service_status, &service_condition, &service_status, &service_condition,
@ -354,7 +363,7 @@ static void sm_service_enable_complete( pid_t pid, int exit_code,
DPRINTFI( "Action (%s) completed with result (%s), state (%s), " DPRINTFI( "Action (%s) completed with result (%s), state (%s), "
"status (%s), and condition (%s) for service (%s), " "status (%s), and condition (%s) for service (%s), "
"reason_text=%s, exit_code=%i.", "reason_text=%s, exit_code=%i.",
sm_service_action_str( action_running ), sm_service_action_str( action_running ),
sm_service_action_result_str( action_result ), sm_service_action_result_str( action_result ),
sm_service_state_str( service_state ), sm_service_state_str( service_state ),
@ -412,7 +421,7 @@ SmErrorT sm_service_enable( SmServiceT* service )
// Run action. // Run action.
error = sm_service_action_run( service->name, error = sm_service_action_run( service->name,
service->instance_name, service->instance_name,
service->instance_params, service->instance_params,
SM_SERVICE_ACTION_ENABLE, SM_SERVICE_ACTION_ENABLE,
&process_id, &timeout ); &process_id, &timeout );
if( SM_OKAY != error ) if( SM_OKAY != error )
@ -421,7 +430,7 @@ SmErrorT sm_service_enable( SmServiceT* service )
"error=%s.", service->name, sm_error_str( error ) ); "error=%s.", service->name, sm_error_str( error ) );
return( error ); return( error );
} }
// Register for action script exit notification. // Register for action script exit notification.
error = sm_process_death_register( process_id, true, error = sm_process_death_register( process_id, true,
sm_service_enable_complete, 0 ); sm_service_enable_complete, 0 );
@ -661,7 +670,7 @@ bool sm_service_enable_throttle_check( void )
return true; return true;
} else if( EAGAIN == errno ) } else if( EAGAIN == errno )
{ {
mutex_holder holder(&_mutex); mutex_holder holder(&sm_service_enable_mutex);
if(check_more_cores_available) if(check_more_cores_available)
{ {
int new_num_platform_cores = get_extra_cores(); int new_num_platform_cores = get_extra_cores();

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -13,6 +13,18 @@
extern "C" { extern "C" {
#endif #endif
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_service_enable_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_service_enable_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// add more cores for enabling service // add more cores for enabling service
// ============== // ==============

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -19,6 +19,7 @@
#include "sm_list.h" #include "sm_list.h"
#include "sm_selobj.h" #include "sm_selobj.h"
#include "sm_timer.h" #include "sm_timer.h"
#include "sm_util_types.h"
typedef enum typedef enum
{ {
@ -79,15 +80,25 @@ typedef struct
static int _sm_heartbeat_api_server_fd = -1; static int _sm_heartbeat_api_server_fd = -1;
static int _sm_heartbeat_api_client_fd = -1; static int _sm_heartbeat_api_client_fd = -1;
static SmListT* _callbacks = NULL; static SmListT* _callbacks = NULL;
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t heartbeat_callback_mutex;
SmErrorT sm_service_heartbeat_api_mutex_initialize ( void )
{
return sm_mutex_initialize(&heartbeat_callback_mutex, true); // PTHREAD_MUTEX_RECURSIVE
}
SmErrorT sm_service_heartbeat_api_mutex_finalize ( void )
{
return sm_mutex_finalize(&heartbeat_callback_mutex);
}
// **************************************************************************** // ****************************************************************************
// Service Heartbeat API - Register Callbacks // Service Heartbeat API - Register Callbacks
// ========================================== // ==========================================
SmErrorT sm_service_heartbeat_api_register_callbacks( SmErrorT sm_service_heartbeat_api_register_callbacks(
SmServiceHeartbeatCallbacksT* callbacks ) SmServiceHeartbeatCallbacksT* callbacks )
{ {
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_callback_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -95,7 +106,7 @@ SmErrorT sm_service_heartbeat_api_register_callbacks(
SM_LIST_PREPEND( _callbacks, (SmListEntryDataPtrT) callbacks ); SM_LIST_PREPEND( _callbacks, (SmListEntryDataPtrT) callbacks );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_callback_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -110,7 +121,7 @@ SmErrorT sm_service_heartbeat_api_register_callbacks(
SmErrorT sm_service_heartbeat_api_deregister_callbacks( SmErrorT sm_service_heartbeat_api_deregister_callbacks(
SmServiceHeartbeatCallbacksT* callbacks ) SmServiceHeartbeatCallbacksT* callbacks )
{ {
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_callback_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return( SM_FAILED ); return( SM_FAILED );
@ -118,11 +129,11 @@ SmErrorT sm_service_heartbeat_api_deregister_callbacks(
SM_LIST_REMOVE( _callbacks, (SmListEntryDataPtrT) callbacks ); SM_LIST_REMOVE( _callbacks, (SmListEntryDataPtrT) callbacks );
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_callback_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
return( SM_OKAY ); return( SM_OKAY );
} }
// **************************************************************************** // ****************************************************************************
@ -296,7 +307,7 @@ static void sm_service_heartbeat_api_dispatch( int selobj, int64_t user_data )
break; break;
} else if( 0 == bytes_read ) { } else if( 0 == bytes_read ) {
// For connection oriented sockets, this indicates that the peer // For connection oriented sockets, this indicates that the peer
// has performed an orderly shutdown. // has performed an orderly shutdown.
return; return;
@ -317,7 +328,7 @@ static void sm_service_heartbeat_api_dispatch( int selobj, int64_t user_data )
return; return;
} }
if( 0 != pthread_mutex_lock( &_mutex ) ) if( 0 != pthread_mutex_lock( &heartbeat_callback_mutex ) )
{ {
DPRINTFE( "Failed to capture mutex." ); DPRINTFE( "Failed to capture mutex." );
return; return;
@ -372,13 +383,13 @@ static void sm_service_heartbeat_api_dispatch( int selobj, int64_t user_data )
break; break;
default: default:
DPRINTFE( "Unknown message type (%i) received.", DPRINTFE( "Unknown message type (%i) received.",
msg.msg_type ); msg.msg_type );
break; break;
} }
} }
if( 0 != pthread_mutex_unlock( &_mutex ) ) if( 0 != pthread_mutex_unlock( &heartbeat_callback_mutex ) )
{ {
DPRINTFE( "Failed to release mutex." ); DPRINTFE( "Failed to release mutex." );
} }
@ -421,7 +432,7 @@ SmErrorT sm_service_heartbeat_api_initialize( bool main_process )
if( 0 > result ) if( 0 > result )
{ {
DPRINTFE( "Failed to set service heartbeat socket (%i) to " DPRINTFE( "Failed to set service heartbeat socket (%i) to "
"non-blocking, error=%s.", socket_i, "non-blocking, error=%s.", socket_i,
strerror( errno ) ); strerror( errno ) );
return( SM_FAILED ); return( SM_FAILED );
} }
@ -430,7 +441,7 @@ SmErrorT sm_service_heartbeat_api_initialize( bool main_process )
_sm_heartbeat_api_server_fd = sockets[0]; _sm_heartbeat_api_server_fd = sockets[0];
_sm_heartbeat_api_client_fd = sockets[1]; _sm_heartbeat_api_client_fd = sockets[1];
error = sm_selobj_register( _sm_heartbeat_api_client_fd, error = sm_selobj_register( _sm_heartbeat_api_client_fd,
sm_service_heartbeat_api_dispatch, 0 ); sm_service_heartbeat_api_dispatch, 0 );
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {
@ -439,7 +450,7 @@ SmErrorT sm_service_heartbeat_api_initialize( bool main_process )
return( error ); return( error );
} }
} else { } else {
error = sm_selobj_register( _sm_heartbeat_api_server_fd, error = sm_selobj_register( _sm_heartbeat_api_server_fd,
sm_service_heartbeat_api_dispatch, 0 ); sm_service_heartbeat_api_dispatch, 0 );
if( SM_OKAY != error ) if( SM_OKAY != error )
{ {

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2014 Wind River Systems, Inc. // Copyright (c) 2014,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -31,17 +31,29 @@ typedef struct
SmServiceHeartbeatFailCallbackT fail_callback; SmServiceHeartbeatFailCallbackT fail_callback;
} SmServiceHeartbeatCallbacksT; } SmServiceHeartbeatCallbacksT;
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_service_heartbeat_api_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_service_heartbeat_api_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Service Heartbeat API - Register Callbacks // Service Heartbeat API - Register Callbacks
// ========================================== // ==========================================
extern SmErrorT sm_service_heartbeat_api_register_callbacks( extern SmErrorT sm_service_heartbeat_api_register_callbacks(
SmServiceHeartbeatCallbacksT* callbacks ); SmServiceHeartbeatCallbacksT* callbacks );
// **************************************************************************** // ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Service Heartbeat API - Deregister Callbacks // Service Heartbeat API - Deregister Callbacks
// ============================================ // ============================================
extern SmErrorT sm_service_heartbeat_api_deregister_callbacks( extern SmErrorT sm_service_heartbeat_api_deregister_callbacks(
SmServiceHeartbeatCallbacksT* callbacks ); SmServiceHeartbeatCallbacksT* callbacks );
// **************************************************************************** // ****************************************************************************

View File

@ -1,12 +1,24 @@
// Copyright (c) 2017 Wind River Systems, Inc. // Copyright (c) 2017,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
#include "sm_swact_state.h" #include "sm_swact_state.h"
#include "pthread.h" #include "pthread.h"
#include "sm_debug.h"
#include "sm_util_types.h"
volatile SmSwactStateT _swact_state = SM_SWACT_STATE_NONE; volatile SmSwactStateT _swact_state = SM_SWACT_STATE_NONE;
static pthread_mutex_t _state_mutex; static pthread_mutex_t swact_state_mutex;
SmErrorT sm_swact_state_mutex_initialize ( void )
{
return sm_mutex_initialize(&swact_state_mutex, false);
}
SmErrorT sm_swact_state_mutex_finalize ( void )
{
return sm_mutex_finalize(&swact_state_mutex);
}
// **************************************************************************** // ****************************************************************************
// Swact State - Swact State Setter // Swact State - Swact State Setter
@ -14,9 +26,9 @@ static pthread_mutex_t _state_mutex;
void sm_set_swact_state(SmSwactStateT state) void sm_set_swact_state(SmSwactStateT state)
{ {
// The state is set by sm main thread and task affining thread. // The state is set by sm main thread and task affining thread.
pthread_mutex_lock(&_state_mutex); pthread_mutex_lock(&swact_state_mutex);
_swact_state = state; _swact_state = state;
pthread_mutex_unlock(&_state_mutex); pthread_mutex_unlock(&swact_state_mutex);
} }
// **************************************************************************** // ****************************************************************************

View File

@ -1,11 +1,13 @@
// //
// Copyright (c) 2017 Wind River Systems, Inc. // Copyright (c) 2017,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
#ifndef __SM_SWACT_STATE_H__ #ifndef __SM_SWACT_STATE_H__
#define __SM_SWACT_STATE_H__ #define __SM_SWACT_STATE_H__
#include "sm_types.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -17,6 +19,18 @@ typedef enum
SM_SWACT_STATE_END, SM_SWACT_STATE_END,
} SmSwactStateT; } SmSwactStateT;
// ****************************************************************************
// initialize mutex
// ==============
extern SmErrorT sm_swact_state_mutex_initialize ( void );
// ****************************************************************************
// ****************************************************************************
// destroy mutex
// ==============
extern SmErrorT sm_swact_state_mutex_finalize ( void );
// ****************************************************************************
// **************************************************************************** // ****************************************************************************
// Swact State - Setter // Swact State - Setter
// ========================================== // ==========================================

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2018 Wind River Systems, Inc. // Copyright (c) 2018,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -73,7 +73,7 @@ SmErrorT SmWorkerThread::finalize()
// **************************************************************************** // ****************************************************************************
SmWorkerThread::SmWorkerThread() : _priority_queue(), _regular_queue() SmWorkerThread::SmWorkerThread() : _priority_queue(), _regular_queue()
{ {
this->_mutex = PTHREAD_MUTEX_INITIALIZER; sm_mutex_initialize(&this->sm_action_mutex, false);
this->_goon = true; this->_goon = true;
this->_thread_created = false; this->_thread_created = false;
} }
@ -85,6 +85,7 @@ SmWorkerThread::SmWorkerThread() : _priority_queue(), _regular_queue()
SmWorkerThread::~SmWorkerThread() SmWorkerThread::~SmWorkerThread()
{ {
sem_destroy(&this->_sem); sem_destroy(&this->_sem);
sm_mutex_finalize(&this->sm_action_mutex);
} }
// **************************************************************************** // ****************************************************************************
@ -157,7 +158,7 @@ SmErrorT SmWorkerThread::stop()
// **************************************************************************** // ****************************************************************************
void SmWorkerThread::add_action(SmAction* action) void SmWorkerThread::add_action(SmAction* action)
{ {
mutex_holder(&this->_mutex); mutex_holder(&this->sm_action_mutex);
this->_regular_queue.push(action); this->_regular_queue.push(action);
int res = sem_post(&_sem); int res = sem_post(&_sem);
if(0 != res) if(0 != res)
@ -174,7 +175,7 @@ void SmWorkerThread::add_action(SmAction* action)
// **************************************************************************** // ****************************************************************************
void SmWorkerThread::add_priority_action(SmAction* action) void SmWorkerThread::add_priority_action(SmAction* action)
{ {
mutex_holder(&this->_mutex); mutex_holder(&this->sm_action_mutex);
this->_priority_queue.push(action); this->_priority_queue.push(action);
int res = sem_post(&_sem); int res = sem_post(&_sem);
if(0 != res) if(0 != res)

View File

@ -1,5 +1,5 @@
// //
// Copyright (c) 2018 Wind River Systems, Inc. // Copyright (c) 2018,2023 Wind River Systems, Inc.
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
@ -66,7 +66,7 @@ class SmWorkerThread
static SmErrorT finalize(); static SmErrorT finalize();
private: private:
pthread_mutex_t _mutex; pthread_mutex_t sm_action_mutex;
SmActionQueueT _priority_queue; SmActionQueueT _priority_queue;
SmActionQueueT _regular_queue; SmActionQueueT _regular_queue;
sem_t _sem; sem_t _sem;