parse-community / parse-embedded-sdks

The Embedded SDKs for the Parse Platform
http://parseplatform.org
Other
246 stars 118 forks source link

embedded library seems to run infinite loop inside parseProcessNextPushNotification function. #61

Open dfszb opened 8 years ago

dfszb commented 8 years ago

Testing / evaluating parse using an Ubuntu Linux computer. Parse UNIX library seems to be in a continuous loop eating 100% of CPU. The problematic code seems to be in parse.c, function: int parseProcessNextPushNotification(ParseClient client), the following lines:

        while (length == -1 && parse_push_message_size < sizeof(parse_push_message_buffer)) {
            CURLcode result = curl_easy_recv(clientInternal->pushCurlHandle,
                                             parse_push_message_buffer + parse_push_message_size,
                                             sizeof(parse_push_message_buffer) - parse_push_message_size,
                                             &read);
            if (result == CURLE_OK) {
                parseLog(PARSE_LOG_INFO, "got ok!\n");
                parse_push_message_size += read;
                message = (char *)getPushJson(parse_push_message_buffer,
                                              parse_push_message_size,
                                              &start,
                                              &length);
            } else if (result == CURLE_AGAIN) {
                break;
            } else {
                parseLog(PARSE_LOG_ERROR, "curl_easy_recv read %i an error %s\n", length, curl_easy_strerror(result));
                if (clientInternal->pushCallback != NULL) {
                    clientInternal->pushCallback(client, ECONNRESET, NULL);
                }
                return 0;
            }
        }

The while loop continues to run as the CURLcode result = curl_easy_recv returns CURLE_OK. However the 'read' parameter passed to curl_easy_recv has a value of 0 after call that indicates a closed connection according to http://curl.haxx.se/libcurl/c/curl_easy_recv.html. The result is 100% cpu utilization and inability to process subsequent push messages. I think the correct form would be to use if ((result == CURLE_OK) && (read > 0))

mtl2034 commented 8 years ago

Hi @dfszb, let me look at and fix it. Do you have an easy way to reproduce this problem?

dfszb commented 8 years ago

It happened randomly. Sometimes just waiting, other times when wifi lost connection.