Added auto-recompilation (sometimes it works)
This commit is contained in:
parent
2bc3f75535
commit
869553f402
5
cbt.c
5
cbt.c
|
@ -3,11 +3,10 @@
|
||||||
#include "cbt.h"
|
#include "cbt.h"
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
cbt_verbosity = CBT_LOG_ALL;
|
cbt_verbosity = CBT_LOG_DEBUG;
|
||||||
CBT_INIT(argc, argv);
|
CBT_INIT(argc, argv);
|
||||||
|
|
||||||
struct cbt_proc proc = cbt_proc_new(CBT_PROC_NORMAL, "sh", "-c", "while sleep 0.1; do echo 'nya'; done");
|
struct cbt_proc proc = cbt_proc_new(CBT_PROC_NORMAL, "sh", "-c", "echo 'owo'");
|
||||||
|
|
||||||
cbt_proc_wait(proc);
|
cbt_proc_wait(proc);
|
||||||
|
|
||||||
cbt_cleanup();
|
cbt_cleanup();
|
||||||
|
|
28
cbt.h
28
cbt.h
|
@ -115,11 +115,12 @@ int cbt_proc_wait(struct cbt_proc proc);
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#define CBT_FAIL(COND) if (COND) { cbt_log(CBT_LOG_FATAL, "condition %s failed: %s", #COND, strerror(errno)); abort(); };
|
#define CBT_FAIL(COND) if (COND) { cbt_log(CBT_LOG_FATAL, "condition %s failed, %s", #COND, strerror(errno)); abort(); };
|
||||||
|
|
||||||
enum cbt_loglevel cbt_verbosity = 0;
|
enum cbt_loglevel cbt_verbosity = 0;
|
||||||
char *cbt_cc = NULL;
|
char *cbt_cc = NULL;
|
||||||
long cbt_start_time = 0;
|
long cbt_start_time = 0;
|
||||||
|
bool cbt_running = false;
|
||||||
|
|
||||||
struct _cbt__autoproc_fdset {
|
struct _cbt__autoproc_fdset {
|
||||||
struct pollfd *items;
|
struct pollfd *items;
|
||||||
|
@ -134,9 +135,10 @@ struct _cbt__autoproc_set {
|
||||||
size_t size, cap;
|
size_t size, cap;
|
||||||
} cbt__autoproc_set = { 0 };
|
} cbt__autoproc_set = { 0 };
|
||||||
|
|
||||||
|
struct cbt_procgroup cbt__default_procgroup = { .items = 0, .size = 0, .cap = 4 };
|
||||||
|
|
||||||
pthread_t _cbt__autoproc_thread;
|
pthread_t _cbt__autoproc_thread;
|
||||||
pthread_mutex_t _cbt__autoproc_mut = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t _cbt__autoproc_mut = PTHREAD_MUTEX_INITIALIZER;
|
||||||
bool cbt_running = false;
|
|
||||||
|
|
||||||
const char *cbt_log__colors[CBT_LOG_ALL + 1] = {
|
const char *cbt_log__colors[CBT_LOG_ALL + 1] = {
|
||||||
"\x1b[1;31m",
|
"\x1b[1;31m",
|
||||||
|
@ -167,13 +169,25 @@ void cbt__init(int argc, char **argv, const char *source_file) {
|
||||||
cbt_log(CBT_LOG_DEBUG, "Args: %s", cbt_escape_args(argv));
|
cbt_log(CBT_LOG_DEBUG, "Args: %s", cbt_escape_args(argv));
|
||||||
cbt_log(CBT_LOG_DEBUG, "%s", cbt_fmt("format test: %s", "ok"));
|
cbt_log(CBT_LOG_DEBUG, "%s", cbt_fmt("format test: %s", "ok"));
|
||||||
|
|
||||||
if (cbt_needs_recompilation(source_file, argv[0])) {
|
cbt__default_procgroup.items = calloc(cbt__default_procgroup.cap, sizeof(struct cbt_proc));
|
||||||
cbt_log(CBT_LOG_WARNING, "Needs recompilation, but not implemented yet");
|
|
||||||
}
|
|
||||||
|
|
||||||
cbt_log(CBT_LOG_DEBUG, "Starting line processor thread");
|
cbt_log(CBT_LOG_DEBUG, "Starting line processor thread");
|
||||||
// TODO: error checking
|
// TODO: error checking
|
||||||
pthread_create(&_cbt__autoproc_thread, NULL, cbt__line_processor, NULL);
|
pthread_create(&_cbt__autoproc_thread, NULL, cbt__line_processor, NULL);
|
||||||
|
|
||||||
|
if (cbt_needs_recompilation(source_file, argv[0])) {
|
||||||
|
cbt_log(CBT_LOG_INFO, "Recompiling...");
|
||||||
|
struct cbt_proc cc = cbt_proc_new(CBT_PROC_NORMAL, cbt_cc, source_file, "-o", argv[0], "-Wall", "-Wextra", NULL);
|
||||||
|
int status = cbt_proc_wait(cc);
|
||||||
|
cbt_log(CBT_LOG_INFO, "CC returned %d", status);
|
||||||
|
if (status == 0) {
|
||||||
|
cbt_cleanup();
|
||||||
|
cbt_log(CBT_LOG_INFO, "Restarting CBT", cbt_escape_args(argv));
|
||||||
|
execv(argv[0], argv);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cbt_cleanup(void) {
|
void cbt_cleanup(void) {
|
||||||
|
@ -183,6 +197,7 @@ void cbt_cleanup(void) {
|
||||||
cbt_log(CBT_LOG_INFO, "cbt shutting down");
|
cbt_log(CBT_LOG_INFO, "cbt shutting down");
|
||||||
pthread_join(_cbt__autoproc_thread, NULL);
|
pthread_join(_cbt__autoproc_thread, NULL);
|
||||||
pthread_mutex_unlock(&_cbt__autoproc_mut);
|
pthread_mutex_unlock(&_cbt__autoproc_mut);
|
||||||
|
cbt_log(CBT_LOG_INFO, "shutdown complete");
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *cbt_fmt(const char *fmt, ...) {
|
const char *cbt_fmt(const char *fmt, ...) {
|
||||||
|
@ -276,7 +291,6 @@ bool cbt_needs_recompilation(const char *input, const char *output) {
|
||||||
|
|
||||||
void cbt__add_fd(int fd, bool is_err) {
|
void cbt__add_fd(int fd, bool is_err) {
|
||||||
cbt_log(CBT_LOG_DEBUG, "cbt__add_fd() adding %d", fd);
|
cbt_log(CBT_LOG_DEBUG, "cbt__add_fd() adding %d", fd);
|
||||||
pthread_kill(_cbt__autoproc_thread, SIGUSR1);
|
|
||||||
pthread_mutex_lock(&_cbt__autoproc_mut);
|
pthread_mutex_lock(&_cbt__autoproc_mut);
|
||||||
cbt_log(CBT_LOG_DEBUG, "cbt__add_fd() locked mutex for fd=%d", fd);
|
cbt_log(CBT_LOG_DEBUG, "cbt__add_fd() locked mutex for fd=%d", fd);
|
||||||
|
|
||||||
|
@ -310,6 +324,7 @@ struct cbt_proc cbt_proc_newv(enum cbt_proc_mode mode, va_list args) {
|
||||||
if (arg == NULL) break;
|
if (arg == NULL) break;
|
||||||
cbt_da_add(args_da, strdup(arg));
|
cbt_da_add(args_da, strdup(arg));
|
||||||
}
|
}
|
||||||
|
cbt_da_add(args_da, NULL);
|
||||||
|
|
||||||
cbt_log(CBT_LOG_DEBUG, "Spawning process with mode %d and args %s", mode, cbt_escape_args(args_da.items));
|
cbt_log(CBT_LOG_DEBUG, "Spawning process with mode %d and args %s", mode, cbt_escape_args(args_da.items));
|
||||||
|
|
||||||
|
@ -365,6 +380,7 @@ int cbt_proc_wait(struct cbt_proc proc) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
pid_t w = waitpid(proc.pid, &wstatus, WUNTRACED | WCONTINUED);
|
pid_t w = waitpid(proc.pid, &wstatus, WUNTRACED | WCONTINUED);
|
||||||
|
cbt_log(CBT_LOG_DEBUG, "waitpid(%d) -> %d, status = %d", proc.pid, w, wstatus);
|
||||||
if (w == -1) {
|
if (w == -1) {
|
||||||
cbt_log(CBT_LOG_WARNING, "waitpid(%d) -> %d (%s)", proc.pid, w, strerror(errno));
|
cbt_log(CBT_LOG_WARNING, "waitpid(%d) -> %d (%s)", proc.pid, w, strerror(errno));
|
||||||
return -2000;
|
return -2000;
|
||||||
|
|
Loading…
Reference in New Issue