int globus_i_xio_win32_complete_activate(void) { globus_result_t result; globus_reltime_t period; GlobusXIOName(globus_i_xio_win32_complete_activate); GlobusXIOSystemDebugEnter(); if (!globus_i_am_only_thread()) { goto skip_activate; } GlobusLWin32PollQueueInit(); win32_mutex_init(&globus_l_xio_win32_poll_lock, 0); globus_l_xio_win32_poll_event_sleeping = GLOBUS_FALSE; globus_l_xio_win32_poll_event_pending = GLOBUS_FALSE; globus_l_xio_win32_poll_free = 0; globus_l_xio_win32_poll_event = CreateEvent(0, FALSE, FALSE, 0); if(globus_l_xio_win32_poll_event == 0) { goto error_event; } GlobusTimeReltimeSet(period, 0, 0); result = globus_callback_register_periodic( &globus_l_xio_win32_poll_handle, 0, &period, globus_l_xio_win32_poll, 0); if(result != GLOBUS_SUCCESS) { goto error_periodic; } globus_callback_add_wakeup_handler( globus_l_xio_win32_wakeup_handler, 0); skip_activate: GlobusXIOSystemDebugExit(); return GLOBUS_SUCCESS; error_periodic: CloseHandle(globus_l_xio_win32_poll_event); globus_l_xio_win32_poll_event = 0; error_event: win32_mutex_destroy(&globus_l_xio_win32_poll_lock); GlobusXIOSystemDebugExitWithError(); return GLOBUS_FAILURE; }
globus_result_t globus_xio_system_socket_init( globus_xio_system_socket_handle_t * uhandle, globus_xio_system_socket_t socket, globus_xio_system_type_t type) { globus_result_t result; globus_l_xio_win32_socket_t * handle; unsigned long flag; GlobusXIOName(globus_xio_system_socket_init); GlobusXIOSystemDebugEnterFD(socket); handle = (globus_l_xio_win32_socket_t *) globus_calloc(1, sizeof(globus_l_xio_win32_socket_t)); if(!handle) { result = GlobusXIOErrorMemory("handle"); goto error_alloc; } handle->socket = socket; win32_mutex_init(&handle->lock, 0); handle->ready_events = FD_READ; /* to avoid winsock fd_close bug */ handle->event = WSACreateEvent(); if(handle->event == 0) { result = GlobusXIOErrorSystemError( "WSACreateEvent", WSAGetLastError()); goto error_create; } flag = 1; if(ioctlsocket(socket, FIONBIO, &flag) == SOCKET_ERROR) { result = GlobusXIOErrorSystemError( "ioctlsocket", WSAGetLastError()); goto error_ioctl; } result = globus_i_xio_win32_event_register( &handle->event_entry, handle->event, globus_l_xio_win32_socket_event_cb, handle); if(result != GLOBUS_SUCCESS) { result = GlobusXIOErrorWrapFailed( "globus_i_xio_win32_event_register", result); goto error_register; } GlobusXIOSystemDebugPrintf( GLOBUS_I_XIO_SYSTEM_DEBUG_INFO, ("[%s] Registered event handle=%lu\n", _xio_name, (unsigned long) handle->event)); *uhandle = handle; GlobusXIOSystemDebugExitFD(socket); return GLOBUS_SUCCESS; error_register: flag = 0; ioctlsocket(socket, FIONBIO, &flag); error_ioctl: WSACloseEvent(handle->event); error_create: win32_mutex_destroy(&handle->lock); globus_free(handle); error_alloc: GlobusXIOSystemDebugExitWithErrorFD(socket); return result; }