You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2012/01/09 15:21:45 UTC
svn commit: r1229165 - in /incubator/celix/trunk/framework/private/src:
bundle_archive.c filter.c framework.c manifest.c service_tracker.c
Author: abroekhuis
Date: Mon Jan 9 14:21:45 2012
New Revision: 1229165
URL: http://svn.apache.org/viewvc?rev=1229165&view=rev
Log:
Applied patch for issue CELIX-24
Applied patch for building celix on windows. Fixed some memory leaks introduced with this patch.
Modified:
incubator/celix/trunk/framework/private/src/bundle_archive.c
incubator/celix/trunk/framework/private/src/filter.c
incubator/celix/trunk/framework/private/src/framework.c
incubator/celix/trunk/framework/private/src/manifest.c
incubator/celix/trunk/framework/private/src/service_tracker.c
Modified: incubator/celix/trunk/framework/private/src/bundle_archive.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/bundle_archive.c?rev=1229165&r1=1229164&r2=1229165&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/bundle_archive.c (original)
+++ incubator/celix/trunk/framework/private/src/bundle_archive.c Mon Jan 9 14:21:45 2012
@@ -251,8 +251,8 @@ celix_status_t bundleArchive_getLocation
if (archive->location == NULL) {
apr_file_t *bundleLocationFile;
apr_status_t rv;
- char * bundleLocation = (char *)malloc(strlen(archive->archiveRoot) + 16);
- strcpy(bundleLocation,archive->archiveRoot);
+ char * bundleLocation = (char *)calloc(sizeof(char), strlen(archive->archiveRoot) + 17);
+ strcat(bundleLocation,archive->archiveRoot);
strcat(bundleLocation, "/bundle.location");
if ((rv = apr_file_open(&bundleLocationFile, bundleLocation, APR_FOPEN_READ, APR_OS_DEFAULT, archive->mp)) != APR_SUCCESS) {
Modified: incubator/celix/trunk/framework/private/src/filter.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/filter.c?rev=1229165&r1=1229164&r2=1229165&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/filter.c (original)
+++ incubator/celix/trunk/framework/private/src/filter.c Mon Jan 9 14:21:45 2012
@@ -91,7 +91,7 @@ void filter_destroy(FILTER filter) {
arrayList_destroy(filter->value);
filter->value = NULL;
} else {
- // free(filter->value);
+ free(filter->value);
filter->value = NULL;
}
free(filter->attribute);
@@ -377,7 +377,7 @@ ARRAY_LIST filter_parseSubstring(char *
switch (c) {
case ')': {
if (strlen(sub) > 0) {
- arrayList_add(operands, sub);
+ arrayList_add(operands, strdup(sub));
}
keepRunning = 0;
break;
@@ -388,7 +388,7 @@ ARRAY_LIST filter_parseSubstring(char *
}
case '*': {
if (strlen(sub) > 0) {
- arrayList_add(operands, sub);
+ arrayList_add(operands, strdup(sub));
}
sub[0] = '\0';
arrayList_add(operands, NULL);
@@ -410,6 +410,7 @@ ARRAY_LIST filter_parseSubstring(char *
}
}
}
+ free(sub);
size = arrayList_size(operands);
if (size == 0) {
Modified: incubator/celix/trunk/framework/private/src/framework.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/framework.c?rev=1229165&r1=1229164&r2=1229165&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/framework.c (original)
+++ incubator/celix/trunk/framework/private/src/framework.c Mon Jan 9 14:21:45 2012
@@ -36,6 +36,10 @@
#include <apr_thread_cond.h>
#include <apr_thread_mutex.h>
#include <apr_thread_proc.h>
+#ifdef _WIN32
+#include <winbase.h>
+#include <windows.h>
+#endif
#include "framework.h"
#include "filter.h"
@@ -175,6 +179,7 @@ celix_status_t framework_destroy(FRAMEWO
HASH_MAP_ITERATOR iterator = hashMapIterator_create(framework->installedBundleMap);
while (hashMapIterator_hasNext(iterator)) {
+ LINKED_LIST wires;
HASH_MAP_ENTRY entry = hashMapIterator_nextEntry(iterator);
BUNDLE bundle = hashMapEntry_getValue(entry);
char * location = hashMapEntry_getKey(entry);
@@ -182,7 +187,7 @@ celix_status_t framework_destroy(FRAMEWO
// for each installed bundle, clean up memory
MODULE mod = NULL;
bundle_getCurrentModule(bundle, &mod);
- LINKED_LIST wires = module_getWires(mod);
+ wires = module_getWires(mod);
if (wires != NULL) {
LINKED_LIST_ITERATOR iter = linkedListIterator_create(wires, 0);
while (linkedListIterator_hasNext(iter)) {
@@ -217,6 +222,10 @@ celix_status_t framework_destroy(FRAMEWO
celix_status_t fw_init(FRAMEWORK framework) {
celix_status_t status = framework_acquireBundleLock(framework, framework->bundle, BUNDLE_INSTALLED|BUNDLE_RESOLVED|BUNDLE_STARTING|BUNDLE_ACTIVE);
BUNDLE_STATE state;
+ char *location;
+ MODULE module = NULL;
+ HASH_MAP wires;
+ ARRAY_LIST archives;
if (status != CELIX_SUCCESS) {
framework_releaseBundleLock(framework, framework->bundle);
@@ -242,17 +251,14 @@ celix_status_t fw_init(FRAMEWORK framewo
framework->installedBundleMap = hashMap_create(string_hash, NULL, string_equals, NULL);
- char *location;
status = bundleArchive_getLocation(bundle_getArchive(framework->bundle), &location);
hashMap_put(framework->installedBundleMap, location, framework->bundle);
- MODULE module = NULL;
-
status = bundle_getCurrentModule(framework->bundle, &module);
if (status != CELIX_SUCCESS) {
return status;
}
- HASH_MAP wires = resolver_resolve(module);
+ wires = resolver_resolve(module);
if (wires == NULL) {
printf("Unresolved constraints in System Bundle\n");
framework_releaseBundleLock(framework, framework->bundle);
@@ -263,19 +269,25 @@ celix_status_t fw_init(FRAMEWORK framewo
}
// reload archives from cache
- ARRAY_LIST archives;
status = bundleCache_getArchives(framework->cache, &archives);
if (status != CELIX_SUCCESS) {
return status;
} else {
+#ifdef _WIN32
+ HMODULE this_process;
+#endif
int arcIdx;
+ void * handle;
+ BUNDLE_CONTEXT context = NULL;
+ ACTIVATOR activator;
+
for (arcIdx = 0; arcIdx < arrayList_size(archives); arcIdx++) {
BUNDLE_ARCHIVE archive = (BUNDLE_ARCHIVE) arrayList_get(archives, arcIdx);
long id;
+ BUNDLE_STATE bundleState;
bundleArchive_getId(archive, &id);
framework->nextBundleId = fmaxl(framework->nextBundleId, id + 1);
- BUNDLE_STATE bundleState;
-
+
bundleArchive_getPersistentState(archive, &bundleState);
if (bundleState == BUNDLE_UNINSTALLED) {
bundleArchive_closeAndDelete(archive);
@@ -293,14 +305,18 @@ celix_status_t fw_init(FRAMEWORK framewo
apr_thread_cond_create(&framework->shutdownGate, framework->mp);
- void * handle = dlopen(NULL, RTLD_LAZY|RTLD_LOCAL);
+#ifdef _WIN32
+ GetModuleHandleEx(0,0,&this_process);
+ handle = GetModuleHandle(0);
+#else
+ handle = dlopen(NULL, RTLD_LAZY|RTLD_LOCAL);
+#endif
if (handle == NULL) {
printf ("%s\n", dlerror());
framework_releaseBundleLock(framework, framework->bundle);
return CELIX_START_ERROR;
}
-
- BUNDLE_CONTEXT context = NULL;
+
if (bundleContext_create(framework, framework->bundle, &context) != CELIX_SUCCESS) {
return CELIX_START_ERROR;
}
@@ -308,10 +324,12 @@ celix_status_t fw_init(FRAMEWORK framewo
bundle_setHandle(framework->bundle, handle);
- ACTIVATOR activator = (ACTIVATOR) apr_palloc(framework->mp, (sizeof(*activator)));
+ activator = (ACTIVATOR) apr_palloc(framework->mp, (sizeof(*activator)));
if (activator == NULL) {
status = CELIX_ENOMEM;
} else {
+ BUNDLE_CONTEXT context = NULL;
+ void * userData = NULL;
void * (*create)(BUNDLE_CONTEXT context);
void (*start)(void * handle, BUNDLE_CONTEXT context);
void (*stop)(void * handle, BUNDLE_CONTEXT context);
@@ -324,11 +342,9 @@ celix_status_t fw_init(FRAMEWORK framewo
activator->stop = stop;
activator->destroy = destroy;
bundle_setActivator(framework->bundle, activator);
-
- BUNDLE_CONTEXT context = NULL;
+
bundle_getContext(framework->bundle, &context);
-
- void * userData = NULL;
+
if (create != NULL) {
userData = create(context);
}
@@ -402,8 +418,10 @@ celix_status_t fw_installBundle(FRAMEWOR
celix_status_t fw_installBundle2(FRAMEWORK framework, BUNDLE * bundle, long id, char * location, char *inputFile, BUNDLE_ARCHIVE archive) {
BUNDLE_ARCHIVE bundle_archive = NULL;
BUNDLE_STATE state;
+ apr_pool_t *bundlePool;
+ bool locked;
- celix_status_t status = framework_acquireInstallLock(framework, location);
+ celix_status_t status = framework_acquireInstallLock(framework, location);
if (status != CELIX_SUCCESS) {
return status;
}
@@ -422,7 +440,6 @@ celix_status_t fw_installBundle2(FRAMEWO
return CELIX_SUCCESS;
}
- apr_pool_t *bundlePool;
apr_pool_create(&bundlePool, framework->mp);
if (archive == NULL) {
id = framework_getNextBundleId(framework);
@@ -438,7 +455,7 @@ celix_status_t fw_installBundle2(FRAMEWO
// multiple revisions not yet implemented
}
- bool locked = framework_acquireGlobalLock(framework);
+ locked = framework_acquireGlobalLock(framework);
if (!locked) {
printf("Unable to acquire the global lock to install the bundle\n");
status = CELIX_BUNDLE_EXCEPTION;
@@ -466,17 +483,19 @@ celix_status_t framework_getBundleEntry(
status = bundleArchive_getCurrentRevision(bundle_getArchive(bundle), &revision);
if (status == CELIX_SUCCESS) {
+ char *root;
if ((strlen(name) > 0) && (name[0] == '/')) {
name++;
}
- char *root;
+
status = bundleRevision_getRoot(revision, &root);
if (status == CELIX_SUCCESS) {
char *e = NULL;
- apr_filepath_merge(&e, root, name, APR_FILEPATH_NOTABOVEROOT, framework->mp);
+ apr_status_t ret;
apr_finfo_t info;
- apr_status_t ret = apr_stat(&info, e, APR_FINFO_DIRENT|APR_FINFO_TYPE, framework->mp);
+ apr_filepath_merge(&e, root, name, APR_FILEPATH_NOTABOVEROOT, framework->mp);
+ ret = apr_stat(&info, e, APR_FINFO_DIRENT|APR_FINFO_TYPE, framework->mp);
if (ret == APR_ENOENT) {
(*entry) = NULL;
} else if (ret == APR_SUCCESS || ret == APR_INCOMPLETE) {
@@ -490,22 +509,39 @@ celix_status_t framework_getBundleEntry(
celix_status_t fw_startBundle(FRAMEWORK framework, BUNDLE bundle, int options ATTRIBUTE_UNUSED) {
celix_status_t lock = framework_acquireBundleLock(framework, bundle, BUNDLE_INSTALLED|BUNDLE_RESOLVED|BUNDLE_STARTING|BUNDLE_ACTIVE);
- if (lock != CELIX_SUCCESS) {
- printf("Unable to start\n");
- framework_releaseBundleLock(framework, bundle);
- return lock;
- }
HASH_MAP wires;
-
void * handle;
BUNDLE_CONTEXT context = NULL;
-
BUNDLE_STATE state;
+ MODULE module = NULL;
+ MANIFEST manifest = NULL;
+ char *library;
+ #ifdef __linux__
+ char * library_prefix = "lib";
+ char * library_extension = ".so";
+ #elif __APPLE__
+ char * library_prefix = "lib";
+ char * library_extension = ".dylib";
+ #elif WIN32
+ char * library_prefix = "";
+ char * library_extension = ".dll";
+ #endif
+
+ char libraryPath[256];
+ long refreshCount;
+ char *archiveRoot;
+ long revisionNumber;
+ ACTIVATOR activator;
+
+ if (lock != CELIX_SUCCESS) {
+ printf("Unable to start\n");
+ framework_releaseBundleLock(framework, bundle);
+ return lock;
+ }
bundle_getState(bundle, &state);
- MODULE module = NULL;
switch (state) {
case BUNDLE_UNINSTALLED:
printf("Cannot start bundle since it is uninstalled.");
@@ -541,28 +577,12 @@ celix_status_t fw_startBundle(FRAMEWORK
}
bundle_setContext(bundle, context);
- MANIFEST manifest = NULL;
- char *library;
if (getManifest(bundle_getArchive(bundle), bundle->memoryPool, &manifest) == CELIX_SUCCESS) {
bundle_setManifest(bundle, manifest);
library = manifest_getValue(manifest, HEADER_LIBRARY);
}
- #ifdef __linux__
- char * library_prefix = "lib";
- char * library_extension = ".so";
- #elif __APPLE__
- char * library_prefix = "lib";
- char * library_extension = ".dylib";
- #elif WIN32
- char * library_prefix = "";
- char * library_extension = ".dll";
- #endif
-
- char libraryPath[256];
- long refreshCount;
- char *archiveRoot;
- long revisionNumber;
+
bundleArchive_getRefreshCount(bundle_getArchive(bundle), &refreshCount);
bundleArchive_getArchiveRoot(bundle_getArchive(bundle), &archiveRoot);
@@ -580,7 +600,11 @@ celix_status_t fw_startBundle(FRAMEWORK
// BUG: Can't use apr_dso_load, apr assumes RTLD_GLOBAL for loading libraries.
// apr_dso_handle_t *handle;
// apr_dso_load(&handle, libraryPath, bundle->memoryPool);
+#ifdef _WIN32
+ handle = LoadLibrary(libraryPath);
+#else
handle = dlopen(libraryPath, RTLD_LAZY|RTLD_LOCAL);
+#endif
if (handle == NULL) {
printf ("%s\n", dlerror());
framework_releaseBundleLock(framework, bundle);
@@ -589,10 +613,12 @@ celix_status_t fw_startBundle(FRAMEWORK
bundle_setHandle(bundle, handle);
- ACTIVATOR activator = (ACTIVATOR) apr_palloc(bundle->memoryPool, (sizeof(*activator)));
+ activator = (ACTIVATOR) apr_palloc(bundle->memoryPool, (sizeof(*activator)));
if (activator == NULL) {
return CELIX_ENOMEM;
} else {
+ void * userData = NULL;
+ BUNDLE_CONTEXT context;
void * (*create)(BUNDLE_CONTEXT context, void **userData);
void (*start)(void * userData, BUNDLE_CONTEXT context);
void (*stop)(void * userData, BUNDLE_CONTEXT context);
@@ -608,8 +634,7 @@ celix_status_t fw_startBundle(FRAMEWORK
framework_setBundleStateAndNotify(framework, bundle, BUNDLE_STARTING);
- void * userData = NULL;
- BUNDLE_CONTEXT context;
+
bundle_getContext(bundle, &context);
@@ -634,22 +659,26 @@ celix_status_t fw_startBundle(FRAMEWORK
celix_status_t framework_updateBundle(FRAMEWORK framework, BUNDLE bundle, char *inputFile) {
celix_status_t lock = framework_acquireBundleLock(framework, bundle, BUNDLE_INSTALLED|BUNDLE_RESOLVED|BUNDLE_ACTIVE);
+ BUNDLE_STATE oldState;
+ char *location;
+ bool locked;
+ celix_status_t status;
+
if (lock != CELIX_SUCCESS) {
printf("Cannot update bundle, in wrong state");
framework_releaseBundleLock(framework, bundle);
return lock;
}
-
- BUNDLE_STATE oldState;
+
bundle_getState(bundle, &oldState);
- char *location;
+
bundleArchive_getLocation(bundle_getArchive(bundle), &location);
if (oldState == BUNDLE_ACTIVE) {
fw_stopBundle(framework, bundle, false);
}
- bool locked = framework_acquireGlobalLock(framework);
+ locked = framework_acquireGlobalLock(framework);
if (!locked) {
printf("Unable to acquire the global lock to update the bundle\n");
framework_releaseInstallLock(framework, location);
@@ -659,7 +688,7 @@ celix_status_t framework_updateBundle(FR
bundle_revise(bundle, location, inputFile);
framework_releaseGlobalLock(framework);
- celix_status_t status = bundleArchive_setLastModified(bundle_getArchive(bundle), time(NULL));
+ status = bundleArchive_setLastModified(bundle_getArchive(bundle), time(NULL));
framework_setBundleStateAndNotify(framework, bundle, BUNDLE_INSTALLED);
// Refresh packages?
@@ -680,15 +709,18 @@ celix_status_t fw_stopBundle(FRAMEWORK f
printf("Cannot stop bundle");
framework_releaseBundleLock(framework, bundle);
} else {
-
+ BUNDLE_STATE state;
+ ACTIVATOR activator;
+ BUNDLE_CONTEXT context;
+ MODULE module = NULL;
+ MANIFEST manifest = NULL;
if (record) {
bundle_setPersistentStateInactive(bundle);
}
//if (!fw_isBundlePersistentlyStarted(framework, bundle)) {
//}
-
- BUNDLE_STATE state;
+
bundle_getState(bundle, &state);
switch (state) {
@@ -715,8 +747,8 @@ celix_status_t fw_stopBundle(FRAMEWORK f
framework_setBundleStateAndNotify(framework, bundle, BUNDLE_STOPPING);
- ACTIVATOR activator = bundle_getActivator(bundle);
- BUNDLE_CONTEXT context;
+ activator = bundle_getActivator(bundle);
+
bundle_getContext(bundle, &context);
if (activator->stop != NULL) {
activator->stop(activator->userData, context);
@@ -726,7 +758,6 @@ celix_status_t fw_stopBundle(FRAMEWORK f
activator->destroy(activator->userData, context);
}
- MODULE module = NULL;
bundle_getCurrentModule(bundle, &module);
if (strcmp(module_getId(module), "0") != 0) {
activator->start = NULL;
@@ -744,7 +775,6 @@ celix_status_t fw_stopBundle(FRAMEWORK f
bundleContext_destroy(context);
bundle_setContext(bundle, NULL);
- MANIFEST manifest = NULL;
bundle_getManifest(bundle, &manifest);
framework_setBundleStateAndNotify(framework, bundle, BUNDLE_RESOLVED);
@@ -771,9 +801,10 @@ celix_status_t fw_uninstallBundle(FRAMEW
status = CELIX_BUNDLE_EXCEPTION;
}
} else {
+ bool locked;
fw_stopBundle(framework, bundle, true);
- bool locked = framework_acquireGlobalLock(framework);
+ locked = framework_acquireGlobalLock(framework);
if (!locked) {
printf("Unable to acquire the global lock to install the bundle\n");
framework_releaseGlobalLock(framework);
@@ -781,9 +812,10 @@ celix_status_t fw_uninstallBundle(FRAMEW
} else {
BUNDLE_ARCHIVE archive = bundle_getArchive(bundle);
char * location;
+ BUNDLE target;
status = bundleArchive_getLocation(archive, &location);
// TODO sync issues?
- BUNDLE target = (BUNDLE) hashMap_remove(framework->installedBundleMap, location);
+ target = (BUNDLE) hashMap_remove(framework->installedBundleMap, location);
if (target != NULL) {
bundle_setPersistentStateUninstalled(target);
@@ -830,6 +862,10 @@ celix_status_t fw_refreshBundles(FRAMEWO
framework_releaseGlobalLock(framework);
status = CELIX_ILLEGAL_STATE;
} else {
+ HASH_MAP_VALUES values;
+ BUNDLE *newTargets;
+ int nrofvalues;
+ bool restart = false;
HASH_MAP map = hashMap_create(NULL, NULL, NULL, NULL);
int targetIdx = 0;
for (targetIdx = 0; targetIdx < size; targetIdx++) {
@@ -837,14 +873,12 @@ celix_status_t fw_refreshBundles(FRAMEWO
hashMap_put(map, bundle, bundle);
fw_populateDependentGraph(framework, bundle, &map);
}
- HASH_MAP_VALUES values = hashMapValues_create(map);
- BUNDLE *newTargets;
- int nrofvalues;
+ values = hashMapValues_create(map);
hashMapValues_toArray(values, (void *) &newTargets, &nrofvalues);
-
- bool restart = false;
+
if (newTargets != NULL) {
int i = 0;
+ struct fw_refreshHelper * helpers;
for (i = 0; i < nrofvalues && !restart; i++) {
BUNDLE bundle = (BUNDLE) newTargets[i];
if (framework->bundle == bundle) {
@@ -852,29 +886,29 @@ celix_status_t fw_refreshBundles(FRAMEWO
}
}
- struct fw_refreshHelper * helpers[nrofvalues];
+ helpers = (struct fw_refreshHelper * )malloc(nrofvalues * sizeof(struct fw_refreshHelper));
for (i = 0; i < nrofvalues && !restart; i++) {
BUNDLE bundle = (BUNDLE) newTargets[i];
- helpers[i] = malloc(sizeof(struct fw_refreshHelper));
- helpers[i] ->framework = framework;
- helpers[i]->bundle = bundle;
- helpers[i]->oldState = BUNDLE_INSTALLED;
+ helpers[i].framework = framework;
+ helpers[i].bundle = bundle;
+ helpers[i].oldState = BUNDLE_INSTALLED;
}
for (i = 0; i < nrofvalues; i++) {
- struct fw_refreshHelper * helper = helpers[i];
- fw_refreshHelper_stop(helper);
- fw_refreshHelper_refreshOrRemove(helper);
+ struct fw_refreshHelper helper = helpers[i];
+ fw_refreshHelper_stop(&helper);
+ fw_refreshHelper_refreshOrRemove(&helper);
}
for (i = 0; i < nrofvalues; i++) {
- struct fw_refreshHelper * helper = helpers[i];
- fw_refreshHelper_restart(helper);
+ struct fw_refreshHelper helper = helpers[i];
+ fw_refreshHelper_restart(&helper);
}
if (restart) {
bundle_update(framework->bundle, NULL);
}
+ free(helpers);
}
framework_releaseGlobalLock(framework);
@@ -892,8 +926,9 @@ celix_status_t fw_refreshBundle(FRAMEWOR
printf("Cannot refresh bundle");
framework_releaseBundleLock(framework, bundle);
} else {
- bundle_getState(bundle, &state);
- bool fire = (state != BUNDLE_INSTALLED);
+ bool fire;
+ bundle_getState(bundle, &state);
+ fire = (state != BUNDLE_INSTALLED);
bundle_refresh(bundle);
if (fire) {
@@ -939,10 +974,11 @@ celix_status_t fw_getDependentBundles(FR
celix_status_t status = CELIX_SUCCESS;
if (*list == NULL && exporter != NULL && framework != NULL) {
+ ARRAY_LIST modules;
+ int modIdx = 0;
arrayList_create(exporter->memoryPool, list);
- ARRAY_LIST modules = bundle_getModules(exporter);
- int modIdx = 0;
+ modules = bundle_getModules(exporter);
for (modIdx = 0; modIdx < arrayList_size(modules); modIdx++) {
MODULE module = arrayList_get(modules, modIdx);
ARRAY_LIST dependents = module_getDependents(module);
@@ -981,6 +1017,7 @@ celix_status_t fw_populateDependentGraph
}
celix_status_t fw_registerService(FRAMEWORK framework, SERVICE_REGISTRATION *registration, BUNDLE bundle, char * serviceName, void * svcObj, PROPERTIES properties) {
+ celix_status_t lock;
if (serviceName == NULL) {
printf("Service name cannot be null");
return CELIX_ILLEGAL_ARGUMENT;
@@ -989,7 +1026,7 @@ celix_status_t fw_registerService(FRAMEW
return CELIX_ILLEGAL_ARGUMENT;
}
- celix_status_t lock = framework_acquireBundleLock(framework, bundle, BUNDLE_STARTING|BUNDLE_ACTIVE);
+ lock = framework_acquireBundleLock(framework, bundle, BUNDLE_STARTING|BUNDLE_ACTIVE);
if (lock != CELIX_SUCCESS) {
printf("Can only register services while bundle is active or starting");
framework_releaseBundleLock(framework, bundle);
@@ -1000,16 +1037,21 @@ celix_status_t fw_registerService(FRAMEW
// If this is a listener hook, invoke the callback with all current listeners
if (strcmp(serviceName, listener_hook_service_name) == 0) {
+ int i;
ARRAY_LIST infos = NULL;
+ apr_pool_t *subpool;
+ SERVICE_REFERENCE ref = NULL;
+ listener_hook_service_t hook;
+
arrayList_create(bundle->memoryPool, &infos);
- int i;
for (i = 0; i > arrayList_size(framework->serviceListeners); i++) {
FW_SERVICE_LISTENER listener = arrayList_get(framework->serviceListeners, i);
apr_pool_t *pool;
BUNDLE_CONTEXT context;
+ listener_hook_info_t info;
bundle_getContext(bundle, &context);
bundleContext_getMemoryPool(context, &pool);
- listener_hook_info_t info = apr_palloc(pool, sizeof(*info));
+ info = apr_palloc(pool, sizeof(*info));
info->context = listener->bundle->context;
info->removed = false;
filter_getString(listener->filter, &info->filter);
@@ -1017,12 +1059,10 @@ celix_status_t fw_registerService(FRAMEW
arrayList_add(infos, info);
}
- apr_pool_t *subpool;
apr_pool_create(&subpool, bundle->memoryPool);
- SERVICE_REFERENCE ref = NULL;
serviceRegistry_createServiceReference(framework->registry, subpool, *registration, &ref);
- listener_hook_service_t hook = fw_getService(framework, framework->bundle, ref);
+ hook = fw_getService(framework, framework->bundle, ref);
hook->added(hook->handle, infos);
serviceRegistry_ungetService(framework->registry, framework->bundle, ref);
@@ -1033,7 +1073,8 @@ celix_status_t fw_registerService(FRAMEW
}
celix_status_t fw_registerServiceFactory(FRAMEWORK framework, SERVICE_REGISTRATION *registration, BUNDLE bundle, char * serviceName, service_factory_t factory, PROPERTIES properties) {
- if (serviceName == NULL) {
+ celix_status_t lock;
+ if (serviceName == NULL) {
printf("Service name cannot be null");
return CELIX_ILLEGAL_ARGUMENT;
} else if (factory == NULL) {
@@ -1041,7 +1082,7 @@ celix_status_t fw_registerServiceFactory
return CELIX_ILLEGAL_ARGUMENT;
}
- celix_status_t lock = framework_acquireBundleLock(framework, bundle, BUNDLE_STARTING|BUNDLE_ACTIVE);
+ lock = framework_acquireBundleLock(framework, bundle, BUNDLE_STARTING|BUNDLE_ACTIVE);
if (lock != CELIX_SUCCESS) {
printf("Can only register services while bundle is active or starting");
framework_releaseBundleLock(framework, bundle);
@@ -1055,6 +1096,7 @@ celix_status_t fw_registerServiceFactory
celix_status_t fw_getServiceReferences(FRAMEWORK framework, ARRAY_LIST *references, BUNDLE bundle ATTRIBUTE_UNUSED, const char * serviceName, char * sfilter) {
FILTER filter = NULL;
+ int refIdx = 0;
if (sfilter != NULL) {
filter = filter_create(sfilter, bundle->memoryPool);
}
@@ -1065,12 +1107,12 @@ celix_status_t fw_getServiceReferences(F
filter_destroy(filter);
}
- int refIdx = 0;
for (refIdx = 0; (*references != NULL) && refIdx < arrayList_size(*references); refIdx++) {
SERVICE_REFERENCE ref = (SERVICE_REFERENCE) arrayList_get(*references, refIdx);
SERVICE_REGISTRATION reg = NULL;
+ char * serviceName;
serviceReference_getServiceRegistration(ref, ®);
- char * serviceName = properties_get(reg->properties, (char *) OBJECTCLASS);
+ serviceName = properties_get(reg->properties, (char *) OBJECTCLASS);
if (!serviceReference_isAssignableTo(ref, bundle, serviceName)) {
arrayList_remove(*references, refIdx);
refIdx--;
@@ -1105,7 +1147,11 @@ void fw_addServiceListener(FRAMEWORK fra
// bundle_getContext(bundle, &context);
// bundleContext_getMemoryPool(context, &bpool);
// apr_pool_create(&pool, bpool);
-
+ ARRAY_LIST listenerHooks = NULL;
+ apr_pool_t *subpool;
+ listener_hook_info_t info;
+ int i;
+
FW_SERVICE_LISTENER fwListener = (FW_SERVICE_LISTENER) malloc(sizeof(*fwListener));
fwListener->bundle = bundle;
if (sfilter != NULL) {
@@ -1117,17 +1163,14 @@ void fw_addServiceListener(FRAMEWORK fra
fwListener->listener = listener;
arrayList_add(framework->serviceListeners, fwListener);
- apr_pool_t *subpool;
apr_pool_create(&subpool, listener->pool);
- ARRAY_LIST listenerHooks = NULL;
serviceRegistry_getListenerHooks(framework->registry, subpool, &listenerHooks);
- listener_hook_info_t info = apr_palloc(subpool, sizeof(*info));
+ info = apr_palloc(subpool, sizeof(*info));
info->context = bundle->context;
info->removed = false;
info->filter = sfilter == NULL ? NULL : apr_pstrdup(subpool, sfilter);
- int i;
for (i = 0; i < arrayList_size(listenerHooks); i++) {
SERVICE_REFERENCE ref = arrayList_get(listenerHooks, i);
listener_hook_service_t hook = fw_getService(framework, framework->bundle, ref);
@@ -1145,11 +1188,13 @@ void fw_addServiceListener(FRAMEWORK fra
void fw_removeServiceListener(FRAMEWORK framework, BUNDLE bundle, SERVICE_LISTENER listener) {
listener_hook_info_t info = NULL;
apr_pool_t *pool;
+ unsigned int i;
+ FW_SERVICE_LISTENER element;
+
BUNDLE_CONTEXT context;
bundle_getContext(bundle, &context);
bundleContext_getMemoryPool(context, &pool);
- unsigned int i;
- FW_SERVICE_LISTENER element;
+
for (i = 0; i < arrayList_size(framework->serviceListeners); i++) {
element = (FW_SERVICE_LISTENER) arrayList_get(framework->serviceListeners, i);
if (element->listener == listener && element->bundle == bundle) {
@@ -1172,10 +1217,10 @@ void fw_removeServiceListener(FRAMEWORK
}
if (info != NULL) {
+ int i;
ARRAY_LIST listenerHooks = NULL;
serviceRegistry_getListenerHooks(framework->registry, pool, &listenerHooks);
-
- int i;
+
for (i = 0; i < arrayList_size(listenerHooks); i++) {
SERVICE_REFERENCE ref = arrayList_get(listenerHooks, i);
listener_hook_service_t hook = fw_getService(framework, framework->bundle, ref);
@@ -1199,11 +1244,12 @@ void fw_serviceChanged(FRAMEWORK framewo
element = (FW_SERVICE_LISTENER) arrayList_get(framework->serviceListeners, i);
matched = (element->filter == NULL) || filter_match(element->filter, registration->properties);
if (matched) {
+ SERVICE_REFERENCE reference = NULL;
+ SERVICE_EVENT event;
apr_pool_t *spool = NULL;
apr_pool_create(&spool, element->listener->pool);
- SERVICE_REFERENCE reference = NULL;
- SERVICE_EVENT event = (SERVICE_EVENT) apr_palloc(spool, sizeof(*event));
+ event = (SERVICE_EVENT) apr_palloc(spool, sizeof(*event));
serviceRegistry_createServiceReference(framework->registry, spool, registration, &reference);
@@ -1317,8 +1363,9 @@ celix_status_t framework_markBundleResol
ARRAY_LIST framework_getBundles(FRAMEWORK framework) {
ARRAY_LIST bundles = NULL;
+ HASH_MAP_ITERATOR iterator;
arrayList_create(framework->mp, &bundles);
- HASH_MAP_ITERATOR iterator = hashMapIterator_create(framework->installedBundleMap);
+ iterator = hashMapIterator_create(framework->installedBundleMap);
while (hashMapIterator_hasNext(iterator)) {
BUNDLE bundle = hashMapIterator_nextValue(iterator);
arrayList_add(bundles, bundle);
@@ -1480,17 +1527,17 @@ bool framework_releaseBundleLock(FRAMEWO
}
bool framework_acquireGlobalLock(FRAMEWORK framework) {
- apr_thread_mutex_lock(framework->bundleLock);
-
- bool interrupted = false;
+ bool interrupted = false;
bool isSelf = false;
+ apr_thread_mutex_lock(framework->bundleLock);
+
thread_equalsSelf(framework->globalLockThread, &isSelf);
while (!interrupted
&& (framework->globalLockThread != NULL)
&& (!isSelf)) {
- pthread_t currentThread = pthread_self();
+ apr_os_thread_t currentThread = apr_os_thread_current();
arrayList_add(framework->globalLockWaitersList, currentThread);
apr_thread_cond_broadcast(framework->condition);
@@ -1565,10 +1612,12 @@ celix_status_t framework_waitForStop(FRA
static void *APR_THREAD_FUNC framework_shutdown(apr_thread_t *thd, void *framework) {
//static void * framework_shutdown(void * framework) {
FRAMEWORK fw = (FRAMEWORK) framework;
+ HASH_MAP_ITERATOR iterator;
+ int err;
printf("FRAMEWORK: Shutdown\n");
- HASH_MAP_ITERATOR iterator = hashMapIterator_create(fw->installedBundleMap);
+ iterator = hashMapIterator_create(fw->installedBundleMap);
while (hashMapIterator_hasNext(iterator)) {
BUNDLE bundle = hashMapIterator_nextValue(iterator);
BUNDLE_STATE state;
@@ -1581,7 +1630,7 @@ static void *APR_THREAD_FUNC framework_s
}
hashMapIterator_destroy(iterator);
- int err = apr_thread_mutex_lock(fw->mutex);
+ err = apr_thread_mutex_lock(fw->mutex);
if (err != 0) {
celix_log("Error locking the framework, cannot exit clean.");
apr_thread_exit(thd, APR_ENOLOCK);
Modified: incubator/celix/trunk/framework/private/src/manifest.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/manifest.c?rev=1229165&r1=1229164&r2=1229165&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/manifest.c (original)
+++ incubator/celix/trunk/framework/private/src/manifest.c Mon Jan 9 14:21:45 2012
@@ -92,14 +92,14 @@ celix_status_t manifest_read(MANIFEST ma
FILE *file = fopen ( filename, "r" );
if (file != NULL) {
char lbuf[512];
- manifest_readAttributes(manifest, manifest->mainAttributes, file);
-
int len;
char * name = NULL;
bool skipEmptyLines = true;
char * lastline;
+ manifest_readAttributes(manifest, manifest->mainAttributes, file);
while (fgets(lbuf, sizeof(lbuf), file) != NULL ) {
+ PROPERTIES attributes;
len = strlen(lbuf);
if (lbuf[--len] != '\n') {
printf("MANIFEST: Line too long\n");
@@ -114,6 +114,7 @@ celix_status_t manifest_read(MANIFEST ma
skipEmptyLines = false;
if (name == NULL) {
+
if ((tolower(lbuf[0]) == 'n') && (tolower(lbuf[1]) == 'a') &&
(tolower(lbuf[2]) == 'm') && (tolower(lbuf[3]) == 'e') &&
(lbuf[4] == ':') && (lbuf[5] == ' ')) {
@@ -134,7 +135,7 @@ celix_status_t manifest_read(MANIFEST ma
}
} else {
int newlen = strlen(lastline) + len;
- char buf[newlen];
+ char * buf = (char *)malloc(newlen);
strcpy(buf, lastline);
strncat(buf, lbuf+1, len - 1);
buf[newlen] = '\0';
@@ -142,15 +143,17 @@ celix_status_t manifest_read(MANIFEST ma
if (fpeek(file) == ' ') {
lastline = realloc(lastline, strlen(buf) + 1);
lastline = strcpy(lastline, buf);
+ free(buf);
continue;
}
name = (char *) malloc(strlen(buf) + 1);
name = strcpy(name, buf);
name[strlen(buf)] = '\0';
lastline = NULL;
+ free(buf);
}
- PROPERTIES attributes = hashMap_get(manifest->attributes, name);
+ attributes = hashMap_get(manifest->attributes, name);
if (attributes == NULL) {
attributes = properties_create();
hashMap_put(manifest->attributes, strdup(name), attributes);
@@ -209,8 +212,8 @@ celix_status_t manifest_readAttributes(M
}
if (lbuf[0] == ' ') {
- int newlen = strlen(lastLine) + len - 1;
- char * buf = (char *)malloc(newlen);
+ int newlen = strlen(lastLine) + len;
+ char * buf = (char *)calloc(sizeof(char), newlen);
// Line continued
if (name == NULL) {
@@ -219,9 +222,8 @@ celix_status_t manifest_readAttributes(M
return CELIX_FILE_IO_EXCEPTION;
}
lineContinued = true;
- strcpy(buf, lastLine);
+ strcat(buf, lastLine);
strncat(buf, lbuf+1, len - 1);
- buf[newlen] = '\0';
if (fpeek(file) == ' ') {
lastLine = realloc(lastLine, strlen(buf) + 1);
@@ -231,6 +233,7 @@ celix_status_t manifest_readAttributes(M
value = (char *) malloc(strlen(buf) + 1);
value = strcpy(value, buf);
free(lastLine);
+ free(buf);
lastLine = NULL;
} else {
while (lbuf[i++] != ':') {
@@ -261,6 +264,7 @@ celix_status_t manifest_readAttributes(M
if ((properties_set(properties, name, value) != NULL) && (!lineContinued)) {
printf("Duplicate entry: %s", name);
}
+ free(lastLine);
free(name);
free(value);
}
Modified: incubator/celix/trunk/framework/private/src/service_tracker.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/service_tracker.c?rev=1229165&r1=1229164&r2=1229165&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/service_tracker.c (original)
+++ incubator/celix/trunk/framework/private/src/service_tracker.c Mon Jan 9 14:21:45 2012
@@ -74,9 +74,10 @@ celix_status_t serviceTracker_create(BUN
}
celix_status_t tracker_createWithFilter(BUNDLE_CONTEXT context, char * filter, SERVICE_TRACKER_CUSTOMIZER customizer, SERVICE_TRACKER *tracker) {
- *tracker = (SERVICE_TRACKER) malloc(sizeof(**tracker));
- FW_SERVICE_TRACKER fw_tracker = (FW_SERVICE_TRACKER) malloc(sizeof(*fw_tracker));
+ FW_SERVICE_TRACKER fw_tracker;
apr_pool_t *pool;
+ *tracker = (SERVICE_TRACKER) malloc(sizeof(**tracker));
+ fw_tracker = (FW_SERVICE_TRACKER) malloc(sizeof(*fw_tracker));
bundleContext_getMemoryPool(context, &pool);
// if (m_trackers == NULL) {
@@ -99,11 +100,12 @@ celix_status_t tracker_createWithFilter(
}
celix_status_t serviceTracker_open(SERVICE_TRACKER tracker) {
+ SERVICE_LISTENER listener;
+ ARRAY_LIST initial = NULL;
celix_status_t status = CELIX_SUCCESS;
- SERVICE_LISTENER listener = (SERVICE_LISTENER) malloc(sizeof(*listener));
+ listener = (SERVICE_LISTENER) malloc(sizeof(*listener));
// FW_SERVICE_TRACKER fwTracker = findFwServiceTracker(tracker);
- ARRAY_LIST initial = NULL;
-
+
status = bundleContext_getServiceReferences(tracker->context, NULL, tracker->filter, &initial);
if (status == CELIX_SUCCESS) {
SERVICE_REFERENCE initial_reference;
@@ -173,12 +175,13 @@ SERVICE_REFERENCE tracker_getServiceRefe
}
ARRAY_LIST tracker_getServiceReferences(SERVICE_TRACKER tracker) {
+ TRACKED tracked;
+ unsigned int i;
FW_SERVICE_TRACKER fwTracker = tracker->fwTracker;
int size = arrayList_size(fwTracker->tracked);
ARRAY_LIST references = NULL;
arrayList_create(fwTracker->pool, &references);
- TRACKED tracked;
- unsigned int i;
+
for (i = 0; i < arrayList_size(fwTracker->tracked); i++) {
tracked = (TRACKED) arrayList_get(fwTracker->tracked, i);
arrayList_add(references, tracked->reference);
@@ -200,12 +203,13 @@ void * tracker_getService(SERVICE_TRACKE
}
ARRAY_LIST tracker_getServices(SERVICE_TRACKER tracker) {
+ TRACKED tracked;
+ unsigned int i;
FW_SERVICE_TRACKER fwTracker = tracker->fwTracker;
int size = arrayList_size(fwTracker->tracked);
ARRAY_LIST references = NULL;
arrayList_create(fwTracker->pool, &references);
- TRACKED tracked;
- unsigned int i;
+
for (i = 0; i < arrayList_size(fwTracker->tracked); i++) {
tracked = (TRACKED) arrayList_get(fwTracker->tracked, i);
arrayList_add(references, tracked->service);
@@ -218,8 +222,8 @@ void * tracker_getServiceByReference(SER
TRACKED tracked;
unsigned int i;
for (i = 0; i < arrayList_size(fwTracker->tracked); i++) {
- tracked = (TRACKED) arrayList_get(fwTracker->tracked, i);
bool equals;
+ tracked = (TRACKED) arrayList_get(fwTracker->tracked, i);
serviceReference_equals(reference, tracked->reference, &equals);
if (equals) {
return tracked->service;