- From: Godmar Back <gback@stanford.edu>
- Date: Fri, 16 May 2003 16:53:57 -0700 (PDT)
- To: www-jigsaw@w3.org
- Cc: gback@stanford.edu, bmahe@w3.org
Hi, here's a possible bug in org/w3c/jigsaw/servlet/JigsawServletContext.java, see below. Consider the case where root is not an instanceof VirtualHostResource. In this case, "rr_root.lock()" is invoked twice (on lines 424 and 460), but "rr_root.unlock()" only once (on line 476). However, if root is an instanceof VirtualHostResource, rr_root.lock() and rr_root.unlock() is invoked once each (lines 424 and 476, resp.) This discrepancy might be inconsequential if your lock implementation tolerates double locks. Could you confirm/deny this potential bug? Thanks! - Godmar 00420: protected static ResourceReference getLocalRoot(ResourceReference rr_root, 00421: ResourceReference ref) 00422: { 00423: try { 00424: FramedResource root = (FramedResource)rr_root.lock(); 00425: if (root instanceof VirtualHostResource) { 00426: //backward to the virtual host resource 00427: ResourceReference rr = null; 00428: ResourceReference rrp = null; 00429: FramedResource res = null; 00430: try { 00431: res = (FramedResource)ref.lock(); 00432: if (res instanceof ResourceFrame) { 00433: ResourceFrame fr = (ResourceFrame)res; 00434: rr = fr.getResource().getResourceReference(); 00435: } else { 00436: rr = ref; 00437: } 00438: } catch (InvalidResourceException ex) { 00439: return rr_root; 00440: } finally { 00441: ref.unlock(); 00442: } 00443: 00444: while (true) { 00445: try { 00446: res = (FramedResource)rr.lock(); 00447: rrp = res.getParent(); 00448: if ((rrp == rr_root) || (rrp == null)) { 00449: return getLocalRoot(rr, ref); 00450: } 00451: } catch (InvalidResourceException ex) { 00452: return rr_root; 00453: } finally { 00454: rr.unlock(); 00455: } 00456: rr = rrp; 00457: } 00458: } else { 00459: try { 00460: FramedResource res = (FramedResource)rr_root.lock(); 00461: ForwardFrame ffr = (ForwardFrame) 00462: res.getFrame("org.w3c.jigsaw.proxy.ForwardFrame"); 00463: if (ffr == null) { 00464: return rr_root; 00465: } else { 00466: ResourceReference rr = ffr.getLocalRootResource(); 00467: return getLocalRoot(rr, ref); 00468: } 00469: } catch (InvalidResourceException ex) { 00470: return rr_root; 00471: } 00472: } 00473: } catch (InvalidResourceException ex) { 00474: return rr_root; 00475: } finally { 00476: rr_root.unlock(); 00477: } 00478: }
Received on Friday, 16 May 2003 19:54:12 UTC