ws2_32: implement AcceptEx and GetAcceptExSockaddrs (try 2)

Alexandre Julliard julliard at winehq.org
Mon Sep 20 10:54:09 CDT 2010


Mike Kaplinskiy <mike.kaplinskiy at gmail.com> writes:

> +    wsa->read = HeapAlloc( GetProcessHeap(), 0, sizeof(*wsa->read) );
> +    if (!wsa->read)
> +    {
> +        status = STATUS_NO_MEMORY;
> +        goto finish;
> +    }
> +    wsa->read->hSocket     = wsa->accept_socket;
> +    wsa->read->flags       = 0;
> +    wsa->read->addr        = NULL;
> +    wsa->read->addrlen.ptr = NULL;
> +    wsa->read->n_iovecs    = 1;
> +    wsa->read->first_iovec = 0;
> +    /* Includes 1 iovec, and that's all we need */
> +    wsa->read->iovec[0].iov_base = wsa->buf;
> +    wsa->read->iovec[0].iov_len  = wsa->data_len;
> +    SERVER_START_REQ( register_async )
> +    {
> +        req->type           = ASYNC_TYPE_READ;
> +        req->async.handle   = wine_server_obj_handle( wsa->accept_socket );
> +        req->async.callback = wine_server_client_ptr( WS2_async_recv_accept );
> +        req->async.iosb     = wine_server_client_ptr( iosb );
> +        req->async.arg      = wine_server_client_ptr( wsa );
> +        status = wine_server_call( req );
> +    }
> +    SERVER_END_REQ;
> +
> +    if (status != STATUS_PENDING)
> +        goto finish;
> +
> +    return STATUS_SUCCESS;
> +
> +finish:
> +    iosb->u.Status = status;
> +    iosb->Information = 0;
> +
> +    if (wsa->user_overlapped->hEvent)
> +        SetEvent(wsa->user_overlapped->hEvent);
> +    if (wsa->cvalue)
> +        WS_AddCompletion( HANDLE2SOCKET(wsa->listen_socket), wsa->cvalue, iosb->u.Status, iosb->Information );
> +    HeapFree( GetProcessHeap(), 0, wsa->read );
> +    HeapFree( GetProcessHeap(), 0, wsa );
> +
> +    return status;
> +}

You cannot allocate or free memory in an async callback, because it can
be called from a signal handler. All needed memory needs to be allocated
beforehand, and freed in the user apc callback.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list