aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/worker.c24
-rw-r--r--src/worker.h10
-rw-r--r--src/worker_main.c6
3 files changed, 27 insertions, 13 deletions
diff --git a/src/worker.c b/src/worker.c
index 7487e62..474be1c 100644
--- a/src/worker.c
+++ b/src/worker.c
@@ -20,13 +20,29 @@
#include <string.h>
#include <unistd.h>
-int worker_create(struct worker *worker, const struct settings *settings)
+struct worker {
+ int fd;
+
+ pthread_mutex_t task_mtx;
+ pthread_t task;
+ int task_active;
+};
+
+int worker_create(struct worker **_worker, const struct settings *settings)
{
+ struct worker *worker;
int ret = 0;
+ *_worker = malloc(sizeof(struct worker));
+ if (!*_worker) {
+ log_errno("malloc");
+ return -1;
+ }
+ worker = *_worker;
+
ret = libgit_init();
if (ret < 0)
- return ret;
+ goto free;
ret = net_connect(settings->host, settings->port);
if (ret < 0)
@@ -38,6 +54,9 @@ int worker_create(struct worker *worker, const struct settings *settings)
git_shutdown:
libgit_shutdown();
+free:
+ free(worker);
+
return ret;
}
@@ -47,6 +66,7 @@ void worker_destroy(struct worker *worker)
log_errno_if(close(worker->fd), "close");
libgit_shutdown();
+ free(worker);
}
static int msg_send_new_worker(const struct worker *worker)
diff --git a/src/worker.h b/src/worker.h
index 0bf3e80..246fd43 100644
--- a/src/worker.h
+++ b/src/worker.h
@@ -15,15 +15,9 @@ struct settings {
char *port;
};
-struct worker {
- int fd;
+struct worker;
- pthread_mutex_t task_mtx;
- pthread_t task;
- int task_active;
-};
-
-int worker_create(struct worker *, const struct settings *);
+int worker_create(struct worker **, const struct settings *);
void worker_destroy(struct worker *);
int worker_main(struct worker *, int argc, char *argv[]);
diff --git a/src/worker_main.c b/src/worker_main.c
index 7451861..7c78f93 100644
--- a/src/worker_main.c
+++ b/src/worker_main.c
@@ -72,7 +72,7 @@ static int parse_settings(struct settings *settings, int argc, char *argv[])
int main(int argc, char *argv[])
{
struct settings settings;
- struct worker worker;
+ struct worker *worker;
int ret = 0;
ret = parse_settings(&settings, argc, argv);
@@ -83,12 +83,12 @@ int main(int argc, char *argv[])
if (ret < 0)
return ret;
- ret = worker_main(&worker, argc - optind, argv + optind);
+ ret = worker_main(worker, argc - optind, argv + optind);
if (ret < 0)
goto destroy_worker;
destroy_worker:
- worker_destroy(&worker);
+ worker_destroy(worker);
return ret;
}