You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2015/11/17 12:57:26 UTC

[09/38] celix git commit: CELIX-272: Change readdir to readdir_r (reentrant)

CELIX-272: Change readdir to readdir_r (reentrant)


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/ca19830e
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/ca19830e
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/ca19830e

Branch: refs/heads/develop
Commit: ca19830e4a7b11f4e7705eaeadf509486c8e69d3
Parents: 07d0dfe
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Wed Nov 11 18:02:51 2015 +0100
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Wed Nov 11 18:02:51 2015 +0100

----------------------------------------------------------------------
 framework/private/src/bundle_archive.c | 55 +++++++++++++++++-----------
 framework/private/src/bundle_cache.c   | 57 +++++++++++++++++++----------
 2 files changed, 72 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/ca19830e/framework/private/src/bundle_archive.c
----------------------------------------------------------------------
diff --git a/framework/private/src/bundle_archive.c b/framework/private/src/bundle_archive.c
index c1a23aa..b126617 100644
--- a/framework/private/src/bundle_archive.c
+++ b/framework/private/src/bundle_archive.c
@@ -187,15 +187,22 @@ celix_status_t bundleArchive_recreate(char * archiveRoot, bundle_archive_pt *bun
 		if (archive->archiveRootDir == NULL) {
 		    status = CELIX_FRAMEWORK_EXCEPTION;
 		} else {
-		    struct dirent *dent;
+
             long idx = 0;
             char *location = NULL;
 
-            while ((dent = readdir(archive->archiveRootDir)) != NULL) {
-                if (dent->d_type == DT_DIR && (strncmp(dent->d_name, "version", 7) == 0)) {
-                    sscanf(dent->d_name, "version%*d.%ld", &idx);
-                }
-            }
+			struct dirent dent;
+			struct dirent *result;
+			int rc;
+
+			rc = readdir_r(archive->archiveRootDir, &dent, &result);
+
+			while (rc == 0 && result != NULL) {
+				if (dent.d_type == DT_DIR && (strncmp(dent.d_name, "version", 7) == 0)) {
+					sscanf(dent.d_name, "version%*d.%ld", &idx);
+				}
+				rc = readdir_r(archive->archiveRootDir, &dent, &result);
+			}
 
             status = CELIX_DO_IF(status, bundleArchive_getRevisionLocation(archive, 0, &location));
             status = CELIX_DO_IF(status, bundleArchive_reviseInternal(archive, true, idx, location, NULL));
@@ -708,21 +715,27 @@ static celix_status_t bundleArchive_deleteTree(bundle_archive_pt archive, char *
 	if (dir == NULL) {
 	    status = CELIX_FILE_IO_EXCEPTION;
 	} else {
-		struct dirent *dp;
-		while ((dp = readdir(dir)) != NULL) {
-		    if ((strcmp((dp->d_name), ".") != 0) && (strcmp((dp->d_name), "..") != 0)) {
-                char subdir[512];
-                snprintf(subdir, sizeof(subdir), "%s/%s", directory, dp->d_name);
-
-                if (dp->d_type == DT_DIR) {
-                    status = bundleArchive_deleteTree(archive, subdir);
-                } else {
-                    if (remove(subdir) != 0) {
-                        status = CELIX_FILE_IO_EXCEPTION;
-                        break;
-                    }
-                }
-		    }
+
+		struct dirent dp;
+		struct dirent *result = NULL;
+		int rc = 0;
+
+		rc = readdir_r(dir, &dp, &result);
+		while (rc == 0 && result != NULL) {
+			if ((strcmp((dp.d_name), ".") != 0) && (strcmp((dp.d_name), "..") != 0)) {
+				char subdir[512];
+				snprintf(subdir, sizeof(subdir), "%s/%s", directory, dp.d_name);
+
+				if (dp.d_type == DT_DIR) {
+					status = bundleArchive_deleteTree(archive, subdir);
+				} else {
+					if (remove(subdir) != 0) {
+						status = CELIX_FILE_IO_EXCEPTION;
+						break;
+					}
+				}
+			}
+			rc = readdir_r(dir, &dp, &result);
 		}
 
 		if (closedir(dir) != 0) {

http://git-wip-us.apache.org/repos/asf/celix/blob/ca19830e/framework/private/src/bundle_cache.c
----------------------------------------------------------------------
diff --git a/framework/private/src/bundle_cache.c b/framework/private/src/bundle_cache.c
index 6eaf5d0..efe4f01 100644
--- a/framework/private/src/bundle_cache.c
+++ b/framework/private/src/bundle_cache.c
@@ -74,7 +74,8 @@ celix_status_t bundleCache_destroy(bundle_cache_pt *cache) {
 }
 
 celix_status_t bundleCache_delete(bundle_cache_pt cache) {
-	return bundleCache_deleteTree(cache, cache->cacheDir);
+    printf("DELETING CACHE DIR: %s\n", cache->cacheDir);
+    return bundleCache_deleteTree(cache, cache->cacheDir);
 }
 
 celix_status_t bundleCache_getArchives(bundle_cache_pt cache, array_list_pt *archives) {
@@ -90,19 +91,23 @@ celix_status_t bundleCache_getArchives(bundle_cache_pt cache, array_list_pt *arc
 
 	if (dir != NULL) {
         array_list_pt list = NULL;
-		struct dirent *dp;
         arrayList_create(&list);
-        
-        while ((dp = readdir(dir)) != NULL) {
-			char archiveRoot[512];
 
-			snprintf(archiveRoot, sizeof(archiveRoot), "%s/%s", cache->cacheDir, dp->d_name);
+        struct dirent dp;
+        struct dirent *result = NULL;
+        int rc = 0;
 
-            if (dp->d_type == DT_DIR
-                    && (strcmp((dp->d_name), ".") != 0)
-                    && (strcmp((dp->d_name), "..") != 0)
-                    && (strncmp(dp->d_name, "bundle", 6) == 0)
-                    && (strcmp(dp->d_name, "bundle0") != 0)) {
+        rc = readdir_r(dir, &dp, &result);
+        while (rc == 0 && result != NULL) {
+            char archiveRoot[512];
+
+            snprintf(archiveRoot, sizeof(archiveRoot), "%s/%s", cache->cacheDir, dp.d_name);
+
+            if (dp.d_type == DT_DIR
+                && (strcmp((dp.d_name), ".") != 0)
+                && (strcmp((dp.d_name), "..") != 0)
+                && (strncmp(dp.d_name, "bundle", 6) == 0)
+                && (strcmp(dp.d_name, "bundle0") != 0)) {
 
                 bundle_archive_pt archive = NULL;
                 status = bundleArchive_recreate(strdup(archiveRoot), &archive);
@@ -110,13 +115,23 @@ celix_status_t bundleCache_getArchives(bundle_cache_pt cache, array_list_pt *arc
                     arrayList_add(list, archive);
                 }
             }
+
+            readdir_r(dir, &dp, &result);
+        }
+
+        if (rc != 0) {
+            fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR, "Error reading dir");
+            status = CELIX_FILE_IO_EXCEPTION;
+        } else {
+            status = CELIX_SUCCESS;
         }
 
         closedir(dir);
 
-        *archives = list;
+        if (status == CELIX_SUCCESS) {
+            *archives = list;
+        }
 
-        status = CELIX_SUCCESS;
 	} else {
 	    status = CELIX_FILE_IO_EXCEPTION;
 	}
@@ -147,13 +162,16 @@ static celix_status_t bundleCache_deleteTree(bundle_cache_pt cache, char * direc
     if (dir == NULL) {
         status = CELIX_FILE_IO_EXCEPTION;
     } else {
-        struct dirent *dp;
-        while ((dp = readdir(dir)) != NULL) {
-            if ((strcmp((dp->d_name), ".") != 0) && (strcmp((dp->d_name), "..") != 0)) {
+        struct dirent dp;
+        struct dirent *result = NULL;
+        int rc = 0;
+        rc = readdir_r(dir, &dp, &result);
+        while (rc == 0 && result != NULL) {
+            if ((strcmp((dp.d_name), ".") != 0) && (strcmp((dp.d_name), "..") != 0)) {
                 char subdir[512];
-                snprintf(subdir, sizeof(subdir), "%s/%s", directory, dp->d_name);
+                snprintf(subdir, sizeof(subdir), "%s/%s", directory, dp.d_name);
 
-                if (dp->d_type == DT_DIR) {
+                if (dp.d_type == DT_DIR) {
                     status = bundleCache_deleteTree(cache, subdir);
                 } else {
                     if (remove(subdir) != 0) {
@@ -162,6 +180,7 @@ static celix_status_t bundleCache_deleteTree(bundle_cache_pt cache, char * direc
                     }
                 }
             }
+            readdir_r(dir, &dp, &result);
         }
 
         if (closedir(dir) != 0) {
@@ -174,7 +193,7 @@ static celix_status_t bundleCache_deleteTree(bundle_cache_pt cache, char * direc
         }
     }
 
-    framework_logIfError(logger, status, NULL, "Failed to delete tree");
+    framework_logIfError(logger, status, NULL, "Failed to delete tree at dir '%s'", directory);
 
     return status;
 }