[ofw] [RFC] [PATCH 3/3] port of libibumad to windows
Hal Rosenstock
hrosenstock at xsigo.com
Wed Jul 2 09:33:38 PDT 2008
On Wed, 2008-07-02 at 09:29 -0700, Fab Tillier wrote:
> > __declspec(dllexport)
> > int umad_set_grh_net(void *umad, void *mad_addr)
>
> <snip...>
>
> > __declspec(dllexport)
> > int umad_set_grh(void *umad, void *mad_addr)
>
> The two functions above are identical. Are they supposed to be? And if so, why two?
One is host ordered and the other net ordered. The GRH stuff is half
baked right now and I think there is some chance for API changes there
once routing gets further. This has only been used in a very limited
context so far.
-- Hal
> Also note your indentation...
>
> > __declspec(dllexport)
> > int umad_recv(int portid, void *umad, int *length, int timeout_ms)
> > {
> > WM_MAD *mad = (WM_MAD *) umad;
> > um_port_t *port;
> > HRESULT hr;
> >
> > port = &ports[portid];
> > hr = port->prov->Receive(mad, (size_t) length, &port->overlap);
> >
> > if (hr == ERROR_IO_PENDING) {
>
> Note that ERROR_IO_PENDING isn't an HRESULT. Either E_PENDING or HRESULT_FROM_WIN32( ERROR_IO_PENDING ).
>
> > if (port->pending && timeout_ms == 0) {
>
> How does a client call to check if anything's done without actually waiting? I would have expected 0 to be that, but it seems that 0 means infinite (I would have picked -1 for infinite.)
>
> > do {
> > hr = WaitForSingleObject(port-
> > >overlap.hEvent, 250);
>
> WaitForSingleObject doesn't return an HRESULT.
>
> > } while (hr == WAIT_TIMEOUT && port->pending);
>
> Just wait on the event. If the client deregisters from a different thread, the overlapped request should get cancelled which will set the event.
>
> > } else {
> > hr = WaitForSingleObject(port->overlap.hEvent,
> > (DWORD) timeout_ms);
> > if (hr == WAIT_TIMEOUT) {
> > return -EWOULDBLOCK;
> > }
> > }
> > }
> >
> > if (FAILED(hr)) {
> > return -EIO;
> > }
> >
> > if (mad->Length <= (UINT32) *length) {
> > port->pending = FALSE;
> > }
> >
> > *length = mad->Length;
> > return 0;
> > }
> >
> > __declspec(dllexport)
> > int umad_poll(int portid, int timeout_ms)
> > {
> > WM_MAD mad;
> > um_port_t *port;
> > HRESULT hr;
> >
> > port = &ports[portid];
> > hr = port->prov->Receive(&mad, sizeof mad, &port->overlap);
>
> What happens to the received WM_MAD? How does a subsequent umad_recv get the data?
>
> Also, you don't handle a call to umad_poll on one thread at the same time as a call to umad_recv on another. As it stands, you'll have two requests using the same overlapped structure.
>
> >
> > if (hr == ERROR_IO_PENDING) {
> > hr = WaitForSingleObject(port->overlap.hEvent, (DWORD)
> > timeout_ms);
> > if (hr == WAIT_TIMEOUT) {
> > return -ETIMEDOUT;
> > }
> > }
> >
> > if (FAILED(hr)) {
> > return -EIO;
> > }
> >
> > port->pending = TRUE;
> > return 0;
> > }
> _______________________________________________
> ofw mailing list
> ofw at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
More information about the ofw
mailing list