Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 73 lines (61 sloc) 1.418 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/*
* (c) sof, 2003.
*/

#include "HsNet.h"
#include "HsFFI.h"

#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__) && !defined(__HUGS__)

/* all the way to the end */

/*
* To support non-blocking accept()s with WinSock, we use the asyncDoProc#
* primop, which lets a Haskell thread call an external routine without
* blocking the progress of other threads.
*
* As can readily be seen, this is a low-level mechanism.
*
*/

typedef struct AcceptData {
    int fdSock;
    int newSock;
    void* sockAddr;
    int size;
} AcceptData;

/*
* Fill in parameter block that's passed along when the RTS invokes the
* accept()-calling proc below (acceptDoProc())
*/
void*
newAcceptParams(int sock,
int sz,
void* sockaddr)
{
    AcceptData* data = (AcceptData*)malloc(sizeof(AcceptData));
    if (!data) return NULL;
    data->fdSock = sock;
    data->newSock = 0;
    data->sockAddr = sockaddr;
    data->size = sz;
    
    return data;
}

/* Accessors for return code and accept()'s socket result. */

int
acceptNewSock(void* d)
{
    return (((AcceptData*)d)->newSock);
}

/* Routine invoked by an RTS worker thread */
int
acceptDoProc(void* param)
{
    SOCKET s;

    AcceptData* data = (AcceptData*)param;
    s = accept( data->fdSock,
data->sockAddr,
&data->size);
    data->newSock = s;
    if ( s == INVALID_SOCKET ) {
return GetLastError();
    } else {
return 0;
    }
}
#endif
Something went wrong with that request. Please try again.