Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-RAN
Commits
b57a4049
Commit
b57a4049
authored
Jan 02, 2022
by
Laurent Thomas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix ocp-enb memory init
parent
f20d2804
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
113 additions
and
115 deletions
+113
-115
executables/main-ocp.c
executables/main-ocp.c
+113
-115
No files found.
executables/main-ocp.c
View file @
b57a4049
...
@@ -81,16 +81,16 @@ int otg_enabled;
...
@@ -81,16 +81,16 @@ int otg_enabled;
uint64_t
downlink_frequency
[
MAX_NUM_CCs
][
4
];
uint64_t
downlink_frequency
[
MAX_NUM_CCs
][
4
];
int32_t
uplink_frequency_offset
[
MAX_NUM_CCs
][
4
];
int32_t
uplink_frequency_offset
[
MAX_NUM_CCs
][
4
];
int
split73
;
int
split73
;
char
*
split73_config
;
char
*
split73_config
;
int
split73
;
int
split73
;
AGENT_RRC_xface
*
agent_rrc_xface
[
NUM_MAX_ENB
]
=
{
0
};
AGENT_RRC_xface
*
agent_rrc_xface
[
NUM_MAX_ENB
]
=
{
0
};
AGENT_MAC_xface
*
agent_mac_xface
[
NUM_MAX_ENB
]
=
{
0
};
AGENT_MAC_xface
*
agent_mac_xface
[
NUM_MAX_ENB
]
=
{
0
};
void
flexran_agent_slice_update
(
mid_t
module_idP
)
{
void
flexran_agent_slice_update
(
mid_t
module_idP
)
{
}
}
int
proto_agent_start
(
mod_id_t
mod_id
,
const
cudu_params_t
*
p
){
int
proto_agent_start
(
mod_id_t
mod_id
,
const
cudu_params_t
*
p
)
{
return
0
;
return
0
;
}
}
void
proto_agent_stop
(
mod_id_t
mod_id
){
void
proto_agent_stop
(
mod_id_t
mod_id
)
{
}
}
static
void
*
ru_thread
(
void
*
param
);
static
void
*
ru_thread
(
void
*
param
);
...
@@ -111,7 +111,6 @@ void exit_function(const char *file, const char *function, const int line, const
...
@@ -111,7 +111,6 @@ void exit_function(const char *file, const char *function, const int line, const
close_log_mem
();
close_log_mem
();
oai_exit
=
1
;
oai_exit
=
1
;
sleep
(
1
);
//allow lte-softmodem threads to exit first
sleep
(
1
);
//allow lte-softmodem threads to exit first
exit
(
1
);
exit
(
1
);
}
}
...
@@ -147,9 +146,11 @@ void init_RU_proc(RU_t *ru) {
...
@@ -147,9 +146,11 @@ void init_RU_proc(RU_t *ru) {
case
SPLIT73_CU
:
case
SPLIT73_CU
:
threadCreate
(
&
t
,
cu_fs6
,
(
void
*
)
ru
,
"MainCu"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
threadCreate
(
&
t
,
cu_fs6
,
(
void
*
)
ru
,
"MainCu"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
break
;
break
;
case
SPLIT73_DU
:
case
SPLIT73_DU
:
threadCreate
(
&
t
,
du_fs6
,
(
void
*
)
ru
,
"MainDuRx"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
threadCreate
(
&
t
,
du_fs6
,
(
void
*
)
ru
,
"MainDuRx"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
break
;
break
;
default:
default:
threadCreate
(
&
t
,
ru_thread
,
(
void
*
)
ru
,
"MainRu"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
threadCreate
(
&
t
,
ru_thread
,
(
void
*
)
ru
,
"MainRu"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
}
}
...
@@ -160,7 +161,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
...
@@ -160,7 +161,7 @@ void init_transport(PHY_VARS_eNB *eNB) {
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LOG_I
(
PHY
,
"Initialise transport
\n
"
);
LOG_I
(
PHY
,
"Initialise transport
\n
"
);
for
(
int
i
=
0
;
i
<
NUMBER_OF_
UE
_MAX
;
i
++
)
{
for
(
int
i
=
0
;
i
<
NUMBER_OF_
DLSCH
_MAX
;
i
++
)
{
LOG_D
(
PHY
,
"Allocating Transport Channel Buffers for DLSCH, UE %d
\n
"
,
i
);
LOG_D
(
PHY
,
"Allocating Transport Channel Buffers for DLSCH, UE %d
\n
"
,
i
);
for
(
int
j
=
0
;
j
<
2
;
j
++
)
{
for
(
int
j
=
0
;
j
<
2
;
j
++
)
{
...
@@ -169,7 +170,9 @@ void init_transport(PHY_VARS_eNB *eNB) {
...
@@ -169,7 +170,9 @@ void init_transport(PHY_VARS_eNB *eNB) {
eNB
->
dlsch
[
i
][
j
]
->
rnti
=
0
;
eNB
->
dlsch
[
i
][
j
]
->
rnti
=
0
;
LOG_D
(
PHY
,
"dlsch[%d][%d] => %p rnti:%d
\n
"
,
i
,
j
,
eNB
->
dlsch
[
i
][
j
],
eNB
->
dlsch
[
i
][
j
]
->
rnti
);
LOG_D
(
PHY
,
"dlsch[%d][%d] => %p rnti:%d
\n
"
,
i
,
j
,
eNB
->
dlsch
[
i
][
j
],
eNB
->
dlsch
[
i
][
j
]
->
rnti
);
}
}
}
for
(
int
i
=
0
;
i
<
NUMBER_OF_ULSCH_MAX
;
i
++
)
{
LOG_D
(
PHY
,
"Allocating Transport Channel Buffer for ULSCH, UE %d
\n
"
,
i
);
LOG_D
(
PHY
,
"Allocating Transport Channel Buffer for ULSCH, UE %d
\n
"
,
i
);
AssertFatal
((
eNB
->
ulsch
[
1
+
i
]
=
new_eNB_ulsch
(
MAX_TURBO_ITERATIONS
,
fp
->
N_RB_UL
,
0
))
!=
NULL
,
AssertFatal
((
eNB
->
ulsch
[
1
+
i
]
=
new_eNB_ulsch
(
MAX_TURBO_ITERATIONS
,
fp
->
N_RB_UL
,
0
))
!=
NULL
,
"Can't get eNB ulsch structures
\n
"
);
"Can't get eNB ulsch structures
\n
"
);
...
@@ -197,6 +200,9 @@ void init_transport(PHY_VARS_eNB *eNB) {
...
@@ -197,6 +200,9 @@ void init_transport(PHY_VARS_eNB *eNB) {
eNB
->
FULL_MUMIMO_transmissions
=
0
;
eNB
->
FULL_MUMIMO_transmissions
=
0
;
eNB
->
check_for_SUMIMO_transmissions
=
0
;
eNB
->
check_for_SUMIMO_transmissions
=
0
;
fp
->
pucch_config_common
.
deltaPUCCH_Shift
=
1
;
fp
->
pucch_config_common
.
deltaPUCCH_Shift
=
1
;
if
(
eNB
->
use_DTX
==
0
)
fill_subframe_mask
(
eNB
);
}
}
void
init_eNB_afterRU
(
void
)
{
void
init_eNB_afterRU
(
void
)
{
...
@@ -227,20 +233,18 @@ void init_eNB_afterRU(void) {
...
@@ -227,20 +233,18 @@ void init_eNB_afterRU(void) {
for
(
int
ce_level
=
0
;
ce_level
<
4
;
ce_level
++
)
for
(
int
ce_level
=
0
;
ce_level
<
4
;
ce_level
++
)
eNB
->
prach_vars_br
.
rxsigF
[
ce_level
][
aa
]
=
eNB
->
RU_list
[
ru_id
]
->
prach_rxsigF_br
[
ce_level
][
i
];
eNB
->
prach_vars_br
.
rxsigF
[
ce_level
][
aa
]
=
eNB
->
RU_list
[
ru_id
]
->
prach_rxsigF_br
[
ce_level
][
i
];
}
}
}
}
AssertFatal
(
eNB
->
frame_parms
.
nb_antennas_rx
>
0
&&
eNB
->
frame_parms
.
nb_antennas_rx
<
5
,
""
);
AssertFatal
(
eNB
->
frame_parms
.
nb_antennas_rx
>
0
&&
eNB
->
frame_parms
.
nb_antennas_rx
<
5
,
""
);
AssertFatal
(
eNB
->
frame_parms
.
nb_antennas_tx
>
0
&&
eNB
->
frame_parms
.
nb_antennas_rx
<
5
,
""
);
AssertFatal
(
eNB
->
frame_parms
.
nb_antennas_tx
>
0
&&
eNB
->
frame_parms
.
nb_antennas_rx
<
5
,
""
);
phy_init_lte_eNB
(
eNB
,
0
,
0
);
phy_init_lte_eNB
(
eNB
,
0
,
0
);
// need to copy rxdataF after L1 variables are allocated
// need to copy rxdataF after L1 variables are allocated
for
(
int
inst
=
0
;
inst
<
RC
.
nb_inst
;
inst
++
)
{
for
(
int
inst
=
0
;
inst
<
RC
.
nb_inst
;
inst
++
)
{
for
(
int
CC_id
=
0
;
CC_id
<
RC
.
nb_CC
[
inst
];
CC_id
++
)
{
for
(
int
CC_id
=
0
;
CC_id
<
RC
.
nb_CC
[
inst
];
CC_id
++
)
{
PHY_VARS_eNB
*
eNB
=
RC
.
eNB
[
inst
][
CC_id
];
PHY_VARS_eNB
*
eNB
=
RC
.
eNB
[
inst
][
CC_id
];
for
(
int
ru_id
=
0
,
aa
=
0
;
ru_id
<
eNB
->
num_RU
;
ru_id
++
)
{
for
(
int
ru_id
=
0
,
aa
=
0
;
ru_id
<
eNB
->
num_RU
;
ru_id
++
)
{
for
(
int
i
=
0
;
i
<
eNB
->
RU_list
[
ru_id
]
->
nb_rx
;
aa
++
,
i
++
)
for
(
int
i
=
0
;
i
<
eNB
->
RU_list
[
ru_id
]
->
nb_rx
;
aa
++
,
i
++
)
eNB
->
common_vars
.
rxdataF
[
aa
]
=
eNB
->
RU_list
[
ru_id
]
->
common
.
rxdataF
[
i
];
eNB
->
common_vars
.
rxdataF
[
aa
]
=
eNB
->
RU_list
[
ru_id
]
->
common
.
rxdataF
[
i
];
...
@@ -346,7 +350,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
...
@@ -346,7 +350,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg
->
samples_per_frame
=
19200
;
cfg
->
samples_per_frame
=
19200
;
cfg
->
tx_bw
=
1.5e6
;
cfg
->
tx_bw
=
1.5e6
;
cfg
->
rx_bw
=
1.5e6
;
cfg
->
rx_bw
=
1.5e6
;
}
else
AssertFatal
(
1
==
0
,
"Unknown N_RB_DL %d
\n
"
,
fp
->
N_RB_DL
);
}
else
AssertFatal
(
1
==
0
,
"Unknown N_RB_DL %d
\n
"
,
fp
->
N_RB_DL
);
if
(
fp
->
frame_type
==
TDD
)
if
(
fp
->
frame_type
==
TDD
)
cfg
->
duplex_mode
=
duplex_mode_TDD
;
cfg
->
duplex_mode
=
duplex_mode_TDD
;
...
@@ -467,7 +472,8 @@ void ocp_rx_prach(PHY_VARS_eNB *eNB,
...
@@ -467,7 +472,8 @@ void ocp_rx_prach(PHY_VARS_eNB *eNB,
((
prach_mask
&
(
1
<<
(
i
+
1
)))
>
0
))
{
// check that prach CE level is active now
((
prach_mask
&
(
1
<<
(
i
+
1
)))
>
0
))
{
// check that prach CE level is active now
// if first reception in group of repetitions store frame for later (in RA-RNTI for Msg2)
// if first reception in group of repetitions store frame for later (in RA-RNTI for Msg2)
if
(
eNB
->
prach_vars_br
.
repetition_number
[
i
]
==
0
)
eNB
->
prach_vars_br
.
first_frame
[
i
]
=
proc
->
frame_prach_br
;
if
(
eNB
->
prach_vars_br
.
repetition_number
[
i
]
==
0
)
eNB
->
prach_vars_br
.
first_frame
[
i
]
=
proc
->
frame_prach_br
;
// increment repetition number
// increment repetition number
eNB
->
prach_vars_br
.
repetition_number
[
i
]
++
;
eNB
->
prach_vars_br
.
repetition_number
[
i
]
++
;
...
@@ -770,7 +776,8 @@ static void *ru_thread( void *param ) {
...
@@ -770,7 +776,8 @@ static void *ru_thread( void *param ) {
// Start RF device if any
// Start RF device if any
if
(
ru
->
rfdevice
.
trx_start_func
(
&
ru
->
rfdevice
)
!=
0
)
if
(
ru
->
rfdevice
.
trx_start_func
(
&
ru
->
rfdevice
)
!=
0
)
LOG_E
(
HW
,
"Could not start the RF device
\n
"
);
LOG_E
(
HW
,
"Could not start the RF device
\n
"
);
else
LOG_I
(
PHY
,
"RU %d rf device ready
\n
"
,
ru
->
idx
);
else
LOG_I
(
PHY
,
"RU %d rf device ready
\n
"
,
ru
->
idx
);
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
...
@@ -830,7 +837,6 @@ void ocp_init_RU(RU_t *ru, char *rf_config_file, int send_dmrssync) {
...
@@ -830,7 +837,6 @@ void ocp_init_RU(RU_t *ru, char *rf_config_file, int send_dmrssync) {
RC
.
eNB
[
i
][
CC_id
]
->
num_RU
=
0
;
RC
.
eNB
[
i
][
CC_id
]
->
num_RU
=
0
;
LOG_D
(
PHY
,
"Process RUs RC.nb_RU:%d
\n
"
,
RC
.
nb_RU
);
LOG_D
(
PHY
,
"Process RUs RC.nb_RU:%d
\n
"
,
RC
.
nb_RU
);
ru
->
rf_config_file
=
rf_config_file
;
ru
->
rf_config_file
=
rf_config_file
;
ru
->
idx
=
0
;
ru
->
idx
=
0
;
ru
->
ts_offset
=
0
;
ru
->
ts_offset
=
0
;
...
@@ -884,7 +890,7 @@ void stop_RU(int nb_ru) {
...
@@ -884,7 +890,7 @@ void stop_RU(int nb_ru) {
/* --------------------------------------------------------*/
/* --------------------------------------------------------*/
/* from here function to use configuration module */
/* from here function to use configuration module */
static
int
DEFBFW
[]
=
{
0x00007fff
};
static
int
DEFBFW
[]
=
{
0x00007fff
};
void
ocpRCconfig_RU
(
RU_t
*
ru
)
{
void
ocpRCconfig_RU
(
RU_t
*
ru
)
{
paramdef_t
RUParams
[]
=
RUPARAMS_DESC
;
paramdef_t
RUParams
[]
=
RUPARAMS_DESC
;
paramlist_def_t
RUParamList
=
{
CONFIG_STRING_RU_LIST
,
NULL
,
0
};
paramlist_def_t
RUParamList
=
{
CONFIG_STRING_RU_LIST
,
NULL
,
0
};
config_getlist
(
&
RUParamList
,
RUParams
,
sizeof
(
RUParams
)
/
sizeof
(
paramdef_t
),
NULL
);
config_getlist
(
&
RUParamList
,
RUParams
,
sizeof
(
RUParams
)
/
sizeof
(
paramdef_t
),
NULL
);
...
@@ -963,7 +969,6 @@ void ocpRCconfig_RU(RU_t* ru) {
...
@@ -963,7 +969,6 @@ void ocpRCconfig_RU(RU_t* ru) {
ru
->
nb_rx
=
*
(
vals
[
RU_NB_RX_IDX
].
uptr
);
ru
->
nb_rx
=
*
(
vals
[
RU_NB_RX_IDX
].
uptr
);
ru
->
att_tx
=
*
(
vals
[
RU_ATT_TX_IDX
].
uptr
);
ru
->
att_tx
=
*
(
vals
[
RU_ATT_TX_IDX
].
uptr
);
ru
->
att_rx
=
*
(
vals
[
RU_ATT_RX_IDX
].
uptr
);
ru
->
att_rx
=
*
(
vals
[
RU_ATT_RX_IDX
].
uptr
);
return
;
return
;
}
}
...
@@ -1077,7 +1082,6 @@ void terminate_task(module_id_t mod_id, task_id_t from, task_id_t to) {
...
@@ -1077,7 +1082,6 @@ void terminate_task(module_id_t mod_id, task_id_t from, task_id_t to) {
int
stop_L1L2
(
module_id_t
enb_id
)
{
int
stop_L1L2
(
module_id_t
enb_id
)
{
LOG_W
(
ENB_APP
,
"stopping lte-softmodem
\n
"
);
LOG_W
(
ENB_APP
,
"stopping lte-softmodem
\n
"
);
/* these tasks need to pick up new configuration */
/* these tasks need to pick up new configuration */
terminate_task
(
enb_id
,
TASK_ENB_APP
,
TASK_RRC_ENB
);
terminate_task
(
enb_id
,
TASK_ENB_APP
,
TASK_RRC_ENB
);
oai_exit
=
1
;
oai_exit
=
1
;
...
@@ -1108,11 +1112,9 @@ int restart_L1L2(module_id_t enb_id) {
...
@@ -1108,11 +1112,9 @@ int restart_L1L2(module_id_t enb_id) {
pthread_mutex_lock
(
&
sync_mutex
);
pthread_mutex_lock
(
&
sync_mutex
);
sync_var
=
-
1
;
sync_var
=
-
1
;
pthread_mutex_unlock
(
&
sync_mutex
);
pthread_mutex_unlock
(
&
sync_mutex
);
/* copy the changed frame parameters to the RU */
/* copy the changed frame parameters to the RU */
/* TODO this should be done for all RUs associated to this eNB */
/* TODO this should be done for all RUs associated to this eNB */
memcpy
(
&
ru
->
frame_parms
,
&
RC
.
eNB
[
enb_id
][
0
]
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
memcpy
(
&
ru
->
frame_parms
,
&
RC
.
eNB
[
enb_id
][
0
]
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
/* reset the list of connected UEs in the MAC, since in this process with
/* reset the list of connected UEs in the MAC, since in this process with
* loose all UEs (have to reconnect) */
* loose all UEs (have to reconnect) */
init_UE_info
(
&
RC
.
mac
[
enb_id
]
->
UE_info
);
init_UE_info
(
&
RC
.
mac
[
enb_id
]
->
UE_info
);
...
@@ -1177,7 +1179,6 @@ int main ( int argc, char **argv ) {
...
@@ -1177,7 +1179,6 @@ int main ( int argc, char **argv ) {
// some initialization is necessary and init_ru_vnf do this.
// some initialization is necessary and init_ru_vnf do this.
RU_t
ru
;
RU_t
ru
;
/* We need to read RU configuration before FlexRAN starts so it knows what
/* We need to read RU configuration before FlexRAN starts so it knows what
* splits to report. Actual RU start comes later. */
* splits to report. Actual RU start comes later. */
if
(
NFAPI_MODE
!=
NFAPI_MODE_VNF
)
{
if
(
NFAPI_MODE
!=
NFAPI_MODE_VNF
)
{
...
@@ -1188,9 +1189,10 @@ int main ( int argc, char **argv ) {
...
@@ -1188,9 +1189,10 @@ int main ( int argc, char **argv ) {
}
}
if
(
strlen
(
get_softmodem_params
()
->
split73
)
>
0
)
{
if
(
strlen
(
get_softmodem_params
()
->
split73
)
>
0
)
{
char
tmp
[
1024
]
=
{
0
};
char
tmp
[
1024
]
=
{
0
};
strncpy
(
tmp
,
get_softmodem_params
()
->
split73
,
1023
);
strncpy
(
tmp
,
get_softmodem_params
()
->
split73
,
1023
);
tmp
[
2
]
=
0
;
tmp
[
2
]
=
0
;
if
(
strncasecmp
(
tmp
,
"cu"
,
2
)
==
0
)
if
(
strncasecmp
(
tmp
,
"cu"
,
2
)
==
0
)
split73
=
SPLIT73_CU
;
split73
=
SPLIT73_CU
;
else
if
(
strncasecmp
(
tmp
,
"du"
,
2
)
==
0
)
else
if
(
strncasecmp
(
tmp
,
"du"
,
2
)
==
0
)
...
@@ -1283,17 +1285,14 @@ int main ( int argc, char **argv ) {
...
@@ -1283,17 +1285,14 @@ int main ( int argc, char **argv ) {
printf
(
"About to Init RU threads RC.nb_RU:%d
\n
"
,
RC
.
nb_RU
);
printf
(
"About to Init RU threads RC.nb_RU:%d
\n
"
,
RC
.
nb_RU
);
if
(
RC
.
nb_RU
>
0
&&
NFAPI_MODE
!=
NFAPI_MODE_VNF
)
{
if
(
RC
.
nb_RU
>
0
&&
NFAPI_MODE
!=
NFAPI_MODE_VNF
)
{
printf
(
"Initializing RU threads
\n
"
);
printf
(
"Initializing RU threads
\n
"
);
ocp_init_RU
(
&
ru
,
ocp_init_RU
(
&
ru
,
get_softmodem_params
()
->
rf_config_file
,
get_softmodem_params
()
->
rf_config_file
,
get_softmodem_params
()
->
send_dmrs_sync
);
get_softmodem_params
()
->
send_dmrs_sync
);
ru
.
rf_map
.
card
=
0
;
ru
.
rf_map
.
card
=
0
;
ru
.
rf_map
.
chain
=
CC_id
+
(
get_softmodem_params
()
->
chain_offset
);
ru
.
rf_map
.
chain
=
CC_id
+
(
get_softmodem_params
()
->
chain_offset
);
init_RU_proc
(
&
ru
);
init_RU_proc
(
&
ru
);
config_sync_var
=
0
;
config_sync_var
=
0
;
if
(
NFAPI_MODE
==
NFAPI_MODE_PNF
)
{
// PNF
if
(
NFAPI_MODE
==
NFAPI_MODE_PNF
)
{
// PNF
...
@@ -1364,7 +1363,6 @@ int main ( int argc, char **argv ) {
...
@@ -1364,7 +1363,6 @@ int main ( int argc, char **argv ) {
pthread_cond_destroy
(
&
nfapi_sync_cond
);
pthread_cond_destroy
(
&
nfapi_sync_cond
);
pthread_mutex_destroy
(
&
nfapi_sync_mutex
);
pthread_mutex_destroy
(
&
nfapi_sync_mutex
);
pthread_mutex_destroy
(
&
ue_pf_po_mutex
);
pthread_mutex_destroy
(
&
ue_pf_po_mutex
);
}
}
terminate_opt
();
terminate_opt
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment