summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libalpm/handle.c2
-rw-r--r--lib/libalpm/trans.c8
-rw-r--r--lib/libalpm/util.h4
3 files changed, 10 insertions, 4 deletions
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index e4bde1a7..e9439a0b 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -141,7 +141,7 @@ int SYMEXPORT alpm_unlock(alpm_handle_t *handle)
handle->lockfd = -1;
if(unlink(handle->lockfile) != 0) {
- RET_ERR(handle, ALPM_ERR_SYSTEM, -1);
+ RET_ERR_ASYNC_SAFE(handle, ALPM_ERR_SYSTEM, -1);
} else {
return 0;
}
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index 239d6a14..13984707 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -233,7 +233,9 @@ int SYMEXPORT alpm_trans_commit(alpm_handle_t *handle, alpm_list_t **data)
return 0;
}
-/** Interrupt a transaction. */
+/** Interrupt a transaction.
+ * @note Safe to call from inside signal handlers.
+ */
int SYMEXPORT alpm_trans_interrupt(alpm_handle_t *handle)
{
alpm_trans_t *trans;
@@ -242,9 +244,9 @@ int SYMEXPORT alpm_trans_interrupt(alpm_handle_t *handle)
CHECK_HANDLE(handle, return -1);
trans = handle->trans;
- ASSERT(trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1));
+ ASSERT(trans != NULL, RET_ERR_ASYNC_SAFE(handle, ALPM_ERR_TRANS_NULL, -1));
ASSERT(trans->state == STATE_COMMITING || trans->state == STATE_INTERRUPTED,
- RET_ERR(handle, ALPM_ERR_TRANS_TYPE, -1));
+ RET_ERR_ASYNC_SAFE(handle, ALPM_ERR_TRANS_TYPE, -1));
trans->state = STATE_INTERRUPTED;
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 9817939f..94949867 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -71,6 +71,10 @@ void _alpm_alloc_fail(size_t size);
(handle)->pm_errno = (err); \
return (ret); } while(0)
+#define RET_ERR_ASYNC_SAFE(handle, err, ret) do { \
+ (handle)->pm_errno = (err); \
+ return (ret); } while(0)
+
#define DOUBLE_EQ(x, y) (fabs((x) - (y)) < DBL_EPSILON)
#define CHECK_HANDLE(handle, action) do { if(!(handle)) { action; } (handle)->pm_errno = 0; } while(0)