if (!callback)
return;
+ PyGILState_STATE state = PyGILState_Ensure();
+
// Translate priority to Python logging priorities
switch (priority) {
case LOG_DEBUG:
free(buffer);
Py_XDECREF(tuple);
Py_XDECREF(result);
+
+ // Release the GIL
+ PyGILState_Release(state);
}
static int Pakfire_confirm_callback(struct pakfire* pakfire, void* data,
const char* message, const char* question) {
PyObject* callback = (PyObject*)data;
+ PyObject* result = NULL;
int r = 0;
// Do nothing if callback isn't set
if (!callback)
return 0;
+ // Acquire GIL
+ PyGILState_STATE state = PyGILState_Ensure();
+
PyObject* args = Py_BuildValue("(ss)", message, question);
- if (!args)
- return -1;
+ if (!args) {
+ r = -1;
+ goto ERROR;
+ }
- PyObject* result = PyObject_CallObject(callback, args);
+ result = PyObject_CallObject(callback, args);
// If the callback raised an exception, we will ignore it and indicate
// that an error happened, but we cannot re-raise the exception
Py_DECREF(args);
Py_DECREF(result);
+ // Release the GIL
+ PyGILState_Release(state);
+
return r;
}
const char* arch = NULL;
const char* conf = NULL;
int offline = 0;
+ int r;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zzOpzO", kwlist,
&path, &arch, &self->callbacks.log, &offline, &conf, &self->callbacks.confirm))
if (self->callbacks.log)
Py_INCREF(self->callbacks.log);
+ Py_BEGIN_ALLOW_THREADS
+
// Create a new Pakfire instance
- int r = pakfire_create(&self->pakfire, path, arch, conf, flags,
+ r = pakfire_create(&self->pakfire, path, arch, conf, flags,
LOG_DEBUG, Pakfire_log_callback, self->callbacks.log);
+
+ Py_END_ALLOW_THREADS
+
if (r) {
switch (errno) {
// Invalid architecture or path
Py_DECREF(self->callbacks.confirm);
}
+ Py_BEGIN_ALLOW_THREADS
+
pakfire_unref(self->pakfire);
+
+ Py_END_ALLOW_THREADS
}
Py_TYPE(self)->tp_free((PyObject *)self);
}
static PyObject* Pakfire_repr(PakfireObject* self) {
- const char* path = pakfire_get_path(self->pakfire);
- const char* arch = pakfire_get_arch(self->pakfire);
+ const char* path = pakfire_get_path(self->pakfire);
+ const char* arch = pakfire_get_arch(self->pakfire);
return PyUnicode_FromFormat("<_pakfire.Pakfire %s (%s)>", path, arch);
}
static PyObject* Pakfire_get_path(PakfireObject* self) {
- const char* path = pakfire_get_path(self->pakfire);
+ const char* path = pakfire_get_path(self->pakfire);
- return PyUnicode_FromString(path);
+ return PyUnicode_FromString(path);
}
static PyObject* Pakfire_get_arch(PakfireObject* self) {
- const char* arch = pakfire_get_arch(self->pakfire);
+ const char* arch = pakfire_get_arch(self->pakfire);
- return PyUnicode_FromString(arch);
+ return PyUnicode_FromString(arch);
}
static PyObject* Pakfire_get_repo(PakfireObject* self, PyObject* args) {
if (!callback)
return;
+ // Acquire GIL
+ PyGILState_STATE state = PyGILState_Ensure();
+
// Compile arguments
PyObject* args = Py_BuildValue("(is)", progress, status);
- if (!args)
- return;
+ if (args) {
+ // Call the callback
+ PyObject* result = PyObject_CallObject(callback, args);
- // Call the callback
- PyObject* result = PyObject_CallObject(callback, args);
+ Py_XDECREF(result);
+ Py_DECREF(args);
+ }
- Py_XDECREF(result);
- Py_DECREF(args);
+ // Release the GIL
+ PyGILState_Release(state);
}
static int convert_packages(PyObject* object, void* address) {
int solver_flags = 0;
int transaction_flags = 0;
PyObject* status_callback = NULL;
+ int r;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$ppppO", kwlist,
convert_packages, &packages, &dryrun, &without_recommended, &allow_uninstall,
if (allow_downgrade)
solver_flags |= PAKFIRE_REQUEST_ALLOW_DOWNGRADE;
+ Py_BEGIN_ALLOW_THREADS
+
// Run pakfire_install
- int r = pakfire_install(self->pakfire, transaction_flags, solver_flags,
+ r = pakfire_install(self->pakfire, transaction_flags, solver_flags,
(const char**)packages, NULL, 0, NULL, Pakfire_status_callback, status_callback);
+
+ Py_END_ALLOW_THREADS
+
if (r)
PyErr_SetFromErrno(PyExc_OSError);
int transaction_flags = 0;
int flags = 0;
PyObject* status_callback = NULL;
+ int r;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$ppO", kwlist,
convert_packages, &packages, &dryrun, &keep_dependencies, &status_callback))
if (keep_dependencies)
flags |= PAKFIRE_REQUEST_KEEP_DEPS;
+ Py_BEGIN_ALLOW_THREADS
+
// Run pakfire_erase
- int r = pakfire_erase(self->pakfire, transaction_flags, 0, (const char**)packages,
+ r = pakfire_erase(self->pakfire, transaction_flags, 0, (const char**)packages,
NULL, flags, NULL, Pakfire_status_callback, status_callback);
+
+ Py_END_ALLOW_THREADS
+
if (r)
PyErr_SetFromErrno(PyExc_OSError);
int solver_flags = 0;
int transaction_flags = 0;
PyObject* status_callback = NULL;
+ int r;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$pO&ppO", kwlist,
convert_packages, &packages, &dryrun, convert_packages, &excludes,
if (allow_downgrade)
solver_flags |= PAKFIRE_REQUEST_ALLOW_DOWNGRADE;
+ Py_BEGIN_ALLOW_THREADS
+
// Run pakfire_update
- int r = pakfire_update(self->pakfire, transaction_flags, solver_flags,
+ r = pakfire_update(self->pakfire, transaction_flags, solver_flags,
(const char**)packages, (const char**)excludes, 0, NULL,
Pakfire_status_callback, status_callback);
+
+ Py_END_ALLOW_THREADS
+
if (r)
PyErr_SetFromErrno(PyExc_OSError);
if (!PyArg_ParseTuple(args, "s", &requires))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
+
// Create a new list
r = pakfire_packagelist_create(&list, self->pakfire);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
goto ERROR;
}
r = pakfire_whatrequires(self->pakfire, requires, 0, list);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
goto ERROR;
}
+ Py_END_ALLOW_THREADS
+
// Create a Python list from the package list
ret = PyList_FromPackageList(list);
Py_DECREF(b);
}
+ Py_BEGIN_ALLOW_THREADS
+
// Execute command
r = pakfire_jail_exec(jail, argv,
NULL, Pakfire_execute_output_callback, callback);
+ Py_END_ALLOW_THREADS
+
// If the return code was negative, we had some internal error
if (r < 0) {
PyErr_SetFromErrno(PyExc_OSError);
const char* path = NULL;
const char* target = NULL;
char* result = NULL;
+ int r;
if (!PyArg_ParseTuple(args, "s|z", &path, &target))
return NULL;
- int r = pakfire_dist(self->pakfire, path, target, &result);
+ Py_BEGIN_ALLOW_THREADS
+
+ r = pakfire_dist(self->pakfire, path, target, &result);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
PyObject* ret = PyUnicode_FromString(result);
free(result);
if (!PyArg_ParseTuple(args, "ss", &src, &dst))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
+
int r = pakfire_copy_in(self->pakfire, src, dst);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
Py_RETURN_NONE;
}
if (!PyArg_ParseTuple(args, "ss", &src, &dst))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
+
int r = pakfire_copy_out(self->pakfire, src, dst);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
Py_RETURN_NONE;
}
"disable_tests",
NULL,
};
-
const char* path = NULL;
const char* target = NULL;
const char* build_id = NULL;
int disable_snapshot = 0;
int disable_ccache = 0;
int disable_tests = 0;
+ int r;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zzpppp", kwlist, &path, &target,
&build_id, &interactive, &disable_snapshot, &disable_ccache, &disable_tests))
if (disable_tests)
flags |= PAKFIRE_BUILD_DISABLE_TESTS;
+ Py_BEGIN_ALLOW_THREADS
+
// Run build
- int r = pakfire_build(self->pakfire, path, target, build_id, flags);
+ r = pakfire_build(self->pakfire, path, target, build_id, flags);
+
+ Py_END_ALLOW_THREADS
return execute_return_value(r);
}
};
char** packages = NULL;
int disable_snapshot = 0;
+ int r;
// Parse everything
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&p", kwlist,
if (disable_snapshot)
flags |= PAKFIRE_BUILD_DISABLE_SNAPSHOT;
- int r = pakfire_shell(self->pakfire, (const char**)packages, flags);
+ Py_BEGIN_ALLOW_THREADS
+
+ r = pakfire_shell(self->pakfire, (const char**)packages, flags);
+
+ Py_END_ALLOW_THREADS
return execute_return_value(r);
}
static PyObject* Pakfire_clean(PakfireObject* self) {
- int r = pakfire_clean(self->pakfire, 0);
+ int r;
+
+ Py_BEGIN_ALLOW_THREADS
+
+ r = pakfire_clean(self->pakfire, 0);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
Py_RETURN_NONE;
}
static PyObject* Pakfire_refresh(PakfireObject* self, PyObject* args) {
int force = 0;
+ int r;
if (!PyArg_ParseTuple(args, "|p", &force))
return NULL;
- int r = pakfire_refresh(self->pakfire, force);
+ Py_BEGIN_ALLOW_THREADS
+
+ r = pakfire_refresh(self->pakfire, force);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
Py_RETURN_NONE;
}
if (r)
goto ERROR;
+ Py_BEGIN_ALLOW_THREADS
+
// Perform check
r = pakfire_check(self->pakfire, errors);
+
+ Py_END_ALLOW_THREADS
+
if (r)
goto ERROR;
int keep_orphaned = 0;
int flags = 0;
PyObject* status_callback = NULL;
+ int r;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|$pO", kwlist,
&keep_orphaned, &status_callback))
if (keep_orphaned)
flags |= PAKFIRE_REQUEST_KEEP_ORPHANED;
- int r = pakfire_sync(self->pakfire, 0, flags, NULL,
+ Py_BEGIN_ALLOW_THREADS
+
+ r = pakfire_sync(self->pakfire, 0, flags, NULL,
Pakfire_status_callback, status_callback);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
Py_RETURN_NONE;
}
if (!PyArg_ParseTuple(args, "s", &path))
return NULL;
+ Py_BEGIN_ALLOW_THREADS
+
int r = pakfire_archive_open(&archive, self->pakfire, path);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
// Create Python object
PyObject* object = new_archive(&ArchiveType, archive);
pakfire_archive_unref(archive);
Py_DECREF(file);
}
+ Py_BEGIN_ALLOW_THREADS
+
int r = pakfire_repo_compose(self->pakfire, path, flags, files);
if (r) {
+ Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
+ Py_END_ALLOW_THREADS
+
// Return None on success
ret = Py_None;
Py_INCREF(ret);