<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<CFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="cext_xsd.xsd">
<![CDATA[#include "stdio.h"]]>
<variable name="TestInput" type="SINT" class="input"/>
<variable name="TestOutput" type="SINT" class="output"/>
<![CDATA[volatile long Lock=0;
volatile char PtoC=1,CtoP=2;
extern long AtomicCompareExchange(long*,long, long);
int Simple_C_Call(int val){
int Python_to_C_Call(char toC, char *fromC){
/* Code called by python should never touch to
variables modified by PLC thread directly
AtomicCompareExchange comes from
beremiz' runtime implementation */
if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
AtomicCompareExchange((long*)&Lock, 1, 0);
printf("C code called by Python: toC %d fromC %d\n",toC,*fromC);
int PLC_C_Call(char fromPLC, char *toPLC){
/* PLC also have to be realy carefull not to
conflict with asynchronous python access */
if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
AtomicCompareExchange((long*)&Lock, 1, 0);
<![CDATA[if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
TestInput = CtoP + PtoC + TestOutput;
AtomicCompareExchange((long*)&Lock, 1, 0);