@@ -39,7 +39,18 @@ function createInstance() {
3939 ) ;
4040}
4141
42- function createMockGPUDevice ( { detachWriteSources = false } = { } ) {
42+ function createDeferred ( ) {
43+ let resolve ;
44+ const promise = new Promise ( ( resolvePromise ) => {
45+ resolve = resolvePromise ;
46+ } ) ;
47+ return { promise, resolve } ;
48+ }
49+
50+ function createMockGPUDevice ( {
51+ detachWriteSources = false ,
52+ lost = new Promise ( ( ) => { } ) ,
53+ } = { } ) {
4354 const buffers = [ ] ;
4455 const writes = [ ] ;
4556 const queue = {
@@ -65,7 +76,7 @@ function createMockGPUDevice({ detachWriteSources = false } = {}) {
6576 } ;
6677 const device = {
6778 queue,
68- lost : new Promise ( ( ) => { } ) ,
79+ lost,
6980 addEventListener : jest . fn ( ) ,
7081 pushErrorScope : jest . fn ( ) ,
7182 popErrorScope : jest . fn ( ( ) => Promise . resolve ( null ) ) ,
@@ -94,6 +105,33 @@ function createArtifactCache(manifest, shard) {
94105 } ;
95106}
96107
108+ test ( "an external owner can defer disposal after device loss" , async ( ) => {
109+ const lost = createDeferred ( ) ;
110+ const tvm = createInstance ( ) ;
111+ const dispose = jest . spyOn ( tvm , "dispose" ) ;
112+ const gpu = createMockGPUDevice ( { lost : lost . promise } ) ;
113+ const log = jest . spyOn ( console , "error" ) . mockImplementation ( ( ) => { } ) ;
114+ try {
115+ tvm . initWebGPU ( gpu . device ) ;
116+ tvm . setDeviceLostAutoDispose ( false ) ;
117+
118+ lost . resolve ( { reason : "unknown" , message : "test device loss" } ) ;
119+ await lost . promise ;
120+ await Promise . resolve ( ) ;
121+
122+ expect ( dispose ) . not . toHaveBeenCalled ( ) ;
123+
124+ tvm . dispose ( ) ;
125+ expect ( dispose ) . toHaveBeenCalledTimes ( 1 ) ;
126+ } finally {
127+ if ( dispose . mock . calls . length === 0 ) {
128+ tvm . dispose ( ) ;
129+ }
130+ dispose . mockRestore ( ) ;
131+ log . mockRestore ( ) ;
132+ }
133+ } ) ;
134+
97135test ( "WebGPU tensor cache uploads pass-through records and decodes BF16 in place" , async ( ) => {
98136 const tvm = createInstance ( ) ;
99137 const gpu = createMockGPUDevice ( ) ;
0 commit comments