Lines Matching refs:dpsp

116 static void vlds_recvq_init(vlds_svc_info_t *dpsp);
117 static void vlds_recvq_destroy(vlds_svc_info_t *dpsp);
118 static int vlds_recvq_get_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen,
120 static void vlds_recvq_drain(vlds_svc_info_t *dpsp);
121 static int vlds_recvq_put_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen);
1352 vlds_svc_info_t *dpsp;
1363 dpsp = DS_MALLOC(sizeof (vlds_svc_info_t));
1364 vlds_recvq_init(dpsp);
1365 ds_cbarg_set_drv_per_svc_ptr(arg, dpsp);
1404 void *dpsp;
1411 ds_cbarg_get_drv_per_svc_ptr(arg, &dpsp);
1412 if (dpsp) {
1415 vlds_recvq_drain(dpsp);
1416 vlds_recvq_destroy(dpsp);
1446 void *dpsp;
1454 ds_cbarg_get_drv_per_svc_ptr(arg, &dpsp);
1455 ASSERT(dpsp != NULL);
1458 (void) vlds_recvq_put_data(dpsp, buf, buflen);
1483 vlds_recvq_init(vlds_svc_info_t *dpsp)
1485 dpsp->state = VLDS_RECV_OK;
1486 mutex_init(&dpsp->recv_lock, NULL, MUTEX_DRIVER, NULL);
1487 cv_init(&dpsp->recv_cv, NULL, CV_DRIVER, NULL);
1488 dpsp->recv_headp = NULL;
1489 dpsp->recv_tailp = NULL;
1490 dpsp->recv_size = 0;
1491 dpsp->recv_cnt = 0;
1495 vlds_recvq_destroy(vlds_svc_info_t *dpsp)
1497 ASSERT(dpsp->state == VLDS_RECV_UNREG_PENDING);
1498 ASSERT(dpsp->recv_size == 0);
1499 ASSERT(dpsp->recv_cnt == 0);
1500 ASSERT(dpsp->recv_headp == NULL);
1501 ASSERT(dpsp->recv_tailp == NULL);
1503 mutex_destroy(&dpsp->recv_lock);
1504 cv_destroy(&dpsp->recv_cv);
1505 DS_FREE(dpsp, sizeof (vlds_svc_info_t));
1509 vlds_recvq_get_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen,
1516 mutex_enter(&dpsp->recv_lock);
1517 while (dpsp->recv_size == 0) {
1518 ASSERT(dpsp->recv_cnt == 0);
1519 if (dpsp->state == VLDS_RECV_UNREG_PENDING)
1522 if (dpsp->state == VLDS_RECV_OVERFLOW) {
1525 dpsp->state = VLDS_RECV_OK;
1526 mutex_exit(&dpsp->recv_lock);
1533 mutex_exit(&dpsp->recv_lock);
1537 dpsp->recv_nreaders += 1;
1538 rv = cv_wait_sig(&dpsp->recv_cv, &dpsp->recv_lock);
1539 dpsp->recv_nreaders -= 1;
1542 mutex_exit(&dpsp->recv_lock);
1546 if (dpsp->state == VLDS_RECV_UNREG_PENDING) {
1548 cv_broadcast(&dpsp->recv_cv);
1549 mutex_exit(&dpsp->recv_lock);
1552 ASSERT(dpsp->recv_headp != NULL);
1553 rhp = dpsp->recv_headp;
1561 mutex_exit(&dpsp->recv_lock);
1564 if (rhp == dpsp->recv_tailp) {
1565 dpsp->recv_headp = NULL;
1566 dpsp->recv_tailp = NULL;
1568 dpsp->recv_headp = rhp->next;
1569 ASSERT(dpsp->recv_headp != NULL);
1571 ASSERT(dpsp->recv_cnt > 0);
1572 dpsp->recv_size -= rhp->datasz;
1573 dpsp->recv_cnt -= 1;
1574 mutex_exit(&dpsp->recv_lock);
1600 vlds_recvq_drain(vlds_svc_info_t *dpsp)
1604 mutex_enter(&dpsp->recv_lock);
1605 dpsp->state = VLDS_RECV_UNREG_PENDING;
1606 for (rhp = dpsp->recv_tailp; rhp != NULL; rhp = nextp) {
1611 dpsp->recv_headp = NULL;
1612 dpsp->recv_tailp = NULL;
1613 dpsp->recv_size = 0;
1614 dpsp->recv_cnt = 0;
1619 while (dpsp->recv_nreaders > 0) {
1620 cv_broadcast(&dpsp->recv_cv);
1621 mutex_exit(&dpsp->recv_lock);
1623 mutex_enter(&dpsp->recv_lock);
1626 mutex_exit(&dpsp->recv_lock);
1630 vlds_recvq_put_data(vlds_svc_info_t *dpsp, void *buf, size_t buflen)
1634 mutex_enter(&dpsp->recv_lock);
1635 if (dpsp->state != VLDS_RECV_UNREG_PENDING) {
1644 if ((dpsp->state == VLDS_RECV_OVERFLOW) ||
1645 ((dpsp->recv_cnt != 0) &&
1646 ((dpsp->recv_size + buflen) > vlds_recvq_maxsize) ||
1647 ((dpsp->recv_cnt + 1) > vlds_recvq_maxmsg))) {
1650 dpsp->state = VLDS_RECV_OVERFLOW;
1651 cv_broadcast(&dpsp->recv_cv);
1652 mutex_exit(&dpsp->recv_lock);
1664 if (dpsp->recv_headp == NULL) {
1665 dpsp->recv_headp = rhp;
1666 dpsp->recv_tailp = rhp;
1668 dpsp->recv_tailp->next = rhp;
1669 dpsp->recv_tailp = rhp;
1671 dpsp->recv_size += rhp->datasz;
1672 dpsp->recv_cnt += 1;
1673 cv_broadcast(&dpsp->recv_cv);
1675 mutex_exit(&dpsp->recv_lock);
1683 void *dpsp;
1698 ds_cbarg_get_drv_per_svc_ptr(cbarg, &dpsp);
1699 if (dpsp == NULL) {
1704 rv = vlds_recvq_get_data(dpsp, buf, buflen, msglenp, mode);