| 206 | } |
| 207 | |
| 208 | static void destroyGpcloudResHandle(gpcloudResHandle *resHandle) { |
| 209 | if (resHandle == NULL) return; |
| 210 | |
| 211 | /* unlink from linked list first */ |
| 212 | if (resHandle->prev) |
| 213 | resHandle->prev->next = resHandle->next; |
| 214 | else |
| 215 | openedResHandles = resHandle->next; |
| 216 | |
| 217 | if (resHandle->next) { |
| 218 | resHandle->next->prev = resHandle->prev; |
| 219 | } |
| 220 | |
| 221 | if (resHandle->gpreader != NULL) { |
| 222 | if (!reader_cleanup(&resHandle->gpreader)) { |
| 223 | elog(WARNING, "Failed to cleanup gpcloud extension: %s", s3extErrorMessage.c_str()); |
| 224 | } |
| 225 | } |
| 226 | |
| 227 | if (resHandle->gpwriter != NULL) { |
| 228 | if (!writer_cleanup(&resHandle->gpwriter)) { |
| 229 | elog(WARNING, "Failed to cleanup gpcloud extension: %s", s3extErrorMessage.c_str()); |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | thread_cleanup(); |
| 234 | pfree(resHandle); |
| 235 | } |
| 236 | |
| 237 | /* |
| 238 | * Close any open handles on abort. |
no test coverage detected