Files
sics/background.c
Ferdi Franceschini 10d29d597c Cleaned up ANSTO code to merge with sinqdev.sics
This is our new RELEASE-4_0 branch which was taken from ansto/93d9a7c
Conflicts:
	.gitignore
	SICSmain.c
	asynnet.c
	confvirtualmot.c
	counter.c
	devexec.c
	drive.c
	event.h
	exebuf.c
	exeman.c
	histmem.c
	interface.h
	motor.c
	motorlist.c
	motorsec.c
	multicounter.c
	napi.c
	napi.h
	napi4.c
	network.c
	nwatch.c
	nxscript.c
	nxxml.c
	nxxml.h
	ofac.c
	reflist.c
	scan.c
	sicshipadaba.c
	sicsobj.c
	site_ansto/docs/Copyright.txt
	site_ansto/instrument/lyrebird/config/tasmad/sicscommon/nxsupport.tcl
	site_ansto/instrument/lyrebird/config/tasmad/taspub_sics/tasscript.tcl
	statusfile.c
	tasdrive.c
	tasub.c
	tasub.h
	tasublib.c
	tasublib.h
2015-04-23 20:49:26 +10:00

88 lines
2.0 KiB
C

/**
* This is for backgrounding operations in SICS. They run in an own
* task.
*
* copyright: see file COPYRIGHT
*
* Mark Koennecke, February 2009
*/
#include <sics.h>
#include "splitter.h"
#include "background.h"
/*---------------------------------------------------------------------------*/
typedef struct {
SConnection *con;
char *command;
} BckTask, *pBckTask;
/*---------------------------------------------------------------------------*/
static void KillBckTask(void *data)
{
pBckTask self = (pBckTask) data;
if (self == NULL) {
return;
}
if (self->con) {
SCDeleteConnection(self->con);
}
if (self->command) {
free(self->command);
}
}
/*---------------------------------------------------------------------------*/
static int BackgroundTask(void *data)
{
pBckTask self = (pBckTask) data;
assert(self != NULL);
InterpExecute(pServ->pSics, self->con, self->command);
return 0;
}
/*----------------------------------------------------------------------------*/
int BackgroundCommand(SConnection * pCon, char *command)
{
pBckTask self = NULL;
self = calloc(1, sizeof(BckTask));
if (self == NULL) {
return 0;
}
self->con = SCCopyConnection(pCon);
self->command = strdup(command);
if (self->con == NULL || self->command == NULL) {
free(self);
return 0;
}
TaskRegisterN(pServ->pTasker, self->command, BackgroundTask, NULL, KillBckTask, self, 1);
return 1;
}
/*------------------------------------------------------------------------*/
int BackgroundAction(SConnection * pCon, SicsInterp * pSics,
void *pData, int argc, char *argv[])
{
int status;
char command[1024];
memset(command, 0, 1024);
Arg2Text(argc - 1, &argv[1], command, 1024);
status = BackgroundCommand(pCon, command);
if (status == 0) {
SCWrite(pCon, "ERROR: out of memory starting task", eError);
return 0;
}
SCSendOK(pCon);
return 1;
}
/*--------------------------------------------------------------------------*/
void InstallBackground(void)
{
AddCmd("bg", BackgroundAction);
}