@@ -258,68 +258,43 @@ public void controlTransferOut(USBControlTransfer setup, byte[] data) {
258258
259259 @ Override
260260 public void transferOut (int endpointNumber , byte [] data , int timeout ) {
261- checkIsOpen ();
262-
263- var endpoint = getEndpoint (USBDirection .OUT , endpointNumber , USBTransferType .BULK , USBTransferType .INTERRUPT );
264- var intfHandle = getInterfaceHandle (endpoint .interfaceNumber ());
265-
266261 try (var arena = Arena .openConfined ()) {
267- // set timeout
268- var timeoutHolder = arena .allocate (JAVA_INT , timeout );
269- var lastErrorState = arena .allocate (Win .LAST_ERROR_STATE .layout ());
270-
271- if (WinUSB2 .WinUsb_SetPipePolicy (intfHandle .interfaceHandle , endpoint .endpointAddress (),
272- WinUSB .PIPE_TRANSFER_TIMEOUT (), (int ) timeoutHolder .byteSize (), timeoutHolder , lastErrorState ) == 0 )
273- throwLastError (lastErrorState , "Setting timeout failed" );
274-
275- // copy data to native heap
276262 var buffer = arena .allocate (data .length );
277263 buffer .copyFrom (MemorySegment .ofArray (data ));
278- var lengthHolder = arena . allocate ( JAVA_INT );
264+ var transfer = createSyncTransfer ( buffer );
279265
280- // send data
281- if (WinUSB2 .WinUsb_WritePipe (intfHandle .interfaceHandle , endpoint .endpointAddress (), buffer ,
282- (int ) buffer .byteSize (), lengthHolder , NULL , lastErrorState ) == 0 ) {
283- int err = Win .getLastError (lastErrorState );
284- if (err == Kernel32 .ERROR_SEM_TIMEOUT ())
285- throw new USBTimeoutException ("Transfer out aborted due to timeout" );
286- throwException (err , "Bulk/interrupt transfer OUT failed" );
266+ synchronized (transfer ) {
267+ submitTransferOut (endpointNumber , transfer );
268+ waitForTransfer (transfer , timeout , USBDirection .OUT , endpointNumber );
287269 }
288270 }
289271 }
290272
291273 @ Override
292274 public byte [] transferIn (int endpointNumber , int timeout ) {
293275 var endpoint = getEndpoint (USBDirection .IN , endpointNumber , USBTransferType .BULK , USBTransferType .INTERRUPT );
294- var intfHandle = getInterfaceHandle (endpoint .interfaceNumber ());
295276
296277 try (var arena = Arena .openConfined ()) {
297- // set timeout
298- var timeoutHolder = arena .allocate (JAVA_INT , timeout );
299- var lastErrorState = arena .allocate (Win .LAST_ERROR_STATE .layout ());
300- if (WinUSB2 .WinUsb_SetPipePolicy (intfHandle .interfaceHandle , endpoint .endpointAddress (),
301- WinUSB .PIPE_TRANSFER_TIMEOUT (), (int ) timeoutHolder .byteSize (), timeoutHolder , lastErrorState ) == 0 )
302- throwLastError (lastErrorState , "Setting timeout failed" );
303-
304- // create native heap buffer for data
305278 var buffer = arena .allocate (endpoint .packetSize ());
306- var lengthHolder = arena . allocate ( JAVA_INT );
279+ var transfer = createSyncTransfer ( buffer );
307280
308- // receive data
309- if (WinUSB2 .WinUsb_ReadPipe (intfHandle .interfaceHandle , endpoint .endpointAddress (), buffer ,
310- (int ) buffer .byteSize (), lengthHolder , NULL , lastErrorState ) == 0 ) {
311- int err = Win .getLastError (lastErrorState );
312- if (err == Kernel32 .ERROR_SEM_TIMEOUT ())
313- throw new USBTimeoutException ("Transfer in aborted due to timeout" );
314- throwException (err , "Bulk/interrupt transfer IN failed" );
281+ synchronized (transfer ) {
282+ submitTransferIn (endpointNumber , transfer );
283+ waitForTransfer (transfer , timeout , USBDirection .IN , endpointNumber );
315284 }
316285
317- // copy data
318- int len = lengthHolder .get (JAVA_INT , 0 );
319- return buffer .asSlice (0 , len ).toArray (JAVA_BYTE );
286+ return buffer .asSlice (0 , transfer .resultSize ).toArray (JAVA_BYTE );
320287 }
321288 }
322289
290+ private WindowsTransfer createSyncTransfer (MemorySegment data ) {
291+ var transfer = new WindowsTransfer ();
292+ transfer .data = data ;
293+ transfer .dataSize = (int ) data .byteSize ();
294+ transfer .completion = USBDeviceImpl ::onSyncTransferCompleted ;
295+ return transfer ;
296+ }
297+
323298 @ Override
324299 protected Transfer createTransfer () {
325300 return new WindowsTransfer ();
@@ -386,7 +361,7 @@ synchronized void configureForAsyncIo(USBDirection direction, int endpointNumber
386361 }
387362
388363 @ Override
389- public void clearHalt (USBDirection direction , int endpointNumber ) {
364+ public synchronized void clearHalt (USBDirection direction , int endpointNumber ) {
390365 var endpoint = getEndpoint (direction , endpointNumber , USBTransferType .BULK , USBTransferType .INTERRUPT );
391366 var intfHandle = getInterfaceHandle (endpoint .interfaceNumber ());
392367
@@ -398,7 +373,7 @@ public void clearHalt(USBDirection direction, int endpointNumber) {
398373 }
399374
400375 @ Override
401- public void abortTransfers (USBDirection direction , int endpointNumber ) {
376+ public synchronized void abortTransfers (USBDirection direction , int endpointNumber ) {
402377 var endpoint = getEndpoint (direction , endpointNumber , USBTransferType .BULK , USBTransferType .INTERRUPT );
403378 var intfHandle = getInterfaceHandle (endpoint .interfaceNumber ());
404379
0 commit comments