summaryrefslogtreecommitdiffstats
path: root/src/python/pyabc.i
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/pyabc.i')
-rw-r--r--src/python/pyabc.i1319
1 files changed, 0 insertions, 1319 deletions
diff --git a/src/python/pyabc.i b/src/python/pyabc.i
deleted file mode 100644
index 0e7b9312..00000000
--- a/src/python/pyabc.i
+++ /dev/null
@@ -1,1319 +0,0 @@
-%module pyabc
-
-// -------------------------------------------------------------------
-// SWIG typemap allowing us to grab a Python callable object
-// -------------------------------------------------------------------
-
-#ifdef SWIG<Python>
-
-%typemap(in) PyObject *PyFunc
-{
-
- if ( !PyCallable_Check($source) )
- {
- PyErr_SetString(PyExc_TypeError, "Need a callable object!");
- return NULL;
- }
-
- $target = $source;
-}
-
-#endif /* #ifdef SWIG<Python> */
-
-%{
-
-#include <base/main/main.h>
-#include <misc/util/utilCex.h>
-
-#include <stdlib.h>
-#include <signal.h>
-
-#include <sys/prctl.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-int n_ands()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk && Abc_NtkIsStrash(pNtk) )
- {
- return Abc_NtkNodeNum(pNtk);
- }
-
- return -1;
-}
-
-int n_nodes()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk )
- {
- return Abc_NtkNodeNum(pNtk);
- }
-
- return -1;
-}
-
-int n_pis()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk )
- {
- return Abc_NtkPiNum(pNtk);
- }
-
- return -1;
-}
-
-
-int n_pos()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk )
- {
- return Abc_NtkPoNum(pNtk);
- }
-
- return -1;
-}
-
-int n_latches()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk )
- {
- return Abc_NtkLatchNum(pNtk);
- }
-
- return -1;
-}
-
-int n_levels()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk )
- {
- return Abc_NtkLevel(pNtk);
- }
-
- return -1;
-}
-
-double n_area()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( pNtk && Abc_NtkHasMapping(pNtk) )
- {
- return Abc_NtkGetMappedArea(pNtk);
- }
-
- return -1;
-}
-
-int has_comb_model()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- return pNtk && pNtk->pModel;
-}
-
-int has_seq_model()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- return pNtk && pNtk->pSeqModel;
-}
-
-int n_bmc_frames()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- return Abc_FrameReadBmcFrames(pAbc);
-}
-
-int prob_status()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- return Abc_FrameReadProbStatus(pAbc);
-}
-
-int is_valid_cex()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- return pNtk && Abc_FrameReadCex(pAbc) && Abc_NtkIsValidCex( pNtk, Abc_FrameReadCex(pAbc) );
-}
-
-int is_true_cex()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- return pNtk && Abc_FrameReadCex(pAbc) && Abc_NtkIsTrueCex( pNtk, Abc_FrameReadCex(pAbc) );
-}
-
-int n_cex_pis()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
-
- return Abc_FrameReadCex(pAbc) ? Abc_FrameReadCexPiNum( pAbc ) : -1;
-}
-
-int n_cex_regs()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
-
- return Abc_FrameReadCex(pAbc) ? Abc_FrameReadCexRegNum( pAbc ) : -1;
-}
-
-int cex_po()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
-
- return Abc_FrameReadCex(pAbc) ? Abc_FrameReadCexPo( pAbc ) : -1;
-}
-
-int cex_frame()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
-
- return Abc_FrameReadCex(pAbc) ? Abc_FrameReadCexFrame( pAbc ) : -1;
-}
-
-int n_phases()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- return pNtk ? Abc_NtkPhaseFrameNum(pNtk) : 1;
-}
-
-int is_const_po( int iPoNum )
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- return Abc_FrameCheckPoConst( pAbc, iPoNum );
-}
-
-Abc_Cex_t* _cex_get()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Cex_t* pCex = Abc_FrameReadCex(pAbc);
-
- if ( ! pCex )
- {
- return NULL;
- }
-
- return Abc_CexDup( pCex, -1 );
-}
-
-int _cex_get_vec_len()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Ptr_t* vCexVec = Abc_FrameReadCexVec(pAbc);
-
- if( ! vCexVec )
- {
- return 0;
- }
-
- return Vec_PtrSize(vCexVec);
-}
-
-Abc_Cex_t* _cex_get_vec(int i)
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Ptr_t* vCexVec = Abc_FrameReadCexVec(pAbc);
-
- if( ! vCexVec )
- {
- return NULL;
- }
-
- Abc_Cex_t* pCex = (Abc_Cex_t*)Vec_PtrEntry( vCexVec, i );
-
- if ( ! pCex )
- {
- return NULL;
- }
-
- return Abc_CexDup( pCex, -1 );
-}
-
-int _status_get_vec_len()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Int_t* vStatusVec = Abc_FrameReadStatusVec(pAbc);
-
- if( ! vStatusVec )
- {
- return 0;
- }
-
- return Vec_IntSize(vStatusVec);
-}
-
-int _status_get_vec(int i)
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Int_t* vStatusVec = Abc_FrameReadStatusVec(pAbc);
-
- if( ! vStatusVec )
- {
- return -1;
- }
-
- return Vec_IntEntry( vStatusVec, i );
-}
-
-void _cex_put(Abc_Cex_t* pCex)
-{
- if ( pCex )
- {
- pCex = Abc_CexDup(pCex, -1);
- }
-
- Abc_FrameSetCex( pCex );
-}
-
-void _cex_free(Abc_Cex_t* pCex)
-{
- Abc_CexFree(pCex);
-}
-
-int _cex_n_regs(Abc_Cex_t* pCex)
-{
- return pCex->nRegs;
-}
-
-int _cex_n_pis(Abc_Cex_t* pCex)
-{
- return pCex->nPis;
-}
-
-int _cex_get_po(Abc_Cex_t* pCex)
-{
- return pCex->iPo;
-}
-
-int _cex_get_frame(Abc_Cex_t* pCex)
-{
- return pCex->iFrame;
-}
-
-static PyObject* VecInt_To_PyList(Vec_Int_t* v)
-{
- PyObject* pylist = PyList_New( Vec_IntSize(v) );
-
- int elem, i;
-
- Vec_IntForEachEntry( v, elem, i)
- {
- PyList_SetItem( pylist, i, PyInt_FromLong(elem) );
- }
-
- return pylist;
-}
-
-PyObject* eq_classes()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Ptr_t *vPoEquivs = Abc_FrameReadPoEquivs(pAbc);
-
- PyObject* eq_classes;
- Vec_Int_t* pEntry;
- int i;
-
- if( ! vPoEquivs )
- {
- Py_RETURN_NONE;
- }
-
- eq_classes = PyList_New( Vec_PtrSize(vPoEquivs) );
-
- Vec_PtrForEachEntry( Vec_Int_t*, vPoEquivs, pEntry, i )
- {
- PyList_SetItem( eq_classes, i, VecInt_To_PyList(pEntry) );
- }
-
- return eq_classes;
-}
-
-PyObject* co_supp( int iCo )
-{
- PyObject* co_supp;
- Vec_Int_t * vSupp;
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( !pNtk )
- {
- Py_RETURN_NONE;
- }
-
- vSupp = Abc_NtkNodeSupportInt( pNtk, iCo );
-
- if( !vSupp )
- {
- Py_RETURN_NONE;
- }
-
- co_supp = VecInt_To_PyList( vSupp );
- Vec_IntFree( vSupp );
-
- return co_supp;
-}
-
-int is_func_iso( int iCo1, int iCo2 )
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( !pNtk )
- {
- return 0;
- }
-
- return Abc_NtkFunctionalIso( pNtk, iCo1, iCo2, 0 );
-}
-
-int is_func_iso2( int iCo1, int iCo2 )
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
-
- if ( !pNtk )
- {
- return 0;
- }
-
- return Abc_NtkFunctionalIso( pNtk, iCo1, iCo2, 1 );
-}
-
-void _pyabc_array_clear()
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Int_t *vObjIds = Abc_FrameReadObjIds(pAbc);
- Vec_IntClear( vObjIds );
-}
-
-void _pyabc_array_push(int i)
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Int_t *vObjIds = Abc_FrameReadObjIds(pAbc);
- Vec_IntPush( vObjIds, i );
-}
-
-int pyabc_array_read_entry(int i)
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Vec_Int_t *vObjIds = Abc_FrameReadObjIds(pAbc);
- if( !vObjIds )
- return -1;
- return Vec_IntEntry( vObjIds, i );
-}
-
-static PyObject* pyabc_internal_python_command_callback = 0;
-
-void pyabc_internal_set_command_callback( PyObject* callback )
-{
- Py_XINCREF(callback);
- Py_XDECREF(pyabc_internal_python_command_callback);
-
- pyabc_internal_python_command_callback = callback;
-}
-
-static int pyabc_internal_abc_command_callback(Abc_Frame_t * pAbc, int argc, char ** argv)
-{
- int i;
-
- PyObject* args;
- PyObject* arglist;
- PyObject* res;
-
- PyGILState_STATE gstate;
-
- long lres;
-
- if ( !pyabc_internal_python_command_callback )
- return 0;
-
- gstate = PyGILState_Ensure();
-
- args = PyList_New(argc);
-
- for( i=0 ; i<argc ; i++ )
- PyList_SetItem(args, i, PyString_FromString(argv[i]) );
-
- arglist = Py_BuildValue("(O)", args);
- Py_INCREF(arglist);
-
- res = PyEval_CallObject( pyabc_internal_python_command_callback, arglist );
- Py_DECREF(arglist);
-
- if ( !res )
- {
- PyGILState_Release(gstate);
- return -1;
- }
-
- lres = PyInt_AsLong(res);
- Py_DECREF(res);
-
- PyGILState_Release(gstate);
-
- return lres;
-}
-
-int run_command(char* cmd)
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- int rc;
-
- Py_BEGIN_ALLOW_THREADS
-
- rc = Cmd_CommandExecute(pAbc, cmd);
-
- Py_END_ALLOW_THREADS
-
- return rc;
-}
-
-void pyabc_internal_register_command( char * sGroup, char * sName, int fChanges )
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
-
- Cmd_CommandAdd( pAbc, sGroup, sName, (Cmd_CommandFuncType)pyabc_internal_abc_command_callback, fChanges);
-}
-
-static int sigchld_pipe_fd = -1;
-
-static void sigchld_handler(int signum)
-{
- while( write(sigchld_pipe_fd, "", 1) == -1 && errno==EINTR )
- ;
-}
-
-static void install_sigchld_handler(int sigchld_fd)
-{
- sigchld_pipe_fd = sigchld_fd;
- signal(SIGCHLD, sigchld_handler);
-}
-
-static int sigint_pipe_fd = -1;
-
-static void sigint_handler(int signum)
-{
- unsigned char tmp = (unsigned char)signum;
- while( write(sigint_pipe_fd, &tmp, 1) == -1 && errno==EINTR )
- ;
-}
-
-static void install_sigint_handler(int sigint_fd)
-{
- sigint_pipe_fd = sigint_fd;
-
- signal(SIGINT, sigint_handler);
-
- // try to catch other signals that ask the process to terminate
- signal(SIGABRT, sigint_handler);
- signal(SIGQUIT, sigint_handler);
- signal(SIGTERM, sigint_handler);
-
- // try to ensure cleanup on exceptional conditions
- signal(SIGBUS, sigint_handler);
- signal(SIGILL, sigint_handler);
- signal(SIGSEGV, sigint_handler);
-
- // try to ensure cleanup before being killed due to resource limit
- signal(SIGXCPU, sigint_handler);
- signal(SIGXFSZ, sigint_handler);
-}
-
-sigset_t old_procmask;
-static int nblocks = 0;
-
-void block_sigint()
-{
- sigset_t procmask;
-
- assert(nblocks==0);
- nblocks ++ ;
-
- sigemptyset(&procmask);
- sigaddset(&procmask, SIGINT);
-
- sigprocmask(SIG_BLOCK, &procmask, &old_procmask);
-}
-
-void unblock_sigint()
-{
- assert( nblocks==1);
- nblocks--;
-
- sigprocmask(SIG_SETMASK, &old_procmask, NULL);
-}
-
-static PyObject* pyabc_internal_system_callback = 0;
-static PyObject* pyabc_internal_tmpfile_callback = 0;
-static PyObject* pyabc_internal_tmpfile_remove_callback = 0;
-
-int Util_SignalSystem(const char* cmd)
-{
- PyObject* arglist;
- PyObject* res;
-
- PyGILState_STATE gstate;
-
- long lres;
-
- if ( !pyabc_internal_system_callback )
- return -1;
-
- gstate = PyGILState_Ensure();
-
- arglist = Py_BuildValue("(O)", PyString_FromString(cmd));
- Py_INCREF(arglist);
-
- res = PyEval_CallObject( pyabc_internal_system_callback, arglist );
- Py_DECREF(arglist);
-
- if ( !res )
- {
- PyGILState_Release(gstate);
- return -1;
- }
-
- lres = PyInt_AsLong(res);
- Py_DECREF(res);
-
- PyGILState_Release(gstate);
-
- return lres;
-}
-
-int Util_SignalTmpFile(const char* prefix, const char* suffix, char** out_name)
-{
- char* str;
- Py_ssize_t size;
-
- PyObject* arglist;
- PyObject* res;
-
- PyGILState_STATE gstate;
-
- *out_name = NULL;
-
- if ( !pyabc_internal_tmpfile_callback )
- return 0;
-
- gstate = PyGILState_Ensure();
-
- arglist = Py_BuildValue("(ss)", prefix, suffix);
- Py_INCREF(arglist);
-
- res = PyEval_CallObject( pyabc_internal_tmpfile_callback, arglist );
- Py_DECREF(arglist);
-
- if ( !res )
- {
- PyGILState_Release(gstate);
- return -1;
- }
-
- PyString_AsStringAndSize(res, &str, &size);
-
- *out_name = ABC_ALLOC(char, size+1);
- strcpy(*out_name, str);
-
- Py_DECREF(res);
-
- PyGILState_Release(gstate);
-
- return open(*out_name, O_WRONLY);
-}
-
-void Util_SignalTmpFileRemove(const char* fname, int fLeave)
-{
- PyObject* arglist;
- PyObject* res;
-
- PyGILState_STATE gstate;
-
- if ( !pyabc_internal_tmpfile_remove_callback )
- return;
-
- gstate = PyGILState_Ensure();
-
- arglist = Py_BuildValue("(si)", fname, fLeave);
- Py_INCREF(arglist);
-
- res = PyEval_CallObject( pyabc_internal_tmpfile_remove_callback, arglist );
- Py_DECREF(arglist);
- Py_XDECREF(res);
-
- PyGILState_Release(gstate);
-}
-
-void pyabc_internal_set_util_callbacks( PyObject* system_callback, PyObject* tmpfile_callback, PyObject* tmpfile_remove_callback )
-{
- Py_XINCREF(system_callback);
- Py_XDECREF(pyabc_internal_system_callback);
-
- pyabc_internal_system_callback = system_callback;
-
- Py_XINCREF(tmpfile_callback);
- Py_XDECREF(pyabc_internal_tmpfile_callback);
-
- pyabc_internal_tmpfile_callback = tmpfile_callback;
-
- Py_XINCREF(tmpfile_remove_callback);
- Py_XDECREF(pyabc_internal_tmpfile_remove_callback);
-
- pyabc_internal_tmpfile_remove_callback = tmpfile_remove_callback;
-}
-
-PyObject* _wait_no_hang()
-{
- int status;
- int pid;
-
- pid = wait3(&status, WNOHANG, NULL);
-
- return Py_BuildValue("(iii)", pid, status, errno);
-}
-
-int _posix_kill(int pid, int signum)
-{
- return kill(pid, signum);
-}
-
-void _set_death_signal()
-{
- // send SIGINT if parent process is dead
- prctl(PR_SET_PDEATHSIG, SIGINT);
-
- // if parent process is already dead (and adopted by init)
- if ( getppid() == 1)
- {
- raise(SIGINT);
- }
-}
-
-%}
-
-%init
-%{
- Abc_Start();
-%}
-
-int n_ands();
-int n_nodes();
-int n_pis();
-int n_pos();
-int n_latches();
-int n_levels();
-double n_area();
-
-int run_command(char* cmd);
-
-int has_comb_model();
-int has_seq_model();
-
-int n_bmc_frames();
-int prob_status();
-
-int is_valid_cex();
-int is_true_cex();
-int n_cex_pis();
-int n_cex_regs();
-int cex_po();
-int cex_frame();
-
-int n_phases();
-int is_const_po( int iPoNum );
-
-Abc_Cex_t* _cex_get();
-int _cex_get_vec_len();
-Abc_Cex_t* _cex_get_vec(int i);
-int _status_get_vec_len();
-int _status_get_vec(int i);
-void _cex_put(Abc_Cex_t* pCex);
-void _cex_free(Abc_Cex_t* pCex);
-int _cex_n_regs(Abc_Cex_t* pCex);
-int _cex_n_pis(Abc_Cex_t* pCex);
-int _cex_get_po(Abc_Cex_t* pCex);
-int _cex_get_frame(Abc_Cex_t* pCex);
-
-PyObject* eq_classes();
-PyObject* co_supp(int iCo);
-int is_func_iso(int iCo1, int iCo2);
-int is_func_iso2(int iCo1, int iCo2);
-
-void _pyabc_array_clear();
-void _pyabc_array_push(int i);
-int pyabc_array_read_entry(int i);
-
-void pyabc_internal_set_command_callback( PyObject* callback );
-void pyabc_internal_register_command( char * sGroup, char * sName, int fChanges );
-
-void install_sigchld_handler(int sigint_fd);
-void install_sigint_handler(int sigint_fd);
-
-void block_sigint();
-void unblock_sigint();
-
-void pyabc_internal_set_util_callbacks( PyObject* system_callback, PyObject* tmpfile_callback, PyObject* tmpfile_remove_callback );
-
-PyObject* _wait_no_hang();
-
-void _set_death_signal();
-
-int _posix_kill(int pid, int signum);
-void _set_death_signal();
-
-%pythoncode
-%{
-
-class _Cex(object):
-
- def __new__(cls, pCex):
-
- if not pCex:
- return None
-
- if int(pCex)==1:
- return True
-
- return object.__new__(cls)
-
- def __init__(self, pCex):
- self.pCex = pCex
-
- def __del__(self):
- if _cex_free:
- _cex_free(self.pCex)
-
- def n_regs(self):
- return _cex_n_regs(self.pCex)
-
- def n_pis(self):
- return _cex_n_pis(self.pCex)
-
- def get_po(self):
- return _cex_get_po(self.pCex)
-
- def get_frame(self):
- return _cex_get_frame(self.pCex)
-
-def cex_get_vector():
-
- return [ _Cex(_cex_get_vec(i)) for i in xrange(_cex_get_vec_len()) ]
-
-def status_get_vector():
-
- return [ _status_get_vec(i) for i in xrange(_status_get_vec_len()) ]
-
-def cex_get():
-
- return _Cex( _cex_get() )
-
-def cex_put(cex):
-
- assert cex is not None
- assert cex.pCex is not None
-
- return _cex_put(cex.pCex)
-
-
-def create_abc_array(List):
- _pyabc_array_clear()
- for ObjId in List:
- _pyabc_array_push(ObjId)
-
-
-import threading
-import select
-import signal
-import tempfile
-import os
-import errno
-import sys, traceback
-import subprocess
-
-_active_lock = threading.Lock()
-_die_flag = False
-
-_active_pids = set()
-_active_temp_files = set()
-
-_terminated_pids_cond = threading.Condition(_active_lock)
-_terminated_pids = {}
-
-def add_temp_file(fname):
- with _active_lock:
- _active_temp_files.add(fname)
-
-def remove_temp_file(fname):
- with _active_lock:
- _active_temp_files.remove(fname)
-
-_old_os_wait3 = os.wait3
-_select_select = select.select
-
-def _retry_select(fd):
- while True:
- try:
- rrdy,_,_ = _select_select([fd],[],[])
- if fd in rrdy:
- return
- except select.error as e:
- if e[0] == errno.EINTR:
- continue
- raise
-
-def _retry_read(fd):
-
- while True:
- try:
- return fd.read(1)
- except OSError as e:
- if e.errno == errno.EINTR:
- continue
- raise
-
-def _retry_os_read(fd):
-
- while True:
- try:
- return os.read(fd, 1)
- except OSError as e:
- if e.errno == errno.EINTR:
- continue
- raise
-
-def _retry_wait():
-
- while True:
-
- pid, status, e = _wait_no_hang()
-
- if pid>0:
- return pid, status
-
- elif pid==0:
- return 0,0
-
- elif pid == -1 and e == errno.ECHILD:
- return 0,0
-
- elif pid==-1 and e != errno.EINTR:
- raise OSError(e, 'unknown error in wait3()')
-
-def _sigint_wait_thread_func(fd):
-
- global _die_flag
-
- while True:
-
- _retry_select(fd)
- _retry_read(fd)
-
- with _active_lock:
-
- if _die_flag:
- os._exit(-1)
-
- _die_flag = True
-
- for pid in _active_pids:
- rc = _posix_kill(pid, signal.SIGINT)
-
- for fname in _active_temp_files:
- os.remove(fname)
-
- os._exit(-1)
-
-def _child_wait_thread_func(fd):
-
- while True:
-
- _retry_select(fd)
- rc = _retry_read(fd)
-
- with _active_lock:
-
- while True:
-
- pid, status = _retry_wait()
-
- if pid==0:
- break
-
- if pid in _active_pids:
- _active_pids.remove(pid)
-
- _terminated_pids[pid] = status
- os.write(_wait_fd_write, "1")
- _terminated_pids_cond.notifyAll()
-
-_sigint_pipe_read_fd = -1
-_sigint_pipe_write_fd = -1
-
-_sigchld_pipe_read_fd = -1
-_sigchld_pipe_write_fd = -1
-
-wait_fd = -1
-_wait_fd_write = -1
-
-def _start_threads():
-
- global wait_fd, _wait_fd_write
- wait_fd, _wait_fd_write = os.pipe()
-
- global _sigint_pipe_read_fd, _sigint_pipe_write_fd
-
- _sigint_pipe_read_fd, _sigint_pipe_write_fd = os.pipe()
- sigint_read = os.fdopen(_sigint_pipe_read_fd, "r", 0 )
-
- sigint_wait_thread = threading.Thread(target=_sigint_wait_thread_func, name="SIGINT wait thread", args=(sigint_read,))
- sigint_wait_thread.setDaemon(True)
- sigint_wait_thread.start()
-
- install_sigint_handler(_sigint_pipe_write_fd)
-
- global _sigchld_pipe_read_fd, _sigchld_pipe_write_fd
-
- _sigchld_pipe_read_fd, _sigchld_pipe_write_fd = os.pipe()
- sigchld_read = os.fdopen(_sigchld_pipe_read_fd, "r", 0 )
-
- child_wait_thread = threading.Thread(target=_child_wait_thread_func, name="child process wait thread", args=(sigchld_read,))
- child_wait_thread.setDaemon(True)
- child_wait_thread.start()
-
- install_sigchld_handler(_sigchld_pipe_write_fd)
-
-_close_on_fork = []
-
-def close_on_fork(fd):
- _close_on_fork.append(fd)
-
-def after_fork():
-
- _set_death_signal()
-
- global _close_on_fork
-
- for fd in _close_on_fork:
- os.close(fd)
-
- _close_on_fork = []
-
- os.close(wait_fd)
- os.close(_wait_fd_write)
-
- os.close(_sigint_pipe_read_fd)
- os.close(_sigint_pipe_write_fd)
-
- os.close(_sigchld_pipe_read_fd)
- os.close(_sigchld_pipe_write_fd)
-
- global _active_lock
- _active_lock = threading.Lock()
-
- global _terminated_pids_cond
- _terminated_pids_cond = threading.Condition(_active_lock)
-
- global _terminated_pids
- _terminated_pids = {}
-
- global _active_pids
- _active_pids = set()
-
- global _active_temp_files
- _active_temp_files = set()
-
- _start_threads()
-
-class _sigint_block_section(object):
- def __init__(self):
- self.blocked = False
-
- def __enter__(self):
- block_sigint()
- self.blocked = True
-
- def __exit__(self, type, value, traceback):
- self.release()
-
- def release(self):
- if self.blocked:
- self.blocked = False
- unblock_sigint()
-
-_old_os_fork = os.fork
-
-def _fork():
-
- ppid = os.getpid()
-
- with _sigint_block_section() as cs:
-
- with _active_lock:
-
- if _die_flag:
- os._exit(-1)
-
- pid = _old_os_fork()
-
- if pid == 0:
- after_fork()
-
- if pid > 0:
- _active_pids.add(pid)
-
- return pid
-
-def _waitpid(pid, options=0):
-
- while True:
-
- with _active_lock:
-
- if pid in _terminated_pids:
- _retry_os_read(wait_fd)
- status = _terminated_pids[pid]
- del _terminated_pids[pid]
- return pid, status
-
- if options==os.WNOHANG:
- return 0, 0
-
- _terminated_pids_cond.wait()
-
-def _wait(options=0):
-
- while True:
-
- with _active_lock:
-
- for pid, status in _terminated_pids.iteritems():
- _retry_os_read(wait_fd)
- del _terminated_pids[pid]
- return pid, status
-
- if options==os.WNOHANG:
- return 0, 0
-
- _terminated_pids_cond.wait()
-
-_old_os_kill = os.kill
-
-def _kill(pid, sig):
-
- with _active_lock:
-
- if pid in _terminated_pids:
- return None
-
- return _old_os_kill(pid,sig)
-
-os.kill = _kill
-os.fork = _fork
-os.wait = _wait
-os.waitpid = _waitpid
-
-def _split_command_line(cmd):
-
- args = []
-
- i=0
-
- while i<len(cmd):
-
- while i<len(cmd) and cmd[i] in [' ','\t','\f']:
- i += 1
-
- if i >= len(cmd):
- break
-
- arg = []
-
- in_quotes = None
-
- while i<len(cmd):
-
- if not in_quotes and cmd[i] in ['\'','\"','\'']:
- in_quotes = cmd[i]
-
- elif in_quotes and cmd[i]==in_quotes:
- in_quotes = None
-
- elif cmd[i] == '\\' and i<(len(cmd)+1):
-
- i += 1
-
- if cmd[i]=='\\':
- arg.append('\\')
- elif cmd[i]=='\'':
- arg.append('\'')
- elif cmd[i]=='\"':
- arg.append('\'')
- elif cmd[i]=='\"':
- arg.append('\"')
- elif cmd[i]=='a':
- arg.append('\a')
- elif cmd[i]=='b':
- arg.append('\b')
- elif cmd[i]=='n':
- arg.append('\n')
- elif cmd[i]=='f':
- arg.append('\f')
- elif cmd[i]=='r':
- arg.append('\r')
- elif cmd[i]=='t':
- arg.append('\t')
- elif cmd[i]=='v':
- arg.append('\v')
- else:
- arg.append(cmd[i])
-
- elif not in_quotes and cmd[i] in [' ','\t','\f']:
- break
-
- else:
- arg.append(cmd[i])
-
- i += 1
-
- args.append( "".join(arg) )
-
- return args
-
-
-def system(cmd):
-
- args = _split_command_line(cmd)
-
- if args[-2] == '>':
-
- with open(args[-1],'w') as fout:
- p = subprocess.Popen(args[:-2], stdout=fout)
- rc = p.wait()
- return rc
-
- else:
- p = subprocess.Popen(args)
- return p.wait()
-
-def tmpfile(prefix, suffix):
-
- with _active_lock:
- with tempfile.NamedTemporaryFile(delete=False, prefix=prefix, suffix=suffix) as file:
- _active_temp_files.add(file.name)
- return file.name
-
-def tmpfile_remove(fname, leave):
-
- with _active_lock:
- os.remove(fname)
- _active_temp_files.remove(fname)
-
-pyabc_internal_set_util_callbacks( system, tmpfile,tmpfile_remove )
-
-
-_start_threads()
-
-
-_registered_commands = {}
-
-def _cmd_callback(args):
- try:
- assert len(args) > 0
-
- cmd = args[0]
- assert cmd in _registered_commands
-
- res = _registered_commands[cmd](args)
-
- assert type(res) == int, "User-defined Python command must return an integer."
-
- return res
-
- except Exception, e:
- import traceback
- traceback.print_exc()
-
- except SystemExit, se:
- pass
-
- return 0
-
-pyabc_internal_set_command_callback( _cmd_callback )
-
-def add_abc_command(fcmd, group, cmd, change):
- _registered_commands[ cmd ] = fcmd
- pyabc_internal_register_command( group, cmd, change)
-
-import optparse
-
-xxx = {}
-
-def cmd_python(cmd_args):
-
- usage = "usage: %prog [options] <Python files>"
-
- parser = optparse.OptionParser(usage, prog="python")
-
- parser.add_option("-c", "--cmd", dest="cmd", help="Execute Python command directly")
- parser.add_option("-v", "--version", action="store_true", dest="version", help="Display Python Version")
-
- options, args = parser.parse_args(cmd_args)
-
- if options.version:
- print sys.version
- return 0
-
- if options.cmd:
- exec options.cmd in xxx
- return 0
-
- scripts_dir = os.getenv('ABC_PYTHON_SCRIPTS', ".")
- scripts_dirs = scripts_dir.split(':')
-
- for fname in args[1:]:
- if os.path.isabs(fname):
- execfile(fname, xxx)
- else:
- for d in scripts_dirs:
- fname = os.path.join(scripts_dir, fname)
- if os.path.exists(fname):
- execfile(fname, xxx)
- break
-
- return 0
-
-add_abc_command(cmd_python, "Python", "python", 0)
-
-
-%}