/** * @brief Sorts strings. Keys are the first four characters of the string, * and values are the addresses where the strings reside in memory (stringVals) * * Takes as input an array of strings arranged as a char* array with NULL terminating * characters. This function will reformat this info into keys (first four chars) * values(pointers to string array addresses) and aligned string value array. * * * * @param[in] planHandle handle to CUDPPSortPlan * @param[in] stringVals Original string input, no need for alignment or offsets. * @param[in] d_address Pointers (in order) to each strings starting location in the stringVals array * @param[in] termC Termination character used to separate strings * @param[in] numElements number of strings * @param[in] stringArrayLength Length in uint of the size of all strings * @returns CUDPPResult indicating success or error condition * * @see cudppPlan, CUDPPConfiguration, CUDPPAlgorithm */ CUDPP_DLL CUDPPResult cudppStringSort(const CUDPPHandle planHandle, unsigned char *d_stringVals, unsigned int *d_address, unsigned char termC, size_t numElements, size_t stringArrayLength) { CUDPPStringSortPlan *plan = (CUDPPStringSortPlan*)getPlanPtrFromHandle<CUDPPStringSortPlan>(planHandle); if (plan != NULL) { if (plan->m_config.algorithm != CUDPP_SORT_STRING) return CUDPP_ERROR_INVALID_PLAN; unsigned int* packedStringVals; unsigned int *packedStringLength = (unsigned int*)malloc(sizeof(unsigned int));; calculateAlignedOffsets(d_address, plan->m_numSpaces, d_stringVals, termC, numElements, stringArrayLength); cudppScanDispatch(plan->m_spaceScan, plan->m_numSpaces, numElements+1, 1, plan->m_scanPlan); dotAdd(d_address, plan->m_spaceScan, plan->m_packedAddress, numElements+1, stringArrayLength); cudaMemcpy(packedStringLength, (plan->m_packedAddress)+numElements, sizeof(unsigned int), cudaMemcpyDeviceToHost); cudaMemcpy(plan->m_packedAddressRef, plan->m_packedAddress, sizeof(unsigned int)*numElements, cudaMemcpyDeviceToDevice); cudaMemcpy(plan->m_addressRef, d_address, sizeof(unsigned int)*numElements, cudaMemcpyDeviceToDevice); //system("PAUSE"); cudaMalloc((void**)&packedStringVals, sizeof(unsigned int)*packedStringLength[0]); packStrings(packedStringVals, d_stringVals, plan->m_keys, plan->m_packedAddress, d_address, numElements, stringArrayLength, termC); cudppStringSortDispatch(plan->m_keys, plan->m_packedAddress, packedStringVals, numElements, packedStringLength[0], termC, plan); unpackStrings(plan->m_packedAddress, plan->m_packedAddressRef, d_address, plan->m_addressRef, numElements); free(packedStringLength); cudaFree(packedStringVals); return CUDPP_SUCCESS; } else return CUDPP_ERROR_INVALID_HANDLE; }
char * unpackRILResponseFull(char *inRsp, size_t length, int32_t *out_ril_errno, int32_t *out_token) { Parcel p; int32_t type; int32_t token; status_t status; RIL_Errno e; p.setData((uint8_t *) inRsp, length); // status checked at end status = p.readInt32(&type); if (type == RESPONSE_UNSOLICITED) { status = p.readInt32(&token); LOGD("unpackRILResponse: Discard UNSOLICITED response:%d\n",token); return NULL; } status = p.readInt32(&token); if (out_token != NULL) { *out_token = token; } status = p.readInt32((int32_t *)&e); if ((NO_ERROR != status)) { LOGE("unpackRILResponse: Error!"); return NULL; } if (out_ril_errno != NULL) { *out_ril_errno = e; LOGD("unpackRILResponse: Return error cause: %d", e); } if (RIL_E_SUCCESS != e) { return NULL; } return unpackStrings(p); }