Print this page
pbchk
cleanup port_free_event_local() semantics

*** 23,33 **** * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* ! * Copyright (c) 2014, Joyent, Inc. All rights reserved. */ #include <sys/types.h> #include <sys/vnode.h> #include <sys/vfs_opreg.h> --- 23,33 ---- * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* ! * Copyright 2020 Joyent, Inc. */ #include <sys/types.h> #include <sys/vnode.h> #include <sys/vfs_opreg.h>
*** 113,131 **** port_kevent_t *pkevp; int events; /* ignore events */ mutex_enter(&portq->portq_mutex); while (pkevp = list_head(&portq->portq_list)) { portq->portq_nent--; list_remove(&portq->portq_list, pkevp); if (pkevp->portkev_callback) { (void) (*pkevp->portkev_callback)(pkevp->portkev_arg, &events, pkevp->portkev_pid, PORT_CALLBACK_CLOSE, pkevp); } ! mutex_exit(&portq->portq_mutex); ! port_free_event_local(pkevp, 0); mutex_enter(&portq->portq_mutex); } /* * Wait for any thread in pollwakeup(), accessing this port to --- 113,141 ---- port_kevent_t *pkevp; int events; /* ignore events */ mutex_enter(&portq->portq_mutex); while (pkevp = list_head(&portq->portq_list)) { + port_t *pp = pkevp->portkev_port; + portq->portq_nent--; list_remove(&portq->portq_list, pkevp); if (pkevp->portkev_callback) { (void) (*pkevp->portkev_callback)(pkevp->portkev_arg, &events, pkevp->portkev_pid, PORT_CALLBACK_CLOSE, pkevp); } ! /* ! * Don't drop the portq_mutex, but instead perform the ! * decrement of port_curr in advance of calling ! * port_free_event_local(). We do need to reacquire ! * portq_mutex so we can properly wait for any ! * pollwakeup()-signalled threads to finish up. ! */ ! if (--pp->port_curr < pp->port_max_events) ! cv_signal(&pp->port_cv); ! port_free_event_local(pkevp, B_FALSE); mutex_enter(&portq->portq_mutex); } /* * Wait for any thread in pollwakeup(), accessing this port to