Added reference count to completion event channels.

Signed-off-by: Dotan Barak <[EMAIL PROTECTED]>

---

Index: gen2_devel_user/src/userspace/libibverbs/include/infiniband/verbs.h
===================================================================
--- gen2_devel_user.orig/src/userspace/libibverbs/include/infiniband/verbs.h    
2007-02-26 16:01:56.000000000 +0200
+++ gen2_devel_user/src/userspace/libibverbs/include/infiniband/verbs.h 
2007-03-04 10:44:34.696598288 +0200
@@ -546,11 +546,14 @@ struct ibv_qp {
 };
 
 struct ibv_comp_channel {
+       pthread_mutex_t         mutex;
+       int                     refcnt;
        int                     fd;
 };
 
 struct ibv_cq {
        struct ibv_context     *context;
+       struct ibv_comp_channel *channel;
        void                   *cq_context;
        uint32_t                handle;
        int                     cqe;
Index: gen2_devel_user/src/userspace/libibverbs/src/verbs.c
===================================================================
--- gen2_devel_user.orig/src/userspace/libibverbs/src/verbs.c   2007-02-26 
16:01:56.000000000 +0200
+++ gen2_devel_user/src/userspace/libibverbs/src/verbs.c        2007-03-04 
10:42:41.073871568 +0200
@@ -226,7 +226,9 @@ struct ibv_comp_channel *ibv_create_comp
                return NULL;
        }
 
-       channel->fd = resp.fd;
+       channel->refcnt = 0;
+       channel->fd     = resp.fd;
+       pthread_mutex_init(&channel->mutex, NULL);
 
        return channel;
 }
@@ -243,6 +245,12 @@ int ibv_destroy_comp_channel(struct ibv_
        if (abi_ver <= 2)
                return ibv_destroy_comp_channel_v2(channel);
 
+       pthread_mutex_lock(&channel->mutex);
+       if (channel->refcnt) {
+               pthread_mutex_unlock(&channel->mutex);
+               return EBUSY;
+       }
+       pthread_mutex_unlock(&channel->mutex);
        close(channel->fd);
        free(channel);
 
@@ -260,8 +268,14 @@ struct ibv_cq *__ibv_create_cq(struct ib
                cq->cq_context             = cq_context;
                cq->comp_events_completed  = 0;
                cq->async_events_completed = 0;
+               cq->channel                = channel;
                pthread_mutex_init(&cq->mutex, NULL);
                pthread_cond_init(&cq->cond, NULL);
+               if (channel) {
+                       pthread_mutex_lock(&channel->mutex);
+                       channel->refcnt++;
+                       pthread_mutex_unlock(&channel->mutex);
+               }
        }
 
        return cq;
@@ -279,7 +293,17 @@ default_symver(__ibv_resize_cq, ibv_resi
 
 int __ibv_destroy_cq(struct ibv_cq *cq)
 {
-       return cq->context->ops.destroy_cq(cq);
+       struct ibv_comp_channel *channel = cq->channel;
+       int ret;
+
+       ret = cq->context->ops.destroy_cq(cq);
+       if (!ret && channel) {
+               pthread_mutex_lock(&channel->mutex);
+               channel->refcnt--;
+               pthread_mutex_unlock(&channel->mutex);
+       }
+
+       return ret;
 }
 default_symver(__ibv_destroy_cq, ibv_destroy_cq);
 


_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to