<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>hi, all</div><div>    I do a hotplug detach a network in a thread,  because virDomainDetachDeviceFlags maybe asynchronous, so I do like follow:</div><div>    cb_para->cluster_id = info->cluster_id;<br>    cb_para->group_id = info->group_id;<br>    cb_para->vsys_id = info->vsysid;<br>    cb_para->vnf_id = info->vnf_id;<br>    cb_para->conn = conn;<br>    cb_para->time_out = 20*1000;//20s<br>    cb_para->call_id = virConnectDomainEventRegisterAny(conn, dom, VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, VIR_DOMAIN_EVENT_CALLBACK(vnf_control_del_network_cb), cb_para, vnf_control_del_network_cb_free);<br>    flags |= VIR_DOMAIN_AFFECT_CONFIG;<br>    if (virDomainIsActive(dom) == 1) {<br>        flags |= VIR_DOMAIN_AFFECT_LIVE;<br>    }<br><br>    cb_para->timer_id = virEventAddTimeout(cb_para->time_out, vnf_control_del_network_timeout_cb, cb_para, vnf_control_del_network_cb_free);<br>    ret = virDomainDetachDeviceFlags(dom, xml, flags);</div><div>//above run in a thread function<br></div><div><br></div><div><br></div><div>void vnf_control_del_network_cb(virConnectPtr conn,        virDomainPtr dom, const  char  *dev,void * opaque)<br>{<br>    struct vnf_del_netwk_opaque * arg = (struct vnf_del_netwk_opaque *)opaque;   <br></div><div>   if(0 == virConnectDomainEventDeregisterAny(conn, arg->call_id)) {<br>        VNF_DBG("succ to deRegister, conn:%p, call id:%d\n", conn, arg->call_id);<br>    } else {<br>        VNF_DBG("fail to deRegister, conn:%p, call id:%d\n", conn, arg->call_id);<br>    }<br>    ....................<br></div><div>  virEventRemoveTimeout(arg->timer_id);<br>}<br></div><div><br></div><div><br></div><div>void vnf_control_del_network_timeout_cb(int timer, void *opaque)<br>{<br>    struct vnf_del_netwk_opaque * arg = (struct vnf_del_netwk_opaque *)opaque;<br>    ................<br>    if(0 == <span style="background-color: rgb(221, 64, 50);">virConnectDomainEventDeregisterAny</span>(arg->conn, arg->call_id)) {   //here, dead lock ,are thoses APIs not correct using ??<br>        VNF_DBG("succ to deRegister, conn:%p, call id:%d\n", arg->conn, arg->call_id);<br>    } else {<br>        VNF_DBG("fail to deRegister, conn:%p, call id:%d\n", arg->conn, arg->call_id);<br>    }<br>       virEventRemoveTimeout(arg->timer_id);<br>}<br></div><div><br></div><div>(gdb) i threads </div><p style="margin:0;">  Id   Target Id         Frame <br>  7    Thread 0x7f29fa5ff700 (LWP 104950) "vnfd" 0x00007f2a064f656d in nanosleep () from /lib64/libc.so.6<br>  6    Thread 0x7f29f9bfe700 (LWP 104951) "vnfd" 0x00007f2a0761851d in __lll_lock_wait () from /lib64/libpthread.so.0<br>  5    Thread 0x7f29f8dff700 (LWP 104952) "vnfd" 0x00007f2a064f656d in nanosleep () from /lib64/libc.so.6<br>  4    Thread 0x7f29f7fff700 (LWP 104953) "vnfd" 0x00007f2a064f656d in nanosleep () from /lib64/libc.so.6<br>  3    Thread 0x7f29f71ff700 (LWP 104954) "vnfd" 0x00007f2a064f656d in nanosleep () from /lib64/libc.so.6<br>  2    Thread 0x7f29f63ff700 (LWP 104955) "vnfd" 0x00007f2a064f656d in nanosleep () from /lib64/libc.so.6<br>* 1    Thread 0x7f2a087f8900 (LWP 104946) "vnfd" 0x00007f2a06530183 in epoll_wait () from /lib64/libc.so.6<br>(gdb) thread 6<br>[Switching to thread 6 (Thread 0x7f29f9bfe700 (LWP 104951))]<br>#0  0x00007f2a0761851d in __lll_lock_wait () from /lib64/libpthread.so.0<br>(gdb) bt<br>#0  0x00007f2a0761851d in __lll_lock_wait () from /lib64/libpthread.so.0<br>#1  0x00007f2a07613e1b in _L_lock_812 () from /lib64/libpthread.so.0<br>#2  0x00007f2a07613ce8 in pthread_mutex_lock () from /lib64/libpthread.so.0<br>#3  0x00007f2a072a1a0e in remoteConnectClose () from /lib64/libvirt.so.0<br>#4  0x00007f2a072b2740 in virConnectDispose () from /lib64/libvirt.so.0<br>#5  0x00007f2a0710bbab in virObjectUnref () from /lib64/libvirt.so.0<br>#6  0x00007f2a07195577 in virObjectEventCallbackFree () from /lib64/libvirt.so.0<br>#7  0x00007f2a07196532 in virObjectEventStateDeregisterID () from /lib64/libvirt.so.0<br>#8  0x00007f2a07287238 in remoteConnectDomainEventDeregisterAny () from /lib64/libvirt.so.0<br>#9  0x00007f2a072d36d7 in virConnectDomainEventDeregisterAny () from /lib64/libvirt.so.0<br>#10 0x0000000000405bce in vnf_control_del_network_timeout_cb (timer=<optimized out>, opaque=0x7f29e9e99de0) at vnf_mgt/vnf_control.c:1293<br>#11 0x00007f2a070d20e9 in virEventPollRunOnce () from /lib64/libvirt.so.0<br>#12 0x00007f2a070d0a42 in virEventRunDefaultImpl () from /lib64/libvirt.so.0<br>#13 0x000000000040d099 in vnf_worker_proc (arg=<optimized out>) at vnf_mgt/vnf_control.c:1727<br>#14 0x00007f2a07611e25 in start_thread () from /lib64/libpthread.so.0<br>#15 0x00007f2a0652fbad in clone () from /lib64/libc.so.6<br>(gdb) f 10<br>#10 0x0000000000405bce in vnf_control_del_network_timeout_cb (timer=<optimized out>, opaque=0x7f29e9e99de0) at vnf_mgt/vnf_control.c:1293<br>1293            if(0 == virConnectDomainEventDeregisterAny(arg->conn, arg->call_id)) {<br>(gdb) p arg->time_id<br>There is no member named time_id.<br>(gdb) set print pretty<br>(gdb) p *arg<br>$1 = {<br>  cluster_id = 0, <br>  vsys_id = 0, <br>  group_id = 2, <br>  vnf_id = 1, <br>  call_id = 0, <br>  timer_id = 16, <br>  time_out = 20000, <br>  conn = 0x7f29f8013000<br>}<br>(gdb) quit<br>A debugging session is active.<br></p></div><br><br><span title="neteasefooter"><p> </p></span>