Lines Matching refs:cm

58 static int close_conn_mt_when_nouser(ns_conn_mt_t *cm);
62 static void close_conn_mt_by_procchg(ns_conn_mt_t *cm, int rc, char *errmsg);
94 #define NS_CONN_UNLOCK_AND_FREE(free, cm, cmg) \ argument
96 (void) mutex_unlock(&(cm)->lock); \
98 cmg = free_conn_mt((cm), 1); \
895 ns_conn_mt_t *cm; in init_conn_mt() local
898 cm = (ns_conn_mt_t *)calloc(1, sizeof (*cm)); in init_conn_mt()
899 if (cm == NULL) { in init_conn_mt()
916 (void) mutex_init(&cm->lock, USYNC_THREAD, NULL); in init_conn_mt()
917 cm->state = NS_CONN_MT_CONNECTING; in init_conn_mt()
918 cm->tid = thr_self(); in init_conn_mt()
919 cm->pid = getpid(); in init_conn_mt()
920 cm->next = NULL; in init_conn_mt()
921 cm->cu_head = NULL; in init_conn_mt()
922 cm->cu_tail = NULL; in init_conn_mt()
923 cm->conn = NULL; in init_conn_mt()
924 cm->conn_mgmt = cmg; in init_conn_mt()
926 return (cm); in init_conn_mt()
935 free_conn_mt(ns_conn_mt_t *cm, int unlock_cmg) in free_conn_mt() argument
939 if (cm == NULL) in free_conn_mt()
941 if (cm->ns_error != NULL) in free_conn_mt()
942 (void) __ns_ldap_freeError(&cm->ns_error); in free_conn_mt()
943 if (cm->conn != NULL) { in free_conn_mt()
944 if (cm->conn->ld != NULL) in free_conn_mt()
945 (void) ldap_unbind(cm->conn->ld); in free_conn_mt()
946 __s_api_freeConnection(cm->conn); in free_conn_mt()
948 cmg = cm->conn_mgmt; in free_conn_mt()
949 free(cm); in free_conn_mt()
955 add_cu2cm(ns_conn_user_t *cu, ns_conn_mt_t *cm) in add_cu2cm() argument
958 if (cm->cu_head == NULL) { in add_cu2cm()
959 cm->cu_head = cu; in add_cu2cm()
960 cm->cu_tail = cu; in add_cu2cm()
962 cm->cu_tail->next = cu; in add_cu2cm()
963 cm->cu_tail = cu; in add_cu2cm()
965 cm->cu_cnt++; in add_cu2cm()
970 add_cm2cmg(ns_conn_mt_t *cm, ns_conn_mgmt_t *cmg) in add_cm2cmg() argument
979 cmg->cm_head = cm; in add_cm2cmg()
980 cmg->cm_tail = cm; in add_cm2cmg()
982 if (cm->opened_for == NS_CONN_USER_WRITE) { in add_cm2cmg()
983 cm->next = cmg->cm_head; in add_cm2cmg()
984 cmg->cm_head = cm; in add_cm2cmg()
986 cmg->cm_tail->next = cm; in add_cm2cmg()
987 cmg->cm_tail = cm; in add_cm2cmg()
995 del_cu4cm(ns_conn_user_t *cu, ns_conn_mt_t *cm) in del_cu4cm() argument
999 if (cu == NULL || cm->cu_head == NULL || cm->cu_cnt == 0) in del_cu4cm()
1003 if (cm->cu_head == cm->cu_tail) { in del_cu4cm()
1004 if (cu == cm->cu_head) { in del_cu4cm()
1005 cm->cu_head = cm->cu_tail = NULL; in del_cu4cm()
1006 cm->cu_cnt = 0; in del_cu4cm()
1013 if (cu == cm->cu_head) { in del_cu4cm()
1014 cm->cu_head = cu->next; in del_cu4cm()
1015 cm->cu_cnt--; in del_cu4cm()
1020 pu = cm->cu_head; in del_cu4cm()
1021 for (u = cm->cu_head->next; u; u = u->next) { in del_cu4cm()
1026 if (pu != cm->cu_tail) { in del_cu4cm()
1029 cm->cu_tail = pu; in del_cu4cm()
1030 cm->cu_cnt--; in del_cu4cm()
1040 del_cm4cmg(ns_conn_mt_t *cm, ns_conn_mgmt_t *cmg) in del_cm4cmg() argument
1044 if (cm == NULL || cmg->cm_head == NULL || cmg->cm_cnt == 0) in del_cm4cmg()
1049 if (cm == cmg->cm_head) { in del_cm4cmg()
1052 cm->next = NULL; in del_cm4cmg()
1058 if (cm == cmg->cm_head) { in del_cm4cmg()
1059 cmg->cm_head = cm->next; in del_cm4cmg()
1061 cm->next = NULL; in del_cm4cmg()
1067 if (cm == m) in del_cm4cmg()
1072 pm->next = cm->next; in del_cm4cmg()
1076 cm->next = NULL; in del_cm4cmg()
1089 ns_conn_mt_t *cm) in is_server_cred_matched() argument
1091 Connection *cp = cm->conn; in is_server_cred_matched()
1114 wait_for_conn_mt(ns_conn_user_t *cu, ns_conn_mt_t *cm) in wait_for_conn_mt() argument
1118 add_cu2cm(cu, cm); in wait_for_conn_mt()
1119 cu->conn_mt = cm; in wait_for_conn_mt()
1121 (void) mutex_unlock(&cm->lock); in wait_for_conn_mt()
1126 (void) mutex_unlock(&(cm->conn_mgmt)->lock); in wait_for_conn_mt()
1128 (void) mutex_lock(&cm->lock); in wait_for_conn_mt()
1130 if (cm->state == NS_CONN_MT_CONNECTING) { in wait_for_conn_mt()
1131 (void) conn_wait(cm, cu); in wait_for_conn_mt()
1138 if (cm->state == NS_CONN_MT_CONNECTED) in wait_for_conn_mt()
1141 del_cu4cm(cu, cm); in wait_for_conn_mt()
1158 check_and_close_conn(ns_conn_mgmt_t *cmg, ns_conn_mt_t **cm, in check_and_close_conn() argument
1202 if (strcasecmp(cmg->pservers[j], (*cm)->conn->serverAddr) != 0) in check_and_close_conn()
1237 if ((*cm)->opened_for == NS_CONN_USER_WRITE || in check_and_close_conn()
1238 (*cm)->referral == B_TRUE) { in check_and_close_conn()
1242 free_cm = close_conn_mt_when_nouser(*cm); in check_and_close_conn()
1250 free_cm = close_conn_mt(*cm, LDAP_SERVER_DOWN, &ep, NULL); in check_and_close_conn()
1256 (void) mutex_unlock(&(*cm)->lock); in check_and_close_conn()
1258 (void) free_conn_mt(*cm, 0); in check_and_close_conn()
1259 *cm = NULL; in check_and_close_conn()
1283 ns_conn_mt_t *cm = *cmt; in match_conn_mt() local
1284 ns_conn_mgmt_t *cmg = cm->conn_mgmt; in match_conn_mt()
1286 if (cm->state != st || cm->close_when_nouser == B_TRUE || in match_conn_mt()
1287 cm->detached == B_TRUE || cm->pid != getpid() || in match_conn_mt()
1288 cm->referral != cu->referral) { in match_conn_mt()
1289 (void) mutex_unlock(&cm->lock); in match_conn_mt()
1304 if (cm->opened_for == NS_CONN_USER_WRITE && in match_conn_mt()
1305 cu->type != NS_CONN_USER_WRITE && cm->cu_cnt == 0 && in match_conn_mt()
1306 ((time(NULL) - cm->access_time) > 60)) { in match_conn_mt()
1311 free_cm = close_conn_mt(cm, NS_LDAP_INTERNAL, NULL, NULL); in match_conn_mt()
1312 (void) mutex_unlock(&cm->lock); in match_conn_mt()
1314 (void) free_conn_mt(cm, 0); in match_conn_mt()
1323 if (cm->opened_for == NS_CONN_USER_SEARCH || in match_conn_mt()
1324 cm->opened_for == NS_CONN_USER_GETENT) in match_conn_mt()
1329 if (cm->opened_for == NS_CONN_USER_WRITE) in match_conn_mt()
1339 is_server_cred_matched(server, cred, cm) == B_FALSE)) in match_conn_mt()
1351 if (cm->state == NS_CONN_MT_CONNECTED && in match_conn_mt()
1353 drop_conn = check_and_close_conn(cmg, &cm, cu); in match_conn_mt()
1355 if (cm == NULL) in match_conn_mt()
1362 if ((cm->state == NS_CONN_MT_CONNECTED && in match_conn_mt()
1363 cm->cu_max != NS_CONN_MT_USER_NO_MAX && in match_conn_mt()
1364 cm->cu_cnt >= cm->cu_max) || in match_conn_mt()
1365 (cm->state == NS_CONN_MT_CONNECTING && in match_conn_mt()
1366 cm->cu_max != NS_CONN_MT_USER_NO_MAX && in match_conn_mt()
1367 cm->waiter_cnt >= cm->cu_max - 1)) in match_conn_mt()
1372 (void) mutex_unlock(&cm->lock); in match_conn_mt()
1546 ns_conn_mt_t *cm = cu->conn_mt; in __s_api_conn_mt_add() local
1560 (void) mutex_lock(&cm->lock); in __s_api_conn_mt_add()
1561 cm->conn = con; in __s_api_conn_mt_add()
1562 cm->state = NS_CONN_MT_CONNECTED; in __s_api_conn_mt_add()
1563 cm->pid = getpid(); in __s_api_conn_mt_add()
1564 cm->create_time = time(NULL); in __s_api_conn_mt_add()
1565 cm->access_time = cm->create_time; in __s_api_conn_mt_add()
1566 cm->opened_for = cu->type; in __s_api_conn_mt_add()
1567 add_cu2cm(cu, cm); in __s_api_conn_mt_add()
1568 cu->conn_mt = cm; in __s_api_conn_mt_add()
1571 cm->cu_max = NS_CONN_MT_USER_MAX; in __s_api_conn_mt_add()
1573 cm->cu_max = 1; in __s_api_conn_mt_add()
1576 (void) conn_signal(cm); in __s_api_conn_mt_add()
1578 (void) mutex_unlock(&cm->lock); in __s_api_conn_mt_add()
1594 ns_conn_mt_t *cm; in __s_api_conn_mt_return() local
1599 cm = cu->conn_mt; in __s_api_conn_mt_return()
1600 if (cm == NULL) in __s_api_conn_mt_return()
1604 (void) mutex_lock(&cm->lock); in __s_api_conn_mt_return()
1605 del_cu4cm(cu, cm); in __s_api_conn_mt_return()
1615 if ((cm->close_when_nouser == B_TRUE || in __s_api_conn_mt_return()
1616 cm->state != NS_CONN_MT_CONNECTED) && cm->cu_cnt == 0) { in __s_api_conn_mt_return()
1617 (void) mutex_unlock(&cm->lock); in __s_api_conn_mt_return()
1619 (void) mutex_lock(&cm->lock); in __s_api_conn_mt_return()
1620 del_cm4cmg(cm, cmg); in __s_api_conn_mt_return()
1622 NS_CONN_UNLOCK_AND_FREE(ns_conn_free, cm, cmg); in __s_api_conn_mt_return()
1624 if (cm->state == NS_CONN_MT_CONNECTED && cm->cu_cnt == 0 && in __s_api_conn_mt_return()
1625 cm->conn != NULL && cm->conn->ld != NULL) { in __s_api_conn_mt_return()
1631 while (ldap_result(cm->conn->ld, LDAP_RES_ANY, in __s_api_conn_mt_return()
1637 (void) mutex_unlock(&cm->lock); in __s_api_conn_mt_return()
1643 err2cm(ns_conn_mt_t *cm, int rc, ns_ldap_error_t **errorp) in err2cm() argument
1647 cm->ns_rc = rc; in err2cm()
1648 cm->ns_error = NULL; in err2cm()
1652 cm->ns_rc = NS_LDAP_MEMORY; in err2cm()
1654 cm->ns_error = ep; in err2cm()
1660 err_from_cm(ns_conn_user_t *cu, ns_conn_mt_t *cm) in err_from_cm() argument
1664 cu->ns_rc = cm->ns_rc; in err_from_cm()
1668 if (cm->ns_rc != NS_LDAP_SUCCESS && cm->ns_error != NULL) { in err_from_cm()
1669 ep = __s_api_copy_error(cm->ns_error); in err_from_cm()
1706 ns_conn_mt_t *cm; in __s_api_conn_mt_remove() local
1711 if ((cm = cu->conn_mt) == NULL) in __s_api_conn_mt_remove()
1716 (void) mutex_lock(&cm->lock); in __s_api_conn_mt_remove()
1717 if (cm->state != NS_CONN_MT_CONNECT_ERROR) { in __s_api_conn_mt_remove()
1718 cm->state = NS_CONN_MT_CONNECT_ERROR; in __s_api_conn_mt_remove()
1719 cm->ns_rc = rc; in __s_api_conn_mt_remove()
1721 cm->ns_error = *errorp; in __s_api_conn_mt_remove()
1727 err_from_cm(cu, cm); in __s_api_conn_mt_remove()
1729 (void) conn_signal(cm); in __s_api_conn_mt_remove()
1731 del_cu4cm(cu, cm); in __s_api_conn_mt_remove()
1734 if (cm->cu_cnt == 0) { in __s_api_conn_mt_remove()
1735 del_cm4cmg(cm, cmg); in __s_api_conn_mt_remove()
1739 NS_CONN_UNLOCK_AND_FREE(free_cm, cm, cmg); in __s_api_conn_mt_remove()
1793 close_conn_mt(ns_conn_mt_t *cm, int rc, ns_ldap_error_t **errorp, in close_conn_mt() argument
1796 ns_conn_mgmt_t *cmg = cm->conn_mgmt; in close_conn_mt()
1800 if ((cm->state != NS_CONN_MT_CONNECTED && cm->state != in close_conn_mt()
1806 if (cm == m) in close_conn_mt()
1812 if (cm->state == NS_CONN_MT_CONNECTED) { /* first time in here */ in close_conn_mt()
1813 cm->state = NS_CONN_MT_CLOSING; in close_conn_mt()
1823 if ((cu != NULL && cm->cu_cnt > 1) || in close_conn_mt()
1824 (cu == NULL && cm->cu_cnt > 0)) { in close_conn_mt()
1825 err2cm(cm, rc, errorp); in close_conn_mt()
1827 (void) conn_signal(cm); in close_conn_mt()
1831 if (cm->cu_head != NULL) { in close_conn_mt()
1832 for (u = cm->cu_head; u; u = u->next) { in close_conn_mt()
1841 if ((cu != NULL && cm->cu_cnt == 1) || in close_conn_mt()
1842 (cu == NULL && cm->cu_cnt == 0)) { in close_conn_mt()
1843 del_cm4cmg(cm, cmg); in close_conn_mt()
1844 cm->detached = B_TRUE; in close_conn_mt()
1867 ns_conn_mt_t *cm; in __s_api_conn_mt_close() local
1873 if (cu->state != NS_CONN_USER_CONNECTED || (cm = cu->conn_mt) == NULL) in __s_api_conn_mt_close()
1878 (void) mutex_lock(&cm->lock); in __s_api_conn_mt_close()
1881 free_cm = close_conn_mt(cm, rc, errorp, cu); in __s_api_conn_mt_close()
1883 (void) mutex_unlock(&cm->lock); in __s_api_conn_mt_close()
1891 err_from_cm(cu, cm); in __s_api_conn_mt_close()
1895 del_cu4cm(cu, cm); in __s_api_conn_mt_close()
1900 NS_CONN_UNLOCK_AND_FREE(free_cm, cm, cmg); in __s_api_conn_mt_close()
1910 close_conn_mt_by_procchg(ns_conn_mt_t *cm, int rc, char *errmsg) in close_conn_mt_by_procchg() argument
1916 if (cm == NULL) in close_conn_mt_by_procchg()
1918 cmg = cm->conn_mgmt; in close_conn_mt_by_procchg()
1928 (void) mutex_lock(&cm->lock); in close_conn_mt_by_procchg()
1931 free_cm = close_conn_mt(cm, LDAP_SERVER_DOWN, &ep, NULL); in close_conn_mt_by_procchg()
1933 (void) mutex_unlock(&cm->lock); in close_conn_mt_by_procchg()
1939 NS_CONN_UNLOCK_AND_FREE(free_cm, cm, cmg); in close_conn_mt_by_procchg()
1950 close_conn_mt_when_nouser(ns_conn_mt_t *cm) in close_conn_mt_when_nouser() argument
1954 if (cm->cu_cnt == 0) { in close_conn_mt_when_nouser()
1955 del_cm4cmg(cm, cm->conn_mgmt); in close_conn_mt_when_nouser()
1958 cm->close_when_nouser = B_TRUE; in close_conn_mt_when_nouser()
2008 ns_conn_mt_t *cm; in proc_server_change() local
2042 for (cm = cmg->cm_head; cm; cm = cm->next) { in proc_server_change()
2043 (void) mutex_lock(&cm->lock); in proc_server_change()
2045 if (cm->state == NS_CONN_MT_CONNECTED && in proc_server_change()
2046 cm->conn != NULL && in proc_server_change()
2047 strcasecmp(cm->conn->serverAddr, s) == 0) { in proc_server_change()
2048 (void) mutex_unlock(&cm->lock); in proc_server_change()
2052 (void) mutex_unlock(&cm->lock); in proc_server_change()
2054 if (cm != NULL) { in proc_server_change()
2057 close_conn_mt_by_procchg(cm, LDAP_SERVER_DOWN, in proc_server_change()
2129 for (cm = cmg->cm_head; cm; cm = cm->next) { in proc_server_change()
2130 (void) mutex_lock(&cm->lock); in proc_server_change()
2137 if (cm->state == NS_CONN_MT_CONNECTED && in proc_server_change()
2138 cm->close_when_nouser == B_FALSE && in proc_server_change()
2139 cm->conn != NULL && cm->opened_for != in proc_server_change()
2141 cm->referral == B_FALSE) { in proc_server_change()
2153 cm->conn->serverAddr, in proc_server_change()
2169 cm); in proc_server_change()
2171 cm, cmg); in proc_server_change()
2184 (void) mutex_unlock(&cm->lock); in proc_server_change()
2187 if (cm == NULL) in proc_server_change()
2201 ns_conn_mt_t *cm; in shutdown_all_conn_mt() local
2213 for (cm = cmg->cm_head; cm; cm = cm->next) { in shutdown_all_conn_mt()
2214 (void) mutex_lock(&cm->lock); in shutdown_all_conn_mt()
2215 if (cm->next == NULL) in shutdown_all_conn_mt()
2218 free_cm = close_conn_mt(cm, LDAP_OTHER, &ep, NULL); in shutdown_all_conn_mt()
2219 (void) mutex_unlock(&cm->lock); in shutdown_all_conn_mt()
2221 (void) free_conn_mt(cm, 0); in shutdown_all_conn_mt()