]> Repositorios git - scryer-prolog.git/commitdiff
Add pid/1 predicate to the os library
authorPaulo Moura <[email protected]>
Tue, 18 May 2021 18:35:35 +0000 (19:35 +0100)
committerPaulo Moura <[email protected]>
Tue, 18 May 2021 19:05:30 +0000 (20:05 +0100)
src/clause_types.rs
src/lib/os.pl
src/machine/system_calls.rs

index 4ceda2f055c1de6e3f9670917a4c5b0dc9641e0b..9f99b3fce9c91c8f3a0dcefef4907f737e4fd3ce 100644 (file)
@@ -300,6 +300,7 @@ pub(crate) enum SystemClauseType {
     GetEnv,
     SetEnv,
     UnsetEnv,
+    PID,
     CharsBase64,
     DevourWhitespace,
     IsSTOEnabled,
@@ -588,6 +589,7 @@ impl SystemClauseType {
             &SystemClauseType::GetEnv => clause_name!("$getenv"),
             &SystemClauseType::SetEnv => clause_name!("$setenv"),
             &SystemClauseType::UnsetEnv => clause_name!("$unsetenv"),
+            &SystemClauseType::PID => clause_name!("$pid"),
             &SystemClauseType::CharsBase64 => clause_name!("$chars_base64"),
             &SystemClauseType::LoadLibraryAsStream => clause_name!("$load_library_as_stream"),
             &SystemClauseType::DevourWhitespace => clause_name!("$devour_whitespace"),
@@ -806,6 +808,7 @@ impl SystemClauseType {
             ("$getenv", 2) => Some(SystemClauseType::GetEnv),
             ("$setenv", 2) => Some(SystemClauseType::SetEnv),
             ("$unsetenv", 1) => Some(SystemClauseType::UnsetEnv),
+            ("$pid", 1) => Some(SystemClauseType::PID),
             ("$chars_base64", 4) => Some(SystemClauseType::CharsBase64),
             ("$load_library_as_stream", 3) => Some(SystemClauseType::LoadLibraryAsStream),
             ("$push_load_context", 2) => Some(SystemClauseType::REPL(REPLCodePtr::PushLoadContext)),
index f12997b2af18608a62e7736c83b32ff3544bbc59..f505ab7bc49125c58197871e89f5a27c02ab1331 100644 (file)
@@ -14,7 +14,8 @@
 
 :- module(os, [getenv/2,
                setenv/2,
-               unsetenv/1]).
+               unsetenv/1,
+               pid/1]).
 
 :- use_module(library(error)).
 :- use_module(library(charsio)).
@@ -33,6 +34,10 @@ unsetenv(Key) :-
         must_be_env_var(Key),
         '$unsetenv'(Key).
 
+pid(PID) :-
+        can_be(integer, PID),
+        '$pid'(PID).   
+
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    For now, we only support a restricted subset of variable names.
 
index fbe76bdfcd0108636cbc4f3618526ecf71d76fa5..54351234911c66816904703d0b8a9b5214f6b8a7 100644 (file)
@@ -41,6 +41,7 @@ use std::net::{TcpListener, TcpStream};
 use std::num::NonZeroU32;
 use std::ops::Sub;
 use std::rc::Rc;
+use std::process;
 
 use chrono::{offset::Local, DateTime};
 use cpu_time::ProcessTime;
@@ -5351,6 +5352,12 @@ impl MachineState {
                 let key = self.heap_pstr_iter(self[temp_v!(1)]).to_string();
                 env::remove_var(key);
             }
+            &SystemClauseType::PID => {
+                let a1 = self[temp_v!(1)];
+                let pid = process::id();
+                let addr = self.heap.put_constant(Constant::Integer(Rc::new(Integer::from(pid))));
+                (self.unify_fn)(self, a1, addr);
+            }
             &SystemClauseType::CharsBase64 => {
                 let padding = self.atom_argument_to_string(3);
                 let charset = self.atom_argument_to_string(4);