Changeset 66742 in vbox for trunk/src/VBox/Runtime/common/vfs
- Timestamp:
- May 2, 2017 9:37:06 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 115148
- Location:
- trunk/src/VBox/Runtime/common/vfs
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/vfs/vfsbase.cpp
r66741 r66742 180 180 { 181 181 /** The VFS magic (RTVFSOBJ_MAGIC). */ 182 uint32_t uMagic; 182 uint32_t uMagic : 31; 183 /** Set if we've got no VFS reference but still got a valid hVfs. 184 * This is hack for permanent root directory objects. */ 185 uint32_t fNoVfsRef : 1; 183 186 /** The number of references to this VFS object. */ 184 187 uint32_t volatile cRefs; … … 188 191 PCRTVFSOBJOPS pOps; 189 192 /** The lock protecting all access to the VFS. 190 * Only valid RTVFS_C_THREAD_SAFE is set, otherwise it is NIL_RTVFSLOCK. */193 * Only valid if RTVFS_C_THREAD_SAFE is set, otherwise it is NIL_RTVFSLOCK. */ 191 194 RTVFSLOCK hLock; 192 195 /** Reference back to the VFS containing this object. */ … … 344 347 345 348 349 /********************************************************************************************************************************* 350 * Internal Functions * 351 *********************************************************************************************************************************/ 352 DECLINLINE(uint32_t) rtVfsObjRelease(RTVFSOBJINTERNAL *pThis); 353 354 346 355 347 356 /* … … 661 670 * 662 671 * @param pThis The base object handle data. 663 */ 664 DECLINLINE(void) rtVfsObjRetainVoid(RTVFSOBJINTERNAL *pThis) 672 * @param pszCaller Where we're called from. 673 */ 674 DECLINLINE(void) rtVfsObjRetainVoid(RTVFSOBJINTERNAL *pThis, const char *pszCaller) 665 675 { 666 676 uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs); 677 LogFlow(("rtVfsObjRetainVoid(%p/%p) -> %d; caller=%s\n", pThis, pThis->pvThis, cRefs, pszCaller)); RT_NOREF(pszCaller); 667 678 AssertMsg(cRefs > 1 && cRefs < _1M, 668 ("%#x %p ops=%p %s (%d) \n", cRefs, pThis, pThis->pOps, pThis->pOps->pszName, pThis->pOps->enmType));679 ("%#x %p ops=%p %s (%d); caller=%s\n", cRefs, pThis, pThis->pOps, pThis->pOps->pszName, pThis->pOps->enmType, pszCaller)); 669 680 NOREF(cRefs); 670 681 } … … 678 689 * @param pObjOps The base object vtable. 679 690 * @param hVfs The VFS handle to associate with. 691 * @param fNoVfsRef If set, do not retain an additional reference to 692 * @a hVfs. Permanent root dir hack. 680 693 * @param hLock The lock handle, pseudo handle or nil. 681 694 * @param pvThis Pointer to the private data. 682 695 */ 683 static int rtVfsObjInitNewObject(RTVFSOBJINTERNAL *pThis, PCRTVFSOBJOPS pObjOps, RTVFS hVfs, RTVFSLOCK hLock, void *pvThis) 696 static int rtVfsObjInitNewObject(RTVFSOBJINTERNAL *pThis, PCRTVFSOBJOPS pObjOps, RTVFS hVfs, bool fNoVfsRef, 697 RTVFSLOCK hLock, void *pvThis) 684 698 { 685 699 /* … … 732 746 * Do the actual initializing. 733 747 */ 734 pThis->uMagic = RTVFSOBJ_MAGIC; 735 pThis->pvThis = pvThis; 736 pThis->pOps = pObjOps; 737 pThis->cRefs = 1; 738 pThis->hVfs = hVfs; 739 pThis->hLock = hLock; 740 if (hVfs != NIL_RTVFS) 741 rtVfsObjRetainVoid(&hVfs->Base); 748 pThis->uMagic = RTVFSOBJ_MAGIC; 749 pThis->fNoVfsRef = fNoVfsRef; 750 pThis->pvThis = pvThis; 751 pThis->pOps = pObjOps; 752 pThis->cRefs = 1; 753 pThis->hVfs = hVfs; 754 pThis->hLock = hLock; 755 if (hVfs != NIL_RTVFS && !fNoVfsRef) 756 rtVfsObjRetainVoid(&hVfs->Base, "rtVfsObjInitNewObject"); 742 757 743 758 return VINF_SUCCESS; … … 769 784 return VERR_NO_MEMORY; 770 785 771 int rc = rtVfsObjInitNewObject(pThis, pObjOps, hVfs, hLock,786 int rc = rtVfsObjInitNewObject(pThis, pObjOps, hVfs, false /*fNoVfsRef*/, hLock, 772 787 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 773 788 if (RT_FAILURE(rc)) … … 792 807 { 793 808 uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs); 809 LogFlow(("rtVfsObjRetain(%p/%p) -> %d\n", pThis, pThis->pvThis, cRefs)); 794 810 AssertMsg(cRefs > 1 && cRefs < _1M, 795 811 ("%#x %p ops=%p %s (%d)\n", cRefs, pThis, pThis->pOps, pThis->pOps->pszName, pThis->pOps->enmType)); … … 898 914 /* no default as we want gcc warnings. */ 899 915 } 900 ASMAtomicWriteU32(&pThis->uMagic, RTVFSOBJ_MAGIC_DEAD);916 pThis->uMagic = RTVFSOBJ_MAGIC_DEAD; 901 917 RTVfsLockReleaseWrite(pThis->hLock); 902 918 … … 906 922 int rc = pThis->pOps->pfnClose(pThis->pvThis); 907 923 AssertRC(rc); 924 if (pThis->hVfs != NIL_RTVFS) 925 { 926 if (!pThis->fNoVfsRef) 927 rtVfsObjRelease(&pThis->hVfs->Base); 928 pThis->hVfs = NIL_RTVFS; 929 } 908 930 RTMemFree(pvToFree); 909 931 } … … 920 942 uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs); 921 943 AssertMsg(cRefs < _1M, ("%#x %p ops=%p %s (%d)\n", cRefs, pThis, pThis->pOps, pThis->pOps->pszName, pThis->pOps->enmType)); 944 LogFlow(("rtVfsObjRelease(%p/%p) -> %d\n", pThis, pThis->pvThis, cRefs)); 922 945 if (cRefs == 0) 923 946 rtVfsObjDestroy(pThis); … … 947 970 if (pThis->pOps->enmType == RTVFSOBJTYPE_VFS) 948 971 { 949 rtVfsObjRetainVoid(pThis );972 rtVfsObjRetainVoid(pThis, "RTVfsObjToVfs"); 950 973 LogFlow(("RTVfsObjToVfs(%p) -> %p\n", pThis, RT_FROM_MEMBER(pThis, RTVFSINTERNAL, Base))); 951 974 return RT_FROM_MEMBER(pThis, RTVFSINTERNAL, Base); … … 966 989 if (pThis->pOps->enmType == RTVFSOBJTYPE_FS_STREAM) 967 990 { 968 rtVfsObjRetainVoid(pThis );991 rtVfsObjRetainVoid(pThis, "RTVfsObjToFsStream"); 969 992 return RT_FROM_MEMBER(pThis, RTVFSFSSTREAMINTERNAL, Base); 970 993 } … … 984 1007 if (pThis->pOps->enmType == RTVFSOBJTYPE_DIR) 985 1008 { 986 rtVfsObjRetainVoid(pThis );1009 rtVfsObjRetainVoid(pThis, "RTVfsObjToDir"); 987 1010 return RT_FROM_MEMBER(pThis, RTVFSDIRINTERNAL, Base); 988 1011 } … … 1003 1026 || pThis->pOps->enmType == RTVFSOBJTYPE_FILE) 1004 1027 { 1005 rtVfsObjRetainVoid(pThis );1028 rtVfsObjRetainVoid(pThis, "RTVfsObjToIoStream"); 1006 1029 return RT_FROM_MEMBER(pThis, RTVFSIOSTREAMINTERNAL, Base); 1007 1030 } … … 1021 1044 if (pThis->pOps->enmType == RTVFSOBJTYPE_FILE) 1022 1045 { 1023 rtVfsObjRetainVoid(pThis );1046 rtVfsObjRetainVoid(pThis, "RTVfsObjToFile"); 1024 1047 return RT_FROM_MEMBER(pThis, RTVFSFILEINTERNAL, Stream.Base); 1025 1048 } … … 1039 1062 if (pThis->pOps->enmType == RTVFSOBJTYPE_SYMLINK) 1040 1063 { 1041 rtVfsObjRetainVoid(pThis );1064 rtVfsObjRetainVoid(pThis, "RTVfsObjToSymlink"); 1042 1065 return RT_FROM_MEMBER(pThis, RTVFSSYMLINKINTERNAL, Base); 1043 1066 } … … 1055 1078 AssertReturn(pThis->uMagic == RTVFSOBJ_MAGIC, NIL_RTVFSOBJ); 1056 1079 1057 rtVfsObjRetainVoid(pThis );1080 rtVfsObjRetainVoid(pThis, "RTVfsObjFromVfs"); 1058 1081 LogFlow(("RTVfsObjFromVfs(%p) -> %p\n", hVfs, pThis)); 1059 1082 return pThis; … … 1071 1094 AssertReturn(pThis->uMagic == RTVFSOBJ_MAGIC, NIL_RTVFSOBJ); 1072 1095 1073 rtVfsObjRetainVoid(pThis );1096 rtVfsObjRetainVoid(pThis, "RTVfsObjFromFsStream"); 1074 1097 return pThis; 1075 1098 } … … 1086 1109 AssertReturn(pThis->uMagic == RTVFSOBJ_MAGIC, NIL_RTVFSOBJ); 1087 1110 1088 rtVfsObjRetainVoid(pThis );1111 rtVfsObjRetainVoid(pThis, "RTVfsObjFromDir"); 1089 1112 return pThis; 1090 1113 } … … 1101 1124 AssertReturn(pThis->uMagic == RTVFSOBJ_MAGIC, NIL_RTVFSOBJ); 1102 1125 1103 rtVfsObjRetainVoid(pThis );1126 rtVfsObjRetainVoid(pThis, "RTVfsObjFromIoStream"); 1104 1127 return pThis; 1105 1128 } … … 1116 1139 AssertReturn(pThis->uMagic == RTVFSOBJ_MAGIC, NIL_RTVFSOBJ); 1117 1140 1118 rtVfsObjRetainVoid(pThis );1141 rtVfsObjRetainVoid(pThis, "RTVfsObjFromFile"); 1119 1142 return pThis; 1120 1143 } … … 1131 1154 AssertReturn(pThis->uMagic == RTVFSOBJ_MAGIC, NIL_RTVFSOBJ); 1132 1155 1133 rtVfsObjRetainVoid(pThis );1156 rtVfsObjRetainVoid(pThis, "RTVfsObjFromSymlink"); 1134 1157 return pThis; 1135 1158 } … … 1718 1741 return VERR_NO_MEMORY; 1719 1742 1720 int rc = rtVfsObjInitNewObject(&pThis->Base, &pVfsOps->Obj, hVfs, hLock,1743 int rc = rtVfsObjInitNewObject(&pThis->Base, &pVfsOps->Obj, hVfs, false /*fNoVfsRef*/, hLock, 1721 1744 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 1722 1745 if (RT_FAILURE(rc)) … … 1732 1755 *ppvInstance = pThis->Base.pvThis; 1733 1756 1757 LogFlow(("RTVfsNew -> VINF_SUCCESS; hVfs=%p pvThis=%p\n", pThis, pThis->Base.pvThis)); 1734 1758 return VINF_SUCCESS; 1735 1759 } … … 1850 1874 return VERR_NO_MEMORY; 1851 1875 1852 int rc = rtVfsObjInitNewObject(&pThis->Base, &pFsStreamOps->Obj, hVfs, hLock,1876 int rc = rtVfsObjInitNewObject(&pThis->Base, &pFsStreamOps->Obj, hVfs, false /*fNoVfsRef*/, hLock, 1853 1877 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 1854 1878 … … 1955 1979 RTVFSDIR_ASSERT_OPS(pDirOps, RTVFSOBJTYPE_DIR); 1956 1980 Assert(cbInstance > 0); 1957 AssertReturn(! fFlags, VERR_INVALID_FLAGS);1981 AssertReturn(!(fFlags & ~RTVFSDIR_F_NO_VFS_REF), VERR_INVALID_FLAGS); 1958 1982 AssertPtr(ppvInstance); 1959 1983 AssertPtr(phVfsDir); … … 1969 1993 return VERR_NO_MEMORY; 1970 1994 1971 int rc = rtVfsObjInitNewObject(&pThis->Base, &pDirOps->Obj, hVfs, hLock,1995 int rc = rtVfsObjInitNewObject(&pThis->Base, &pDirOps->Obj, hVfs, RT_BOOL(fFlags & RTVFSDIR_F_NO_VFS_REF), hLock, 1972 1996 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 1973 1997 if (RT_FAILURE(rc)) … … 2216 2240 return VERR_NO_MEMORY; 2217 2241 2218 int rc = rtVfsObjInitNewObject(&pThis->Base, &pSymlinkOps->Obj, hVfs, hLock,2242 int rc = rtVfsObjInitNewObject(&pThis->Base, &pSymlinkOps->Obj, hVfs, false /*fNoVfsRef*/, hLock, 2219 2243 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 2220 2244 if (RT_FAILURE(rc)) … … 2369 2393 return VERR_NO_MEMORY; 2370 2394 2371 int rc = rtVfsObjInitNewObject(&pThis->Base, &pIoStreamOps->Obj, hVfs, hLock,2395 int rc = rtVfsObjInitNewObject(&pThis->Base, &pIoStreamOps->Obj, hVfs, false /*fNoVfsRef*/, hLock, 2372 2396 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 2373 2397 if (RT_FAILURE(rc)) … … 2441 2465 if (pThis->pOps->Obj.enmType == RTVFSOBJTYPE_FILE) 2442 2466 { 2443 rtVfsObjRetainVoid(&pThis->Base );2467 rtVfsObjRetainVoid(&pThis->Base, "RTVfsIoStrmToFile"); 2444 2468 return RT_FROM_MEMBER(pThis, RTVFSFILEINTERNAL, Stream); 2445 2469 } … … 2825 2849 return VERR_NO_MEMORY; 2826 2850 2827 int rc = rtVfsObjInitNewObject(&pThis->Stream.Base, &pFileOps->Stream.Obj, hVfs, hLock,2851 int rc = rtVfsObjInitNewObject(&pThis->Stream.Base, &pFileOps->Stream.Obj, hVfs, false /*fNoVfsRef*/, hLock, 2828 2852 (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT)); 2829 2853 if (RT_FAILURE(rc)) … … 2944 2968 AssertReturn(pThis->uMagic == RTVFSFILE_MAGIC, NIL_RTVFSIOSTREAM); 2945 2969 2946 rtVfsObjRetainVoid(&pThis->Stream.Base );2970 rtVfsObjRetainVoid(&pThis->Stream.Base, "RTVfsFileToIoStream"); 2947 2971 return &pThis->Stream; 2948 2972 } -
trunk/src/VBox/Runtime/common/vfs/vfschain.cpp
r66675 r66742 218 218 RTVFSFILE hVfsFile = NIL_RTVFSFILE; 219 219 int rc = RTVfsFileOpen(hVfsIn, pElement->paArgs[0].psz, pElement->uProvider, &hVfsFile); 220 RTVfsRelease(hVfsIn); 220 221 if (RT_SUCCESS(rc)) 221 222 { … … 232 233 RTVFSDIR hVfsDir = NIL_RTVFSDIR; 233 234 int rc = RTVfsDirOpen(hVfsIn, pElement->paArgs[0].psz, (uint32_t)pElement->uProvider, &hVfsDir); 235 RTVfsRelease(hVfsIn); 234 236 if (RT_SUCCESS(rc)) 235 237 { … … 242 244 return rc; 243 245 } 246 RTVfsRelease(hVfsIn); 244 247 return VERR_VFS_CHAIN_IPE; 245 248 } … … 256 259 RTVFSFILE hVfsFile = NIL_RTVFSFILE; 257 260 int rc = RTVfsDirOpenFile(hVfsDirIn, pElement->paArgs[0].psz, pElement->uProvider, &hVfsFile); 261 RTVfsDirRelease(hVfsDirIn); 258 262 if (RT_SUCCESS(rc)) 259 263 { … … 270 274 RTVFSDIR hVfsDir = NIL_RTVFSDIR; 271 275 int rc = RTVfsDirOpenDir(hVfsDirIn, pElement->paArgs[0].psz, pElement->uProvider, &hVfsDir); 276 RTVfsDirRelease(hVfsDirIn); 272 277 if (RT_SUCCESS(rc)) 273 278 { … … 280 285 return rc; 281 286 } 287 RTVfsDirRelease(hVfsDirIn); 282 288 return VERR_VFS_CHAIN_IPE; 283 289 }
Note:
See TracChangeset
for help on using the changeset viewer.