int close(int socket) { struct fd_info *fdi; int ret; init_preload(); fdi = idm_lookup(&idm, socket); if (!fdi) return real.close(socket); if (fdi->dupfd != -1) { ret = close(fdi->dupfd); if (ret) return ret; } if (atomic_dec(&fdi->refcnt)) return 0; idm_clear(&idm, socket); real.close(socket); ret = (fdi->type == fd_rsocket) ? rclose(fdi->fd) : real.close(fdi->fd); free(fdi); return ret; }
static int sock_av_close(struct fid *fid) { struct sock_av *av; int i; av = container_of(fid, struct sock_av, av_fid.fid); if (atomic_get(&av->ref)) return -FI_EBUSY; for (i=0; i<av->table_hdr->stored; i++) { if(idm_lookup(&av->addr_idm, i)) idm_clear(&av->addr_idm , i); } if (!av->name) free(av->table_hdr); else { shm_unlink(av->name); free(av->name); munmap(av->table_hdr, sizeof(struct sock_av_table_hdr) + av->attr.count * sizeof(struct sock_av_addr)); close(av->shared_fd); } atomic_dec(&av->domain->ref); free(av->key); free(av); return 0; }
static int sock_mr_close(struct fid *fid) { struct sock_domain *dom; struct sock_mr *mr; mr = container_of(fid, struct sock_mr, mr_fid.fid); dom = mr->domain; fastlock_acquire(&dom->lock); idm_clear(&dom->mr_idm , (int) mr->mr_fid.key); fastlock_release(&dom->lock); atomic_dec(&dom->ref); free(mr); return 0; }
static enum fd_type fd_close(int index, int *fd) { struct fd_info *fdi; enum fd_type type; fdi = idm_lookup(&idm, index); if (fdi) { idm_clear(&idm, index); *fd = fdi->fd; type = fdi->type; real.close(index); free(fdi); } else { *fd = index; type = fd_normal; } return type; }