-:    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:}