Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
eac02b76
提交
eac02b76
authored
12月 21, 2016
作者:
colm
提交者:
Mike Jerris
1月 25, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
FS-9775: Implement deinit dht routetable
上级
59608400
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
120 行增加
和
27 行删除
+120
-27
ks_dht_bucket.c
libs/libks/src/dht/ks_dht_bucket.c
+107
-25
testbuckets.c
libs/libks/test/testbuckets.c
+13
-2
没有找到文件。
libs/libks/src/dht/ks_dht_bucket.c
浏览文件 @
eac02b76
...
@@ -44,7 +44,7 @@
...
@@ -44,7 +44,7 @@
#define KS_DHTRT_MAXPING 3
#define KS_DHTRT_MAXPING 3
#define KS_DHTRT_PROCESSTABLE_INTERVAL (5*60)
#define KS_DHTRT_PROCESSTABLE_INTERVAL (5*60)
#define KS_DHTRT_PROCESSTABLE_SHORTINTERVAL (120)
#define KS_DHTRT_PROCESSTABLE_SHORTINTERVAL (120)
#define KS_DHTRT_RECYCLE_NODE_THRESHOLD 0
#define KS_DHTRT_RECYCLE_NODE_THRESHOLD
10
0
/* peer flags */
/* peer flags */
#define DHTPEER_DUBIOUS 0
#define DHTPEER_DUBIOUS 0
...
@@ -157,7 +157,7 @@ int ks_dhtrt_ismasked(const uint8_t *id1, const uint8_t *mask);
...
@@ -157,7 +157,7 @@ int ks_dhtrt_ismasked(const uint8_t *id1, const uint8_t *mask);
static
static
void
ks_dhtrt_queue_node_fordelete
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_node_t
*
node
);
void
ks_dhtrt_queue_node_fordelete
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_node_t
*
node
);
static
static
void
ks_dhtrt_process_deleted
(
ks_dhtrt_routetable_t
*
table
);
void
ks_dhtrt_process_deleted
(
ks_dhtrt_routetable_t
*
table
,
int8_t
all
);
static
static
ks_dht_node_t
*
ks_dhtrt_make_node
(
ks_dhtrt_routetable_t
*
table
);
ks_dht_node_t
*
ks_dhtrt_make_node
(
ks_dhtrt_routetable_t
*
table
);
...
@@ -195,7 +195,7 @@ void ks_dhtrt_ping(ks_dhtrt_internal_t *table, ks_dhtrt_bucket_entry_t *entry);
...
@@ -195,7 +195,7 @@ void ks_dhtrt_ping(ks_dhtrt_internal_t *table, ks_dhtrt_bucket_entry_t *entry);
/* very verbose */
/* very verbose */
/* # define KS_DHT_DEBUGPRINTFX_ */
/* # define KS_DHT_DEBUGPRINTFX_ */
/* debug locking */
/* debug locking */
#define KS_DHT_DEBUGLOCKPRINTF_
/* #define KS_DHT_DEBUGLOCKPRINTF_ */
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_initroute
(
ks_dhtrt_routetable_t
**
tableP
,
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_initroute
(
ks_dhtrt_routetable_t
**
tableP
,
ks_dht_t
*
dht
,
ks_dht_t
*
dht
,
...
@@ -231,13 +231,52 @@ KS_DECLARE(ks_status_t) ks_dhtrt_initroute(ks_dhtrt_routetable_t **tableP,
...
@@ -231,13 +231,52 @@ KS_DECLARE(ks_status_t) ks_dhtrt_initroute(ks_dhtrt_routetable_t **tableP,
return
KS_STATUS_SUCCESS
;
return
KS_STATUS_SUCCESS
;
}
}
KS_DECLARE
(
void
)
ks_dhtrt_deinitroute
(
ks_dhtrt_routetable_t
**
table
)
KS_DECLARE
(
void
)
ks_dhtrt_deinitroute
(
ks_dhtrt_routetable_t
**
table
P
)
{
{
/* @todo*/
/* @todo*/
ks_dhtrt_routetable_t
*
table
=
*
tableP
;
ks_pool_t
*
pool
=
(
*
table
)
->
pool
;
if
(
!
table
||
!
table
->
internal
)
{
return
;
}
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_write_lock
(
internal
->
lock
);
/* grab write lock */
ks_dhtrt_process_deleted
(
table
,
1
);
table
->
internal
=
NULL
;
/* make sure no other threads get in */
ks_pool_t
*
pool
=
table
->
pool
;
ks_dhtrt_bucket_header_t
*
header
=
internal
->
buckets
;
ks_dhtrt_bucket_header_t
*
last_header
;
ks_dhtrt_bucket_header_t
*
stack
[
KS_DHT_NODEID_SIZE
*
8
];
int
stackix
=
0
;
ks_pool_free
(
pool
,
&
(
*
table
));
while
(
header
)
{
stack
[
stackix
++
]
=
header
;
if
(
header
->
bucket
)
{
ks_pool_free
(
pool
,
&
header
->
bucket
);
header
->
bucket
=
NULL
;
}
last_header
=
header
;
header
=
header
->
left
;
if
(
header
==
0
&&
stackix
>
1
)
{
stackix
-=
2
;
header
=
stack
[
stackix
];
header
=
header
->
right
;
#ifdef KS_DHT_DEBUGLOCKPRINTFX_
char
buf
[
100
];
ks_log
(
KS_LOG_DEBUG
,
"deinit: freeing bucket header %s
\n
"
,
ks_dhtrt_printableid
(
last_header
->
mask
,
buf
));
#endif
ks_pool_free
(
pool
,
&
last_header
);
}
}
ks_pool_free
(
pool
,
&
internal
);
ks_pool_free
(
pool
,
&
table
);
*
tableP
=
NULL
;
return
;
return
;
}
}
...
@@ -249,8 +288,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_create_node( ks_dhtrt_routetable_t *table,
...
@@ -249,8 +288,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_create_node( ks_dhtrt_routetable_t *table,
unsigned
short
port
,
unsigned
short
port
,
ks_dht_node_t
**
node
)
ks_dht_node_t
**
node
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
KS_STATUS_FAIL
;
}
ks_dht_node_t
*
tnode
;
ks_dht_node_t
*
tnode
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_read_lock
(
internal
->
lock
);
/* grab write lock and insert */
ks_rwl_read_lock
(
internal
->
lock
);
/* grab write lock and insert */
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
...
@@ -306,8 +350,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_create_node( ks_dhtrt_routetable_t *table,
...
@@ -306,8 +350,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_create_node( ks_dhtrt_routetable_t *table,
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_delete_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_node_t
*
node
)
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_delete_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_node_t
*
node
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
KS_STATUS_FAIL
;
}
ks_status_t
s
=
KS_STATUS_FAIL
;
ks_status_t
s
=
KS_STATUS_FAIL
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
node
->
nodeid
.
id
);
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
node
->
nodeid
.
id
);
...
@@ -339,8 +388,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_delete_node(ks_dhtrt_routetable_t *table, ks_dh
...
@@ -339,8 +388,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_delete_node(ks_dhtrt_routetable_t *table, ks_dh
static
static
ks_status_t
ks_dhtrt_insert_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_node_t
*
node
)
ks_status_t
ks_dhtrt_insert_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_node_t
*
node
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
KS_STATUS_FAIL
;
}
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_bucket_t
*
bucket
=
0
;
ks_dhtrt_bucket_t
*
bucket
=
0
;
int
insanity
=
0
;
int
insanity
=
0
;
ks_rwl_write_lock
(
internal
->
lock
);
ks_rwl_write_lock
(
internal
->
lock
);
...
@@ -465,10 +519,13 @@ ks_status_t ks_dhtrt_insert_node(ks_dhtrt_routetable_t *table, ks_dht_node_t *no
...
@@ -465,10 +519,13 @@ ks_status_t ks_dhtrt_insert_node(ks_dhtrt_routetable_t *table, ks_dht_node_t *no
KS_DECLARE
(
ks_dht_node_t
*
)
ks_dhtrt_find_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_nodeid_t
nodeid
)
KS_DECLARE
(
ks_dht_node_t
*
)
ks_dhtrt_find_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_nodeid_t
nodeid
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
NULL
;
}
ks_dht_node_t
*
node
=
NULL
;
ks_dht_node_t
*
node
=
NULL
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
...
@@ -504,8 +561,13 @@ KS_DECLARE(ks_dht_node_t *) ks_dhtrt_find_node(ks_dhtrt_routetable_t *table, ks_
...
@@ -504,8 +561,13 @@ KS_DECLARE(ks_dht_node_t *) ks_dhtrt_find_node(ks_dhtrt_routetable_t *table, ks_
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_touch_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_nodeid_t
nodeid
)
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_touch_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_nodeid_t
nodeid
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
KS_STATUS_FAIL
;
}
ks_status_t
s
=
KS_STATUS_FAIL
;
ks_status_t
s
=
KS_STATUS_FAIL
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
...
@@ -542,8 +604,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_touch_node(ks_dhtrt_routetable_t *table, ks_dh
...
@@ -542,8 +604,13 @@ KS_DECLARE(ks_status_t) ks_dhtrt_touch_node(ks_dhtrt_routetable_t *table, ks_dh
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_expire_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_nodeid_t
nodeid
)
KS_DECLARE
(
ks_status_t
)
ks_dhtrt_expire_node
(
ks_dhtrt_routetable_t
*
table
,
ks_dht_nodeid_t
nodeid
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
KS_STATUS_FAIL
;
}
ks_status_t
s
=
KS_STATUS_FAIL
;
ks_status_t
s
=
KS_STATUS_FAIL
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
ks_dhtrt_bucket_header_t
*
header
=
ks_dhtrt_find_bucketheader
(
table
,
nodeid
.
id
);
...
@@ -563,8 +630,14 @@ KS_DECLARE(ks_status_t) ks_dhtrt_expire_node(ks_dhtrt_routetable_t *table, ks_dh
...
@@ -563,8 +630,14 @@ KS_DECLARE(ks_status_t) ks_dhtrt_expire_node(ks_dhtrt_routetable_t *table, ks_dh
KS_DECLARE
(
uint8_t
)
ks_dhtrt_findclosest_nodes
(
ks_dhtrt_routetable_t
*
table
,
ks_dhtrt_querynodes_t
*
query
)
KS_DECLARE
(
uint8_t
)
ks_dhtrt_findclosest_nodes
(
ks_dhtrt_routetable_t
*
table
,
ks_dhtrt_querynodes_t
*
query
)
{
{
if
(
!
table
||
!
table
->
internal
)
{
return
KS_STATUS_FAIL
;
query
->
count
=
0
;
}
uint8_t
count
=
0
;
uint8_t
count
=
0
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
ks_rwl_read_lock
(
internal
->
lock
);
/* grab read lock */
count
=
ks_dhtrt_findclosest_locked_nodes
(
table
,
query
);
count
=
ks_dhtrt_findclosest_locked_nodes
(
table
,
query
);
ks_rwl_read_unlock
(
internal
->
lock
);
/* release read lock */
ks_rwl_read_unlock
(
internal
->
lock
);
/* release read lock */
...
@@ -822,6 +895,10 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
...
@@ -822,6 +895,10 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
/* inactive again it is considered inactive */
/* inactive again it is considered inactive */
/* */
/* */
if
(
!
table
||
!
table
->
internal
)
{
return
;
}
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
int
ping_count
=
0
;
int
ping_count
=
0
;
...
@@ -875,8 +952,9 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
...
@@ -875,8 +952,9 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
if
(
e
->
flags
!=
DHTPEER_EXPIRED
&&
if
(
e
->
flags
!=
DHTPEER_EXPIRED
&&
e
->
outstanding_pings
>=
KS_DHTRT_MAXPING
)
{
e
->
outstanding_pings
>=
KS_DHTRT_MAXPING
)
{
#ifdef KS_DHT_DEBUGPRINTF_
#ifdef KS_DHT_DEBUGPRINTF_
char
buf1
[
100
];
ks_log
(
KS_LOG_DEBUG
,
"process_table: expiring node %s
\n
"
,
ks_log
(
KS_LOG_DEBUG
,
"process_table: expiring node %s
\n
"
,
ks_dhtrt_printableid
(
e
->
id
,
buf
));
ks_dhtrt_printableid
(
e
->
id
,
buf
1
));
#endif
#endif
e
->
flags
=
DHTPEER_EXPIRED
;
e
->
flags
=
DHTPEER_EXPIRED
;
++
b
->
expired_count
;
++
b
->
expired_count
;
...
@@ -912,8 +990,8 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
...
@@ -912,8 +990,8 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
}
/* end for each bucket_entry */
}
/* end for each bucket_entry */
#ifdef KS_DHT_DEBUGLOCKPRINTF_
#ifdef KS_DHT_DEBUGLOCKPRINTF_
char
buf
1
[
100
];
char
buf
[
100
];
ks_log
(
KS_LOG_DEBUG
,
"process_table: UNLOCKING bucket %s
\n
"
,
ks_dhtrt_printableid
(
header
->
mask
,
buf
1
));
ks_log
(
KS_LOG_DEBUG
,
"process_table: UNLOCKING bucket %s
\n
"
,
ks_dhtrt_printableid
(
header
->
mask
,
buf
));
#endif
#endif
ks_rwl_write_unlock
(
b
->
lock
);
ks_rwl_write_unlock
(
b
->
lock
);
...
@@ -921,8 +999,8 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
...
@@ -921,8 +999,8 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
}
/* end of if trywrite_lock successful */
}
/* end of if trywrite_lock successful */
else
{
else
{
#ifdef KS_DHT_DEBUGPRINTF_
#ifdef KS_DHT_DEBUGPRINTF_
char
buf
2
[
100
];
char
buf
1
[
100
];
ks_log
(
KS_LOG_DEBUG
,
"process_table: unble to LOCK bucket %s
\n
"
,
ks_dhtrt_printableid
(
header
->
mask
,
buf
2
));
ks_log
(
KS_LOG_DEBUG
,
"process_table: unble to LOCK bucket %s
\n
"
,
ks_dhtrt_printableid
(
header
->
mask
,
buf
1
));
#endif
#endif
}
}
}
}
...
@@ -937,7 +1015,7 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
...
@@ -937,7 +1015,7 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
}
}
ks_rwl_read_unlock
(
internal
->
lock
);
/* release read lock */
ks_rwl_read_unlock
(
internal
->
lock
);
/* release read lock */
ks_dhtrt_process_deleted
(
table
);
ks_dhtrt_process_deleted
(
table
,
0
);
if
(
ping_count
==
0
)
{
if
(
ping_count
==
0
)
{
internal
->
next_process_table_delta
=
KS_DHTRT_PROCESSTABLE_INTERVAL
;
internal
->
next_process_table_delta
=
KS_DHTRT_PROCESSTABLE_INTERVAL
;
...
@@ -950,7 +1028,7 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
...
@@ -950,7 +1028,7 @@ KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
return
;
return
;
}
}
void
ks_dhtrt_process_deleted
(
ks_dhtrt_routetable_t
*
table
)
void
ks_dhtrt_process_deleted
(
ks_dhtrt_routetable_t
*
table
,
int8_t
all
)
{
{
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_dhtrt_internal_t
*
internal
=
table
->
internal
;
ks_mutex_lock
(
internal
->
deleted_node_lock
);
ks_mutex_lock
(
internal
->
deleted_node_lock
);
...
@@ -958,18 +1036,22 @@ void ks_dhtrt_process_deleted(ks_dhtrt_routetable_t *table)
...
@@ -958,18 +1036,22 @@ void ks_dhtrt_process_deleted(ks_dhtrt_routetable_t *table)
ks_dhtrt_deletednode_t
*
deleted
=
internal
->
deleted_node
;
ks_dhtrt_deletednode_t
*
deleted
=
internal
->
deleted_node
;
ks_dhtrt_deletednode_t
*
prev
=
NULL
,
*
temp
=
NULL
;
ks_dhtrt_deletednode_t
*
prev
=
NULL
,
*
temp
=
NULL
;
#ifdef KS_DHT_DEBUGPRINTF_
#ifdef KS_DHT_DEBUGPRINTF
X
_
ks_log
(
KS_LOG_DEBUG
,
"ALLOC process_deleted entry: internal->deleted_count %d
\n
"
,
internal
->
deleted_count
);
ks_log
(
KS_LOG_DEBUG
,
"ALLOC process_deleted entry: internal->deleted_count %d
\n
"
,
internal
->
deleted_count
);
#endif
#endif
/* reclaim excess memory */
/* reclaim excess memory */
printf
(
"%d %d %p
\n
"
,
internal
->
deleted_count
,
KS_DHTRT_RECYCLE_NODE_THRESHOLD
,
(
void
*
)
deleted
);
fflush
(
stdout
);
uint32_t
threshold
=
KS_DHTRT_RECYCLE_NODE_THRESHOLD
;
if
(
all
)
{
threshold
=
1
;
}
while
(
internal
->
deleted_count
>
KS_DHTRT_RECYCLE_NODE_THRESHOLD
&&
deleted
)
{
while
(
internal
->
deleted_count
>
threshold
&&
deleted
)
{
ks_dht_node_t
*
node
=
deleted
->
node
;
ks_dht_node_t
*
node
=
deleted
->
node
;
#ifdef KS_DHT_DEBUGPRINTF_
#ifdef KS_DHT_DEBUGPRINTF
X
_
ks_log
(
KS_LOG_DEBUG
,
"ALLOC process_deleted entry: try write lock
\n
"
);
ks_log
(
KS_LOG_DEBUG
,
"ALLOC process_deleted entry: try write lock
\n
"
);
#endif
#endif
...
@@ -992,7 +1074,7 @@ void ks_dhtrt_process_deleted(ks_dhtrt_routetable_t *table)
...
@@ -992,7 +1074,7 @@ void ks_dhtrt_process_deleted(ks_dhtrt_routetable_t *table)
}
}
else
{
else
{
#ifdef KS_DHT_DEBUGPRINTF_
#ifdef KS_DHT_DEBUGPRINTF
X
_
ks_log
(
KS_LOG_DEBUG
,
"ALLOC process_deleted entry: try write lock failed
\n
"
);
ks_log
(
KS_LOG_DEBUG
,
"ALLOC process_deleted entry: try write lock failed
\n
"
);
#endif
#endif
prev
=
deleted
;
prev
=
deleted
;
...
...
libs/libks/test/testbuckets.c
浏览文件 @
eac02b76
...
@@ -357,6 +357,8 @@ ks_dht_node_t* g_peer;
...
@@ -357,6 +357,8 @@ ks_dht_node_t* g_peer;
static
void
*
testnodelocking_ex1
(
ks_thread_t
*
thread
,
void
*
data
)
static
void
*
testnodelocking_ex1
(
ks_thread_t
*
thread
,
void
*
data
)
{
{
//lock=3 on entry
ks_dhtrt_release_node
(
g_peer
);
//lock=2
ks_dhtrt_release_node
(
g_peer
);
//lock=1
ks_dhtrt_release_node
(
g_peer
);
//lock=1
ks_dhtrt_release_node
(
g_peer
);
//lock=0
ks_dhtrt_release_node
(
g_peer
);
//lock=0
return
NULL
;
return
NULL
;
...
@@ -364,9 +366,17 @@ static void *testnodelocking_ex1(ks_thread_t *thread, void *data)
...
@@ -364,9 +366,17 @@ static void *testnodelocking_ex1(ks_thread_t *thread, void *data)
static
void
*
testnodelocking_ex2
(
ks_thread_t
*
thread
,
void
*
data
)
static
void
*
testnodelocking_ex2
(
ks_thread_t
*
thread
,
void
*
data
)
{
{
ks_dht_node_t
*
peer2
=
ks_dhtrt_find_node
(
rt
,
g_nodeid1
);
//lock=4
// lock=4 on entry
ks_dht_node_t
*
peer2
=
ks_dhtrt_find_node
(
rt
,
g_nodeid1
);
//lock=5
ks_dhtrt_release_node
(
peer2
);
//lock=4
ks_dhtrt_sharelock_node
(
peer2
);
//lock=5
ks_dhtrt_release_node
(
peer2
);
//lock=4
ks_dhtrt_sharelock_node
(
peer2
);
//lock=5
ks_dhtrt_release_node
(
peer2
);
//lock=4
ks_dhtrt_release_node
(
peer2
);
//lock=3
ks_dhtrt_release_node
(
peer2
);
//lock=3
ks_dhtrt_release_node
(
peer2
);
//lock=2
ks_dhtrt_find_node
(
rt
,
g_nodeid1
);
//lock=4
ks_dhtrt_release_node
(
peer2
);
//lock=3
return
NULL
;
return
NULL
;
}
}
...
@@ -391,6 +401,7 @@ void test06()
...
@@ -391,6 +401,7 @@ void test06()
peer2
=
ks_dhtrt_find_node
(
rt
,
g_nodeid1
);
//lock=4
peer2
=
ks_dhtrt_find_node
(
rt
,
g_nodeid1
);
//lock=4
ks_dhtrt_release_node
(
peer2
);
//lock=3
ks_dhtrt_release_node
(
peer2
);
//lock=3
ks_dhtrt_sharelock_node
(
peer2
);
//lock=4
g_peer
=
peer2
;
g_peer
=
peer2
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论