PLUGIN process lang: "C++" version: "1.0" date: "2022-02-17" author: "Julien BRUGUIER" maintainer: "Julien BRUGUIER " synopsis: "A low level process manipulation plugin." description: %{ This plugin provides a low level of process handling for testing purposes. .P Please use the official plugin run if you do not know what you are doing here. %} seealso: %{ .BR svm_plugin_run (7) for instruction :run.parallel_call. %} example: "Test" %{ .nf #!/usr/local/bin/svm LOG FILE "error.log" PLUGIN "svmcom.so" PLUGIN "svmrun.so" PLUGIN "/usr/local/lib/svmpluginprocess/libsvmprocess.so" PROCESS "test" CODE "main" INLINE :memory process.instance/p1, process.instance/p2, process.lock/l :process.new $"p1" "p1" -> &p1 :process.attach @&p1 run.parallel 0 :process.new $"p2" "p2" -> &p2 :process.attach @&p2 run.parallel 0 :run.sleep HARD 2 :process.critical -> &l :run.sleep HARD 3 [ ] -> l :run.sleep HARD 2 :shutdown :symbol p1 :memory process.instance/p3, process.lock/l :process.new $"p2" "p3" -> &p3 :process.lock @&p3 -> &l :process.attach @&p3 run.parallel 0 :memory INT/i 0 -> &i :label l1 :shift &i :goto l1 :when @&i IN &0*10000000 [ ] -> l :shutdown :symbol p2 :memory INT/i 0 -> &i :label l2 :shift &i :goto l2 :when @&i IN &0*10000000 :shutdown END END .fi %} DEFINE TYPE process.instance %{ type_instance(SVM_Process p) :_process(p) {} SVM_Process _process; %} delete default: %{ ::svm_variable_scope_set_local(svm,object->_process); %} print object: %{ return ::svm_process_print(svm,object->_process); %} help: "A type to handle a process from memory." TYPE process.lock %{ type_lock(SVM_Process_Lock l) :_lock(l) {} operator std::string () const { return "acquired?"; } SVM_Process_Lock _lock; %} delete default: %{ ::svm_variable_scope_set_local(svm,object->_lock); %} print default: %{ %} help: "A type to handle a process lock from memory." SYSTEM INSTRUCTION process.new SYM : code STR : name -> process.instance %{ SVM_Process process = ::svm_process_new_symbol(svm,::svm_parameter_value_get(svm,argv[1]),nullptr,FALSE,::svm_parameter_value_get(svm,argv[0]),TRUE,FALSE,FALSE,nullptr); ::svm_variable_scope_set_global(svm,process); auto p = new type_instance(process); return NEW_PLUGIN(process,instance,p); %} help: "Create a process with specified name running code at specified symbol." WAITING INSTRUCTION process.attach process.instance PEP : scheduler INT : parameter -> BLN %{ type_instance *p = ARGV_PLUGIN(0,process,instance); if(not ::svm_process_ownership_get_local(svm,p->_process)) { return NEW_VALUE(boolean,FALSE); } SVM_Boolean b = ::svm_scheduler_process_attach(svm,::svm_scheduler_get(svm,::svm_parameter_value_get(svm,argv[1])),p->_process,::svm_parameter_value_get(svm,argv[2])); return NEW_VALUE(boolean,b); %} help: "Attach a process to a scheduler." WAITING INSTRUCTION process.detach process.instance PEP INT -> BLN %{ type_instance *p = ARGV_PLUGIN(0,process,instance); if(not ::svm_process_ownership_get_local(svm,p->_process)) { return NEW_VALUE(boolean,FALSE); } SVM_Boolean b = ::svm_scheduler_process_detach(svm,::svm_scheduler_get(svm,::svm_parameter_value_get(svm,argv[1])),p->_process,::svm_parameter_value_get(svm,argv[2])); return NEW_VALUE(boolean,b); %} help: "Detach a process to a scheduler." WAITING INSTRUCTION process.lock process.instance -> process.lock ? %{ type_instance *p = ARGV_PLUGIN(0,process,instance); SVM_Process_Lock lock = ::svm_process_ownership_lock(svm,p->_process); if(lock) { ::svm_variable_scope_set_global(svm,lock); type_lock *l = new type_lock(lock); return NEW_PLUGIN(process,lock,l); } return NEW_NULL_PLUGIN(process,lock); %} help: "Lock the specified process. Returns a null value when the lock is not acquired." SYSTEM WAITING INSTRUCTION process.critical -> process.lock ? %{ SVM_Process_Lock lock = ::svm_process_ownership_lock_critical(svm); if(lock) { ::svm_variable_scope_set_global(svm,lock); type_lock *l = new type_lock(lock); return NEW_PLUGIN(process,lock,l); } return NEW_NULL_PLUGIN(process,lock); %} help: "Lock all other processes. Returns a null value when the lock is not acquired."