todo items for cserve for evas done - well some of them. more to come.

SVN revision: 40495
This commit is contained in:
Carsten Haitzler 2009-05-03 07:37:31 +00:00
parent a5428a4ca3
commit bd6d938956
3 changed files with 119 additions and 5 deletions

View File

@ -1,11 +1,9 @@
#include "Evas.h"
#include "evas_cs.h"
#include <signal.h>
// fixme:'s
//
// sigint/term - catch and shut down cleanly (server)
// sigpipe - catch and ignore (both)
// cwd for loading files needs to be put into a full path (client)
// add ops to get/set cache size, check time and cache time (both)
// add ops to get internal state (both)
// preload - make it work (both)
@ -658,6 +656,66 @@ parse_args(int argc, char **argv)
}
}
static exit_flag = 0;
static void
exit_handler(int x, siginfo_t *info, void *data)
{
exit_flag = 1;
}
static void
pipe_handler(int x, siginfo_t *info, void *data)
{
}
static void
signal_init(void)
{
struct sigaction action, old_action;
action.sa_handler = NULL;
action.sa_sigaction = exit_handler;
action.sa_flags = SA_RESTART | SA_SIGINFO;
sigemptyset(&action.sa_mask);
sigaction(SIGINT, &action, &old_action);
action.sa_handler = NULL;
action.sa_sigaction = exit_handler;
action.sa_flags = SA_RESTART | SA_SIGINFO;
sigemptyset(&action.sa_mask);
sigaction(SIGTERM, &action, &old_action);
action.sa_handler = NULL;
action.sa_sigaction = exit_handler;
action.sa_flags = SA_RESTART | SA_SIGINFO;
sigemptyset(&action.sa_mask);
sigaction(SIGQUIT, &action, &old_action);
action.sa_handler = NULL;
action.sa_sigaction = pipe_handler;
action.sa_flags = SA_RESTART | SA_SIGINFO;
sigemptyset(&action.sa_mask);
sigaction(SIGPIPE, &action, &old_action);
// SIGUSR1
// SIGUSR2
// SIGHUP
// SIGCHLD
// SIGSEGV
// SIGILL
// SIGBUS
// SIGFPE
// SIGABRT
}
static void
signal_shutdown(void)
{
}
int
main(int argc, char **argv)
{
@ -670,6 +728,7 @@ main(int argc, char **argv)
evas_init();
img_init();
signal_init();
s = evas_cserve_server_add();
if (!s)
{
@ -706,7 +765,9 @@ main(int argc, char **argv)
{
/* fixme: timeout 0 only her - future use timeouts for timed
* housekeping */
if (exit_flag) break;
evas_cserve_server_wait(s, t_next * 1000000);
if (exit_flag) break;
t = time(NULL);
t_next = t - last_check;
if ((t_next) > cache_item_timeout_check)
@ -720,6 +781,12 @@ main(int argc, char **argv)
t_next = 1;
}
error:
printf("clean shutdown\n");
if (stat_mem)
{
stat_clean(stat_mem);
}
signal_shutdown();
img_shutdown();
if (stat_mem)
{

View File

@ -1,7 +1,33 @@
#include "evas_cs.h"
#include <signal.h>
#ifdef EVAS_CSERVE
static void
pipe_handler(int x, siginfo_t *info, void *data)
{
}
static void
pipe_handle(int push)
{
static struct sigaction old_action;
struct sigaction action;
if (push)
{
action.sa_handler = NULL;
action.sa_sigaction = pipe_handler;
action.sa_flags = SA_RESTART | SA_SIGINFO;
sigemptyset(&action.sa_mask);
sigaction(SIGPIPE, &action, &old_action);
}
else
{
sigaction(SIGPIPE, &old_action, &action);
}
}
static Server *
server_connect(void)
{
@ -52,12 +78,22 @@ server_send(Server *s, int opcode, int size, unsigned char *data)
int ints[2];
int num;
pipe_handle(1);
ints[0] = size;
ints[1] = opcode;
num = write(s->fd, ints, (sizeof(int) * 2));
if (num < 0) return 0;
if (num < 0)
{
pipe_handle(0);
return 0;
}
num = write(s->fd, data, size);
if (num < 0) return 0;
if (num < 0)
{
pipe_handle(0);
return 0;
}
pipe_handle(0);
return 1;
}
@ -158,6 +194,7 @@ evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_
Op_Load msg;
Op_Load_Reply *rep;
unsigned char *buf;
char fbuf[PATH_MAX], wd[PATH_MAX];
int flen, klen;
int opcode;
int size;
@ -171,6 +208,15 @@ evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_
msg.lopt.dpi = lopt->dpi;
msg.lopt.w = lopt->w;
msg.lopt.h = lopt->h;
if (file[0] != '/')
{
if (getcwd(wd, sizeof(wd)))
{
snprintf(fbuf, "%s/%s", wd, file);
file = fbuf;
}
}
if (!realpath(file, wd)) file = wd;
flen = strlen(file) + 1;
klen = strlen(key) + 1;
buf = malloc(sizeof(msg) + flen + klen);

View File

@ -123,6 +123,7 @@ evas_cserve_mem_close(Mem *m)
EAPI Eina_Bool
evas_cserve_mem_resize(Mem *m, int size)
{
if (m->size == size) return 1;
if (m->write)
{
if (ftruncate(m->fd, size) < 0) return 0;