PengZheng commented on code in PR #537:
URL: https://github.com/apache/celix/pull/537#discussion_r1184494919


##########
libs/error_injector/celix_bundle_ctx/src/celix_bundle_context_ei.cc:
##########
@@ -85,4 +85,14 @@ long 
__wrap_celix_bundleContext_registerServiceAsync(celix_bundle_context_t *__c
     return __real_celix_bundleContext_registerServiceAsync(__ctx, 
__serviceName, __service, __properties);
 }
 
+long 
__real_celix_bundleContext_registerServiceFactoryAsync(celix_bundle_context_t 
*__ctx, const char *__serviceName, service_factory_pt __factory, 
celix_properties_t *__properties);
+CELIX_EI_DEFINE(celix_bundleContext_registerServiceFactoryAsync, long)
+long 
__wrap_celix_bundleContext_registerServiceFactoryAsync(celix_bundle_context_t 
*__ctx, const char *__serviceName, service_factory_pt __factory, 
celix_properties_t *__properties) {
+    celix_properties_t __attribute__((cleanup(celix_properties_cleanup))) 
*props = celix_properties_copy(__properties);
+    celix_properties_destroy(__properties);
+    CELIX_EI_IMPL(celix_bundleContext_registerServiceFactoryAsync);
+    __properties = celix_properties_copy(props);

Review Comment:
   Interesting trick.



##########
libs/error_injector/CMakeLists.txt:
##########
@@ -39,6 +39,9 @@ add_subdirectory(sys_shm)
 add_subdirectory(socket)
 add_subdirectory(pthread)
 add_subdirectory(celix_log_helper)
+add_subdirectory(celix_bundle)
+add_subdirectory(celix_version)
+add_subdirectory(dfi)

Review Comment:
   dfi is an optional component, thus we need to check `CELIX_DFI` before 
`add_subdirectory`.



##########
bundles/remote_services/rsa_rpc_json/src/rsa_json_rpc_proxy_impl.c:
##########
@@ -294,19 +298,18 @@ static celix_status_t 
rsaJsonRpcProxy_create(rsa_json_rpc_proxy_factory_t *proxy
         celix_logHelper_error(proxyFactory->logHelper, "Proxy: Error getting 
provider service version.");
         goto err_getting_svc_ver;
     }
-    version_pt providerVersion;
-    status =version_createVersionFromString(providerVerStr,&providerVersion);
-    if (status != CELIX_SUCCESS) {
+    celix_version_t *providerVersion = 
celix_version_createVersionFromString(providerVerStr);
+    if (providerVersion == NULL) {
         celix_logHelper_error(proxyFactory->logHelper, "Proxy: Error 
converting service version type. %d.", status);
+        status = CELIX_ENOMEM;
         goto err_creating_provider_ver;
     }
-    version_pt consumerVersion = NULL;
+    celix_version_t *consumerVersion = NULL;
     bool isCompatible = false;
     dynInterface_getVersion(intfType,&consumerVersion);
-    version_isCompatible(consumerVersion, providerVersion,&isCompatible);
+    isCompatible = celix_version_isCompatible(consumerVersion, 
providerVersion);
     if(!isCompatible){
-        char* consumerVerStr = NULL;
-        version_toString(consumerVersion,&consumerVerStr);
+        char* consumerVerStr = celix_version_toString(consumerVersion);

Review Comment:
   This involves dynamic allocation (thus possibility of failure). We can get 
the same information by 
`celix_version_getMajor`/`celix_version_getMinor`/`celix_version_getMicro`.



##########
bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_server.c:
##########
@@ -193,51 +200,48 @@ static void rsaShmServer_msgHandlingWork(void *data) {
 
     char *src = reply.iov_base;
     size_t srcSize = reply.iov_len;
+    int waitRet = 0;
+    pthread_mutex_lock(&msgCtrl->lock);
     while (true) {
-        ssize_t destSize = workData->msgBodyTotalSize;
+        if (msgCtrl->msgState == REQ_CANCELLED || waitRet != 0) {
+            celix_logHelper_error(server->loghelper, "RsaShmServer: Client 
cancelled the request, or timeout. %d.", waitRet);

Review Comment:
   Performing IO while holding a lock is always sub-optimal.



##########
bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_impl.c:
##########
@@ -269,10 +293,13 @@ static bool rsaShm_isConfigTypeMatched(celix_properties_t 
*properties) {
 
         token = strtok_r(ecCopy, delimiter, &savePtr);
         while (token != NULL) {
-            if (strncmp(utils_stringTrim(token), RSA_SHM_CONFIGURATION_TYPE, 
1024) == 0) {
+            char *configType = celix_utils_trim(token);
+            if (configType != NULL && strncmp(configType, 
RSA_SHM_CONFIGURATION_TYPE, 1024) == 0) {
                 matched = true;
+                free(configType);

Review Comment:
   This seems cumbersome. 



##########
bundles/remote_services/remote_service_admin_shm_v2/shm_pool/src/shm_pool.c:
##########
@@ -181,8 +185,8 @@ static void *shmPool_heartbeatThread(void *data){
         celixThreadMutex_lock(&pool->mutex);
         int waitRet = 0;
         while (pool->heartbeatThreadActive && waitRet != ETIMEDOUT) {
+            // pthread_cond_timedwait shall not return an error code of [EINTR]

Review Comment:
   The following link should be added, since `man pthread_cond_timedwait` on 
Ubuntu 22.04 says the reverse.
   https://man7.org/linux/man-pages/man3/pthread_cond_timedwait.3p.html   
       These functions shall not return an error code of [EINTR].



##########
bundles/remote_services/rsa_rpc_json/src/rsa_json_rpc_activator.c:
##########
@@ -63,7 +66,7 @@ static celix_status_t 
rsaJsonRpc_start(rsa_json_rpc_activator_t* activator, celi
     activator->rpcSvcId = 
celix_bundleContext_registerServiceWithOptionsAsync(ctx, &opts);
     if (activator->rpcSvcId < 0) {
         celix_logHelper_error(activator->logHelper, "Error registering json 
rpc service.");
-        status = CELIX_SERVICE_EXCEPTION;
+        status = CELIX_BUNDLE_EXCEPTION;

Review Comment:
   The above `celix_properties_create` should also be checked for failure. 
   But this can be left for a future PR. No hurry.



##########
libs/error_injector/stdio/src/stdio_ei.cc:
##########
@@ -49,4 +49,14 @@ int __wrap_remove (const char *__filename) {
     errno = 0;
     return __real_remove(__filename);
 }
+
+FILE *__real_open_memstream (char **__bufloc, size_t *__sizeloc);
+CELIX_EI_DEFINE(open_memstream, FILE *)
+FILE *__wrap_open_memstream (char **__bufloc, size_t *__sizeloc) {
+    errno = EMFILE;

Review Comment:
   It does not open any file, thus `EMFILE` is not a good choice.



##########
bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_client.c:
##########
@@ -179,8 +181,8 @@ void rsaShmClientManager_destory(rsa_shm_client_manager_t 
*clientManager) {
     size_t listSize = celix_arrayList_size(clientManager->exceptionMsgList);
     for (int i = 0; i < listSize; ++i) {
         rsa_shm_exception_msg_t *exceptionMsg = 
celix_arrayList_get(clientManager->exceptionMsgList, i);
-        shmPool_free(clientManager->shmPool, exceptionMsg->msgBuffer);
-        rsaShmClientManager_destroyMsgControl(clientManager, 
exceptionMsg->msgCtrl);
+        //Here,we should not free 'msgBuffer' and 'msgCtrl' by shmPool_free, 
because rsa_shm_server maybe using them, and tlsf_free will modify freed memory.
+        //The shared memory  of 'msgBuffer' and 'msgCtrl' will be freed 
automatically when nobody is using it.

Review Comment:
   I consider it a design flaw, i.e., lack of synchronization between server 
and client.
   
   Of course, if `pthread_cond_destroy` and `pthread_mutex_destroy` does not 
release any resource like kernel objects, then no real issue should arise.



##########
bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_impl.c:
##########
@@ -269,10 +293,13 @@ static bool rsaShm_isConfigTypeMatched(celix_properties_t 
*properties) {
 
         token = strtok_r(ecCopy, delimiter, &savePtr);
         while (token != NULL) {
-            if (strncmp(utils_stringTrim(token), RSA_SHM_CONFIGURATION_TYPE, 
1024) == 0) {
+            char *configType = celix_utils_trim(token);
+            if (configType != NULL && strncmp(configType, 
RSA_SHM_CONFIGURATION_TYPE, 1024) == 0) {
                 matched = true;
+                free(configType);

Review Comment:
   I suggest we repromote `utils_stringTrim` into the Celix API (adding celix_ 
prefix), and recover its proper uses all over the code base. 
   
   WDYT? @xuzhenbao @pnoltes 
   



##########
bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_import_registration.c:
##########
@@ -71,14 +76,17 @@ celix_status_t 
importRegistration_create(celix_bundle_context_t *context,
     char *token, *savePtr;
     token = strtok_r(icCopy, delimiter, &savePtr);
     while (token != NULL) {
-        if (strncmp(utils_stringTrim(token), RSA_RPC_TYPE_PREFIX, 
sizeof(RSA_RPC_TYPE_PREFIX) - 1) == 0) {
-            rsaRpcType = token;
+        rsaRpcType = celix_utils_trim(token);

Review Comment:
   I think `utils_stringTrim` is a better choice for this case.
   Why did we deprecate it? @pnoltes 



##########
bundles/remote_services/remote_service_admin_shm_v2/rsa_shm/src/rsa_shm_import_registration.c:
##########
@@ -48,12 +47,17 @@ celix_status_t 
importRegistration_create(celix_bundle_context_t *context,
         return CELIX_ILLEGAL_ARGUMENT;
     }
     import_registration_t *import = (import_registration_t *)calloc(1, 
sizeof(*import));
-    assert(import != NULL);
+    if (import == NULL) {
+        return CELIX_ENOMEM;
+    }
     import->context = context;
     import->logHelper = logHelper;
 
     import->endpointDesc = endpointDescription_clone(endpointDesc);
-    assert(import->endpointDesc != NULL);
+    if (import->endpointDesc == NULL) {

Review Comment:
   This error is not handled in `rsa_json_rpc`.



##########
bundles/remote_services/remote_service_admin_shm_v2/shm_pool/src/shm_pool.c:
##########
@@ -72,7 +75,7 @@ celix_status_t shmPool_create(size_t size, shm_pool_t **pool) 
{
     }
     shmPool->shmStartAddr = shmat(shmPool->shmId, NULL, 0);
     if (shmPool->shmStartAddr == NULL) {
-        fprintf(stderr,"Shm pool: Error sttaching shm attach, %d.\n",errno);
+        fprintf(stderr,"Shm pool: Error attaching shm, %d.\n",errno);

Review Comment:
   A separate issue is created for this: #539 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@celix.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to