-: 0:Source:/home/MPI/testing/mpich2/mpich2/src/mpid/common/sock/poll/sock_set.i
-: 0:Graph:sock.gcno
-: 0:Data:-
-: 0:Runs:0
-: 0:Programs:0
-: 1:/* -*- Mode: C; c-basic-offset:4 ; -*- */
-: 2:
-: 3:/*
-: 4: * (C) 2001 by Argonne National Laboratory.
-: 5: * See COPYRIGHT in top-level directory.
-: 6: */
-: 7:
-: 8:#undef FUNCNAME
-: 9:#define FUNCNAME MPIDU_Sock_create_set
-: 10:#undef FCNAME
-: 11:#define FCNAME MPIU_QUOTE(FUNCNAME)
-: 12:int MPIDU_Sock_create_set(struct MPIDU_Sock_set ** sock_setp)
|
#####: 13:{
#####: 14: struct MPIDU_Sock_set * sock_set = NULL;
#####: 15: int mpi_errno = MPI_SUCCESS;
-: 16: MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_CREATE_SET);
-: 17:
-: 18: MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_CREATE_SET);
-: 19:
-: 20: MPIDU_SOCKI_VERIFY_INIT(mpi_errno, fn_exit);
-: 21:
-: 22: /*
-: 23: * Allocate and initialized a new sock set structure
-: 24: */
#####: 25: sock_set = MPIU_Malloc(sizeof(struct MPIDU_Sock_set));
|
-: 26: /* --BEGIN ERROR HANDLING-- */
#####: 27: if (sock_set == NULL)
-: 28: {
#####: 29: mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_NOMEM,
-: 30: "**sock|setalloc", 0);
#####: 31: goto fn_fail;
-: 32: }
-: 33: /* --END ERROR HANDLING-- */
-: 34:
|
#####: 35: sock_set->id = MPIDU_Socki_set_next_id++;
#####: 36: sock_set->poll_array_sz = 0;
#####: 37: sock_set->poll_array_elems = 0;
#####: 38: sock_set->starting_elem = 0;
#####: 39: sock_set->pollfds = NULL;
#####: 40: sock_set->pollinfos = NULL;
#####: 41: sock_set->eventq_head = NULL;
#####: 42: sock_set->eventq_tail = NULL;
-: 43: /* FIXME: Move the thread-specific operations into thread-specific
-: 44: routines (to allow for alternative thread sync models and
-: 45: for runtime control of thread level) */
-: 46:# ifdef MPICH_IS_THREADED
-: 47: {
-: 48: sock_set->pollfds_active = NULL;
-: 49: sock_set->pollfds_updated = FALSE;
-: 50: sock_set->wakeup_posted = FALSE;
-: 51: sock_set->intr_fds[0] = -1;
-: 52: sock_set->intr_fds[1] = -1;
-: 53: sock_set->intr_sock = NULL;
-: 54: }
-: 55:# endif
-: 56:
-: 57:# ifdef MPICH_IS_THREADED
-: 58: MPIU_THREAD_CHECK_BEGIN
-: 59: {
-: 60: struct MPIDU_Sock * sock = NULL;
-: 61: struct pollfd * pollfd;
-: 62: struct pollinfo * pollinfo;
-: 63: long flags;
-: 64: int rc;
-: 65:
-: 66: /*
-: 67: * Acquire a pipe (the interrupter) to wake up a blocking poll should
-: 68: * it become necessary.
-: 69: *
-: 70: * Make the read descriptor nonblocking. The write descriptor is left
-: 71: * as a blocking descriptor. The write has to
-: 72: * succeed or the system will lock up. Should the blocking descriptor
-: 73: * prove to be a problem, then (1) copy the above
-: 74: * code, applying it to the write descriptor, and (2) update
-: 75: * MPIDU_Socki_wakeup() so that it loops while write returns 0,
-: 76: * performing a thread yield between iterations.
-: 77: */
-: 78: rc = pipe(sock_set->intr_fds);
|
-: 79: /* --BEGIN ERROR HANDLING-- */
-: 80: if (rc != 0)
-: 81: {
-: 82: mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL,
-: 83: "**sock|poll|pipe", "**sock|poll|pipe %d %s", errno, MPIU_Strerror(errno));
-: 84: goto fn_fail;
-: 85: }
-: 86: /* --END ERROR HANDLING-- */
-: 87:
-: 88: flags = fcntl(sock_set->intr_fds[0], F_GETFL, 0);
-: 89: /* --BEGIN ERROR HANDLING-- */
-: 90: if (flags == -1)
-: 91: {
-: 92: mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL,
-: 93: "**sock|poll|pipenonblock", "**sock|poll|pipenonblock %d %s",
-: 94: errno, MPIU_Strerror(errno));
-: 95: goto fn_fail;
-: 96: }
-: 97: /* --END ERROR HANDLING-- */
-: 98:
-: 99: rc = fcntl(sock_set->intr_fds[0], F_SETFL, flags | O_NONBLOCK);
-: 100: /* --BEGIN ERROR HANDLING-- */
-: 101: if (rc == -1)
-: 102: {
-: 103: mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL,
-: 104: "**sock|poll|pipenonblock", "**sock|poll|pipenonblock %d %s",
-: 105: errno, MPIU_Strerror(errno));
-: 106: goto fn_fail;
-: 107: }
-: 108: /* --END ERROR HANDLING-- */
-: 109:
-: 110: /*
-: 111: * Allocate and initialize a sock structure for the interrupter pipe
-: 112: */
-: 113: mpi_errno = MPIDU_Socki_sock_alloc(sock_set, &sock);
-: 114: /* --BEGIN ERROR HANDLING-- */
-: 115: if (mpi_errno != MPI_SUCCESS)
-: 116: {
-: 117: mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_NOMEM,
-: 118: "**sock|sockalloc", NULL);
-: 119: goto fn_fail;
-: 120: }
-: 121: /* --END ERROR HANDLING-- */
-: 122:
-: 123: sock_set->intr_sock = sock;
-: 124:
-: 125: pollfd = MPIDU_Socki_sock_get_pollfd(sock);
-: 126: pollinfo = MPIDU_Socki_sock_get_pollinfo(sock);
-: 127:
-: 128: pollfd->fd = sock_set->intr_fds[0];
-: 129: pollinfo->fd = sock_set->intr_fds[0];
-: 130: pollinfo->user_ptr = NULL;
-: 131: pollinfo->type = MPIDU_SOCKI_TYPE_INTERRUPTER;
-: 132: pollinfo->state = MPIDU_SOCKI_STATE_CONNECTED_RO;
-: 133: pollinfo->os_errno = 0;
-: 134:
-: 135: MPIDU_SOCKI_POLLFD_OP_SET(pollfd, pollinfo, POLLIN);
-: 136: }
-: 137: MPIU_THREAD_CHECK_END
-: 138:# endif
-: 139:
|
#####: 140: *sock_setp = sock_set;
-: 141:
#####: 142: fn_exit:
|
-: 143: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_CREATE_SET);
|
#####: 144: return mpi_errno;
-: 145:
|
-: 146: /* --BEGIN ERROR HANDLING-- */
#####: 147: fn_fail:
#####: 148: if (sock_set != NULL)
-: 149: {
-: 150:# ifdef MPICH_IS_THREADED
-: 151: MPIU_THREAD_CHECK_BEGIN
-: 152: {
-: 153: if (sock_set->intr_fds[0] != -1)
-: 154: {
-: 155: close(sock_set->intr_fds[0]);
-: 156: }
-: 157:
-: 158: if (sock_set->intr_fds[1] != -1)
-: 159: {
-: 160: close(sock_set->intr_fds[1]);
-: 161: }
-: 162: }
-: 163: MPIU_THREAD_CHECK_END
-: 164:# endif
-: 165:
#####: 166: MPIU_Free(sock_set);
-: 167: }
-: 168:
-: 169: goto fn_exit;
-: 170: /* --END ERROR HANDLING-- */
-: 171:}
-: 172:
-: 173:
-: 174:#undef FUNCNAME
-: 175:#define FUNCNAME MPIDU_Sock_destroy_set
-: 176:#undef FCNAME
-: 177:#define FCNAME MPIU_QUOTE(FUNCNAME)
-: 178:int MPIDU_Sock_destroy_set(struct MPIDU_Sock_set * sock_set)
|
#####: 179:{
-: 180: int elem;
-: 181: struct MPIDU_Sock_event event;
#####: 182: int mpi_errno = MPI_SUCCESS;
-: 183: MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_DESTROY_SET);
-: 184:
-: 185: MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_DESTROY_SET);
-: 186:
-: 187: MPIDU_SOCKI_VERIFY_INIT(mpi_errno, fn_exit);
-: 188:
-: 189: /*
-: 190: * FIXME: check for open socks and return an error if any are found
-: 191: */
-: 192:
-: 193: /*
-: 194: * FIXME: verify no other thread is blocked in poll(). wake it up and
-: 195: * get it to exit.
-: 196: */
-: 197:
-: 198: /*
-: 199: * Close pipe for interrupting a blocking poll()
-: 200: */
-: 201:# ifdef MPICH_IS_THREADED
-: 202: MPIU_THREAD_CHECK_BEGIN
-: 203: {
-: 204: close(sock_set->intr_fds[1]);
-: 205: close(sock_set->intr_fds[0]);
-: 206: MPIDU_Socki_sock_free(sock_set->intr_sock);
-: 207:
-: 208: sock_set->pollfds_updated = FALSE;
-: 209: sock_set->pollfds_active = NULL;
-: 210: sock_set->wakeup_posted = FALSE;
-: 211: sock_set->intr_fds[0] = -1;
-: 212: sock_set->intr_fds[1] = -1;
-: 213: sock_set->intr_sock = NULL;
-: 214: }
-: 215: MPIU_THREAD_CHECK_END
-: 216:# endif
-: 217:
-: 218: /*
-: 219: * Clear the event queue to eliminate memory leaks
-: 220: */
#####: 221: while (MPIDU_Socki_event_dequeue(sock_set, &elem, &event) == MPI_SUCCESS);
-: 222:
-: 223: /*
-: 224: * Free structures used by the sock set
-: 225: */
#####: 226: MPIU_Free(sock_set->pollinfos);
#####: 227: MPIU_Free(sock_set->pollfds);
-: 228:
-: 229: /*
-: 230: * Reset the sock set fields
-: 231: */
#####: 232: sock_set->id = ~0;
#####: 233: sock_set->poll_array_sz = 0;
#####: 234: sock_set->poll_array_elems = 0;
#####: 235: sock_set->starting_elem = 0;
#####: 236: sock_set->pollfds = NULL;
#####: 237: sock_set->pollinfos = NULL;
#####: 238: sock_set->eventq_head = NULL;
#####: 239: sock_set->eventq_tail = NULL;
-: 240:
-: 241: /*
-: 242: * Free the structure
-: 243: */
#####: 244: MPIU_Free(sock_set);
-: 245:
-: 246:#ifdef USE_SOCK_VERIFY
-: 247: fn_exit:
-: 248:#endif
|
-: 249: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_DESTROY_SET);
|
#####: 250: return mpi_errno;
-: 251:}
|