SlideShare a Scribd company logo
Kilim-Clojure integration




              Message Passing Concurrency in Clojure using
                                Kilim

                              Antonio Garrote

                                  Forward


                             November 7, 2011
Kilim-Clojure integration




Clojure’s Concurrency Model




               JVM thread basic autonomous work unit
               Java shared memory explicit communication primitives
               Immutable data structures + implicit coordination
               mechanisms (STM, Refs)
Kilim-Clojure integration




Message Passing Communication

  1    % T e r m i t e Scheme b e n c h m a r k s r i n g . e r l
  2    m a k e r e l a y ( Next ) − >
  3           receive
  4                  K when K > 0 −          >
  5                         Next ! K − 1 ,
  6                         m a k e r e l a y ( Next ) ;
  7                  K−   >
  8                         Next ! K
  9          end .
 10
 11    l o o p (K , C u r r e n t , N) when N > 1 −          >
 12            l o o p (K , spawn ( r i n g , m a k e r e l a y , [ C u r r e n t ] ) ,N − 1 ) ;
 13
 14    l o o p (K , C u r r e n t , ) −>
 15            s e l f ( ) ! K,
 16            make relay ( Current ) .
 17
 18    % N = number p r o c e s s e s
 19    % K = number o f m e s s a g e e x c h a n g e s
 20    r i n g (N, K) −     >
 21            l o o p (K , s e l f ( ) , N ) .
Kilim-Clojure integration




Message Passing Communication


                            1
         2                      N
                                        N = 100K , K = 0
                                        518ms, 5µs process creation
   3                                K
                                        N = 100K , K = 1M
                                        759ms, 0.76µs local msg . send.
         4                      6
                            5
Kilim-Clojure integration




Message Passing Communication


       How does Erlang do it?


               User level processes executing recursive functions
               VM preemptive scheduling
               One heap/stack per process, no global heap
               Tail call optimisation
               More predictable GC behaviour
Kilim-Clojure integration




       Efficient implementation of message passing concurrency in the
       Java Virtual Machine?
Kilim-Clojure integration




Kilim


       “Kilim is a message-passing framework for Java that provides
       ultra-lightweight threads and facilities for fast, safe, zero-copy
       messaging between these threads”


               https://github.com/kilim/kilim
               2006 Sriram Srinivasan, Opera Group Cambridge University
               Current version 0.72
Kilim-Clojure integration




Kilim Tasks


                                                                                     Task

 1     p u b l i c c l a s s ExampleTask e x t e n d s Task {
 2                                                                                       execute
 3          p u b l i c void execute () throws Pausable {
 4                  doStuff ( ) ;
 5                  p u s a b l e S t u f f ( ) ; // t h r o w s P a u s a b l e    Worker
 6                  moreStuff ( ) ;                                                 Thread
 7          }
 8
 9    }                                                                                  notify

                                                                                   Scheduler
Kilim-Clojure integration




Kilim Weaving: Bytecode Transformation



               Additional step after compilation
               Transforms pausable methods
               Creates a custom class to store the task state
               Associates a Fiber object, tracks task’s stack
               Transformed code returns immediately if the task is paused
               Worker threads can resume the execution of paused stacks
               unwinding the associated fiber stack
Kilim-Clojure integration




Kilim Weaving: Bytecode Transformation
                 1    p u b l i c void execute ( Fiber f i b e r ) throws Pausable {
                 2            s w i t c h ( f i b e r . pc ) {
                 3               c a s e 0 : g o t o START ;
                 4               c a s e 1 : g o t o PAUSABLE CALL ;
                 5           }
                 6           START :
                 7               doStuff ( ) ;
                 8           PAUSABLE CALL :
                 9               f i b e r . down ( ) ;
                10               p u s a b l e S t u f f ( f i b e r ) ; // t h r o w s P a u s a b l e
                11               f i b e r . up ( ) ;
                12               switch ( f i b e r . status ) {
                13                        c a s e NOT PAUSING NO STATE :
                14                                g o t o RESUME ;
                15                        c a s e NOT PAUSING HAS STATE :
                16                                restoresState ( state );
                17                                g o t o RESUME ;
                18                        c a s e PAUSING NO STATE :
                19                                captureState ( state );
                20                                return ;
                21                        c a s e PAUSING HAS STATE :
                22                                return ;
                23               }
                24           RESUME :
                25               moreStuff ( ) ;
                26    }
Kilim-Clojure integration




Kilim Tasks: Execution

                                                                           Fiber.stack

                                           currentState                    StateObj.(1)
                            Pausable()
                                                                           StateObj.(2)
                                              currentState
                                  down()
                                                                           StateObj.(3)

                              Fiber         Pausable()

                                                                                  currentState
                                                       down()

                                               Fiber                 Pausable()



                                                                        up()


                                                             Pause             Normal Return
Kilim-Clojure integration




Kilim Messages




               Buffered mailboxes
               Allows asynchronous communication between tasks
               Blocking / not blocking interface
               Polling interface
Kilim-Clojure integration




Kilim-Clojure Integration (first attempt)




               Modified version of Clojure’s compiler
               Clojure’s functions executed as Kilim’s tasks
               Weaving performed at run-time


       https://github.com/antoniogarrote/clojure/tree/kilim
Kilim-Clojure integration




Kilim-Clojure Integration (second attempt)




               Clojure library
               [clj-kilim ”0.2.0-SNAPSHOT”]
               Doc: http://antoniogarrote.github.com/clojure kilim/
               Source: https://github.com/antoniogarrote/clojure kilim
Kilim-Clojure integration




Introduction

                Clojure
               Compiler


                      Compiles bytecode


              Java Class


                      Java instrumentation


                                               Kilim             Weaved Java
                clj-kilim
                                              Weaver                Class

                    Bytecode Transformation   Bytecode Transformation


                                                                     Class
                                                                    Loader
Kilim-Clojure integration




Kilim-Clojure Integration: API


  1    ( d e f − p a u s a b l e y i e l d i n g − f n [ mbox ]
  2          ( mbox−get−pausable mbox ) )
  3
  4
  5    ( def−pausable task−fn1 [ ]
  6       ...
  7       ( c a l l − p a u s a b l e y i e l d i n g − f n ambox )
  8       ...)
  9
 10    ( d e f task−fn2 ( p a u s a b l e        []    ...))
 11
 12
 13    ( t a s k − s t a r t task−fn1 )
 14    ( t a s k − s t a r t task−fn2 )
Kilim-Clojure integration




Kilim-Clojure Integration




       Demo
Kilim-Clojure integration




       Performance
Kilim-Clojure integration




Ring example again
  1    ( d e f n ˆ { : p a u s a b l e t r u e } make−relay [ ˆ k i l i m . M a i l b o x s e l f
  2                                                           ˆ k i l i m . Mailbox next
  3                                                           ˆ k i l i m . Mailbox f i n a l ]
  4        ( loop [ k ( r e c e i v e s e l f ) ]
  5            ( i f (> k 0 )
  6                ( do
  7                   ( ! next ( dec k ) )
  8                   ( recur ( . get s e l f )))
  9                ( do
 10                   ( ! next ( dec k ) )
 11                   ( when ( n o t ( n i l ? f i n a l ) )
 12                      (! f i n a l true ))))))
 13
 14
 15    ( d e f n make−loop [ n k ]
 16        ( l e t [ˆ k i l i m . Mailbox f i r s t − m a i l b o x ( k i l i m . Mailbox . )
 17                   ˆ k i l i m . Mailbox final−mailbox ( k i l i m . Mailbox . ) ]
 18            ( loop [ current           first−mailbox
 19                         n n]
 20               ( i f (> n 1 )
 21                   ( recur
 22                     ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x s e l f ]
 23                                               ( make−relay s e l f c u r r e n t n i l ) ) )
 24                     ( dec n ) )
 25                   ( do ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x      ]
 26                                                    ( make−relay f i r s t − m a i l b o x c u r r e n t f i n a l − m a i l b o x ) ) )
 27                             (! first−mailbox k)
 28                             ( . getb final−mailbox ) ) ) ) ) )
Kilim-Clojure integration




Performance




       N = 100K , K = 0
       1264ms, 12µs process creation

       N = 100K , K = 1M
       3276ms, 3µs local msg . send.
Kilim-Clojure integration




Conclusions


               Efficient message passing possible in the JVM thanks to Kilim
               Clojure can be a nice match for Kilim (immutable messages,
               run-time weaving)
               Benefits of asynchronous evented code with a nicer interface
               Limitations: non-preemptive
               Way to go?
                        Improve performance
                        Add distribution
Ad

Recommended

DOCX
Question bank of module iv packet switching networks
Engineering
 
PDF
Good news, everybody! Guile 2.2 performance notes (FOSDEM 2016)
Igalia
 
PDF
Optimizing with persistent data structures (LLVM Cauldron 2016)
Igalia
 
PDF
Libxc a library of exchange and correlation functionals
ABDERRAHMANE REGGAD
 
PDF
Knit, Chisel, Hack: Building Programs in Guile Scheme (Strange Loop 2016)
Igalia
 
DOCX
Resource element lte explanations!
Bobir Shomaksudov
 
PPT
Class3
issbp
 
PPTX
Lte – long term evolution
Nadisanka Rupasinghe
 
PDF
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Igalia
 
PDF
Ast2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada Programs
Gneuromante canalada.org
 
PDF
Range Extended Second Order Digital Phase Locked Loop
IDES Editor
 
PDF
The State of Lightweight Threads for the JVM
Volkan Yazıcı
 
PDF
Advanced Topics Sorting
Sri Prasanna
 
PDF
Fork Join (BeJUG 2012)
Sander Mak (@Sander_Mak)
 
PDF
Kamil witecki asynchronous, yet readable, code
Kamil Witecki
 
PPTX
MSc_thesis
Nokib Uddin
 
PDF
Lecture07(DHDNBK)-Behavior-Modelling.pdf
thanhfacebook123dn
 
PDF
Nondeterministic Finite Automata AFN.pdf
SergioUlisesRojasAla
 
PPTX
Introduction to Verilog & code coverage
Jyun-Kai Hu
 
PPTX
Lecture 23 loop transfer function
bennedy ningthoukhongjam
 
KEY
Fork/Join for Fun and Profit!
Sander Mak (@Sander_Mak)
 
PDF
Errors errors, everywhere! - JSession
Daniel Pokusa
 
PPTX
Mit cilk
Raymond Kung
 
PDF
DHow2 - L6 VHDL
Marco Santambrogio
 
PPT
2706264.ppt
MuhammadMubeen58
 
PPT
Paul_presentationMcGuirk_quantumcomputation.ppt
nezhadnoralahnavid
 
PDF
Nondeterministic testing of Sequential Quantum Logic Propositions on a Quant...
Matthew Leifer
 
PDF
NLP@ICLR2019
Kazuki Fujikawa
 
PDF
API Modeling Framework: a toolbox ofr API specs. Gluecon 2017
Antonio Garrote Hernández
 
PDF
Linked Data APIs (Funding Circle May 2015)
Antonio Garrote Hernández
 

More Related Content

Similar to Message Passing Concurrency in Clojure using Kilim (20)

PDF
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Igalia
 
PDF
Ast2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada Programs
Gneuromante canalada.org
 
PDF
Range Extended Second Order Digital Phase Locked Loop
IDES Editor
 
PDF
The State of Lightweight Threads for the JVM
Volkan Yazıcı
 
PDF
Advanced Topics Sorting
Sri Prasanna
 
PDF
Fork Join (BeJUG 2012)
Sander Mak (@Sander_Mak)
 
PDF
Kamil witecki asynchronous, yet readable, code
Kamil Witecki
 
PPTX
MSc_thesis
Nokib Uddin
 
PDF
Lecture07(DHDNBK)-Behavior-Modelling.pdf
thanhfacebook123dn
 
PDF
Nondeterministic Finite Automata AFN.pdf
SergioUlisesRojasAla
 
PPTX
Introduction to Verilog & code coverage
Jyun-Kai Hu
 
PPTX
Lecture 23 loop transfer function
bennedy ningthoukhongjam
 
KEY
Fork/Join for Fun and Profit!
Sander Mak (@Sander_Mak)
 
PDF
Errors errors, everywhere! - JSession
Daniel Pokusa
 
PPTX
Mit cilk
Raymond Kung
 
PDF
DHow2 - L6 VHDL
Marco Santambrogio
 
PPT
2706264.ppt
MuhammadMubeen58
 
PPT
Paul_presentationMcGuirk_quantumcomputation.ppt
nezhadnoralahnavid
 
PDF
Nondeterministic testing of Sequential Quantum Logic Propositions on a Quant...
Matthew Leifer
 
PDF
NLP@ICLR2019
Kazuki Fujikawa
 
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Igalia
 
Ast2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada Programs
Gneuromante canalada.org
 
Range Extended Second Order Digital Phase Locked Loop
IDES Editor
 
The State of Lightweight Threads for the JVM
Volkan Yazıcı
 
Advanced Topics Sorting
Sri Prasanna
 
Fork Join (BeJUG 2012)
Sander Mak (@Sander_Mak)
 
Kamil witecki asynchronous, yet readable, code
Kamil Witecki
 
MSc_thesis
Nokib Uddin
 
Lecture07(DHDNBK)-Behavior-Modelling.pdf
thanhfacebook123dn
 
Nondeterministic Finite Automata AFN.pdf
SergioUlisesRojasAla
 
Introduction to Verilog & code coverage
Jyun-Kai Hu
 
Lecture 23 loop transfer function
bennedy ningthoukhongjam
 
Fork/Join for Fun and Profit!
Sander Mak (@Sander_Mak)
 
Errors errors, everywhere! - JSession
Daniel Pokusa
 
Mit cilk
Raymond Kung
 
DHow2 - L6 VHDL
Marco Santambrogio
 
2706264.ppt
MuhammadMubeen58
 
Paul_presentationMcGuirk_quantumcomputation.ppt
nezhadnoralahnavid
 
Nondeterministic testing of Sequential Quantum Logic Propositions on a Quant...
Matthew Leifer
 
NLP@ICLR2019
Kazuki Fujikawa
 

More from Antonio Garrote Hernández (7)

PDF
API Modeling Framework: a toolbox ofr API specs. Gluecon 2017
Antonio Garrote Hernández
 
PDF
Linked Data APIs (Funding Circle May 2015)
Antonio Garrote Hernández
 
PDF
4th European Lisp Symposium: Jobim: an Actors Library for the Clojure Program...
Antonio Garrote Hernández
 
PDF
RESTful writable APIs for the web of Linked Data using relational storage sol...
Antonio Garrote Hernández
 
PDF
lisp (vs ruby) metaprogramming
Antonio Garrote Hernández
 
PDF
Developing Distributed Semantic Systems
Antonio Garrote Hernández
 
PDF
Egearmand: an Erlang Gearman daemon
Antonio Garrote Hernández
 
API Modeling Framework: a toolbox ofr API specs. Gluecon 2017
Antonio Garrote Hernández
 
Linked Data APIs (Funding Circle May 2015)
Antonio Garrote Hernández
 
4th European Lisp Symposium: Jobim: an Actors Library for the Clojure Program...
Antonio Garrote Hernández
 
RESTful writable APIs for the web of Linked Data using relational storage sol...
Antonio Garrote Hernández
 
lisp (vs ruby) metaprogramming
Antonio Garrote Hernández
 
Developing Distributed Semantic Systems
Antonio Garrote Hernández
 
Egearmand: an Erlang Gearman daemon
Antonio Garrote Hernández
 
Ad

Recently uploaded (20)

PPSX
Usergroup - OutSystems Architecture.ppsx
Kurt Vandevelde
 
PDF
Plugging AI into everything: Model Context Protocol Simplified.pdf
Abati Adewale
 
PPTX
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
PDF
Database Benchmarking for Performance Masterclass: Session 2 - Data Modeling ...
ScyllaDB
 
PDF
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
PDF
Java 25 and Beyond - A Roadmap of Innovations
Ana-Maria Mihalceanu
 
PPTX
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
PPTX
Paycifi - Programmable Trust_Breakfast_PPTXT
FinTech Belgium
 
DOCX
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
PDF
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
PDF
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Saikat Basu
 
PDF
Kubernetes - Architecture & Components.pdf
geethak285
 
PDF
Why aren't you using FME Flow's CPU Time?
Safe Software
 
PDF
FME as an Orchestration Tool with Principles From Data Gravity
Safe Software
 
PDF
Enhancing Environmental Monitoring with Real-Time Data Integration: Leveragin...
Safe Software
 
PDF
ArcGIS Utility Network Migration - The Hunter Water Story
Safe Software
 
PPTX
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
PPTX
Practical Applications of AI in Local Government
OnBoard
 
PDF
UiPath Agentic AI ile Akıllı Otomasyonun Yeni Çağı
UiPathCommunity
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
Usergroup - OutSystems Architecture.ppsx
Kurt Vandevelde
 
Plugging AI into everything: Model Context Protocol Simplified.pdf
Abati Adewale
 
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
Database Benchmarking for Performance Masterclass: Session 2 - Data Modeling ...
ScyllaDB
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
Java 25 and Beyond - A Roadmap of Innovations
Ana-Maria Mihalceanu
 
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Paycifi - Programmable Trust_Breakfast_PPTXT
FinTech Belgium
 
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Saikat Basu
 
Kubernetes - Architecture & Components.pdf
geethak285
 
Why aren't you using FME Flow's CPU Time?
Safe Software
 
FME as an Orchestration Tool with Principles From Data Gravity
Safe Software
 
Enhancing Environmental Monitoring with Real-Time Data Integration: Leveragin...
Safe Software
 
ArcGIS Utility Network Migration - The Hunter Water Story
Safe Software
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Practical Applications of AI in Local Government
OnBoard
 
UiPath Agentic AI ile Akıllı Otomasyonun Yeni Çağı
UiPathCommunity
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
Ad

Message Passing Concurrency in Clojure using Kilim

  • 1. Kilim-Clojure integration Message Passing Concurrency in Clojure using Kilim Antonio Garrote Forward November 7, 2011
  • 2. Kilim-Clojure integration Clojure’s Concurrency Model JVM thread basic autonomous work unit Java shared memory explicit communication primitives Immutable data structures + implicit coordination mechanisms (STM, Refs)
  • 3. Kilim-Clojure integration Message Passing Communication 1 % T e r m i t e Scheme b e n c h m a r k s r i n g . e r l 2 m a k e r e l a y ( Next ) − > 3 receive 4 K when K > 0 − > 5 Next ! K − 1 , 6 m a k e r e l a y ( Next ) ; 7 K− > 8 Next ! K 9 end . 10 11 l o o p (K , C u r r e n t , N) when N > 1 − > 12 l o o p (K , spawn ( r i n g , m a k e r e l a y , [ C u r r e n t ] ) ,N − 1 ) ; 13 14 l o o p (K , C u r r e n t , ) −> 15 s e l f ( ) ! K, 16 make relay ( Current ) . 17 18 % N = number p r o c e s s e s 19 % K = number o f m e s s a g e e x c h a n g e s 20 r i n g (N, K) − > 21 l o o p (K , s e l f ( ) , N ) .
  • 4. Kilim-Clojure integration Message Passing Communication 1 2 N N = 100K , K = 0 518ms, 5µs process creation 3 K N = 100K , K = 1M 759ms, 0.76µs local msg . send. 4 6 5
  • 5. Kilim-Clojure integration Message Passing Communication How does Erlang do it? User level processes executing recursive functions VM preemptive scheduling One heap/stack per process, no global heap Tail call optimisation More predictable GC behaviour
  • 6. Kilim-Clojure integration Efficient implementation of message passing concurrency in the Java Virtual Machine?
  • 7. Kilim-Clojure integration Kilim “Kilim is a message-passing framework for Java that provides ultra-lightweight threads and facilities for fast, safe, zero-copy messaging between these threads” https://github.com/kilim/kilim 2006 Sriram Srinivasan, Opera Group Cambridge University Current version 0.72
  • 8. Kilim-Clojure integration Kilim Tasks Task 1 p u b l i c c l a s s ExampleTask e x t e n d s Task { 2 execute 3 p u b l i c void execute () throws Pausable { 4 doStuff ( ) ; 5 p u s a b l e S t u f f ( ) ; // t h r o w s P a u s a b l e Worker 6 moreStuff ( ) ; Thread 7 } 8 9 } notify Scheduler
  • 9. Kilim-Clojure integration Kilim Weaving: Bytecode Transformation Additional step after compilation Transforms pausable methods Creates a custom class to store the task state Associates a Fiber object, tracks task’s stack Transformed code returns immediately if the task is paused Worker threads can resume the execution of paused stacks unwinding the associated fiber stack
  • 10. Kilim-Clojure integration Kilim Weaving: Bytecode Transformation 1 p u b l i c void execute ( Fiber f i b e r ) throws Pausable { 2 s w i t c h ( f i b e r . pc ) { 3 c a s e 0 : g o t o START ; 4 c a s e 1 : g o t o PAUSABLE CALL ; 5 } 6 START : 7 doStuff ( ) ; 8 PAUSABLE CALL : 9 f i b e r . down ( ) ; 10 p u s a b l e S t u f f ( f i b e r ) ; // t h r o w s P a u s a b l e 11 f i b e r . up ( ) ; 12 switch ( f i b e r . status ) { 13 c a s e NOT PAUSING NO STATE : 14 g o t o RESUME ; 15 c a s e NOT PAUSING HAS STATE : 16 restoresState ( state ); 17 g o t o RESUME ; 18 c a s e PAUSING NO STATE : 19 captureState ( state ); 20 return ; 21 c a s e PAUSING HAS STATE : 22 return ; 23 } 24 RESUME : 25 moreStuff ( ) ; 26 }
  • 11. Kilim-Clojure integration Kilim Tasks: Execution Fiber.stack currentState StateObj.(1) Pausable() StateObj.(2) currentState down() StateObj.(3) Fiber Pausable() currentState down() Fiber Pausable() up() Pause Normal Return
  • 12. Kilim-Clojure integration Kilim Messages Buffered mailboxes Allows asynchronous communication between tasks Blocking / not blocking interface Polling interface
  • 13. Kilim-Clojure integration Kilim-Clojure Integration (first attempt) Modified version of Clojure’s compiler Clojure’s functions executed as Kilim’s tasks Weaving performed at run-time https://github.com/antoniogarrote/clojure/tree/kilim
  • 14. Kilim-Clojure integration Kilim-Clojure Integration (second attempt) Clojure library [clj-kilim ”0.2.0-SNAPSHOT”] Doc: http://antoniogarrote.github.com/clojure kilim/ Source: https://github.com/antoniogarrote/clojure kilim
  • 15. Kilim-Clojure integration Introduction Clojure Compiler Compiles bytecode Java Class Java instrumentation Kilim Weaved Java clj-kilim Weaver Class Bytecode Transformation Bytecode Transformation Class Loader
  • 16. Kilim-Clojure integration Kilim-Clojure Integration: API 1 ( d e f − p a u s a b l e y i e l d i n g − f n [ mbox ] 2 ( mbox−get−pausable mbox ) ) 3 4 5 ( def−pausable task−fn1 [ ] 6 ... 7 ( c a l l − p a u s a b l e y i e l d i n g − f n ambox ) 8 ...) 9 10 ( d e f task−fn2 ( p a u s a b l e [] ...)) 11 12 13 ( t a s k − s t a r t task−fn1 ) 14 ( t a s k − s t a r t task−fn2 )
  • 19. Kilim-Clojure integration Ring example again 1 ( d e f n ˆ { : p a u s a b l e t r u e } make−relay [ ˆ k i l i m . M a i l b o x s e l f 2 ˆ k i l i m . Mailbox next 3 ˆ k i l i m . Mailbox f i n a l ] 4 ( loop [ k ( r e c e i v e s e l f ) ] 5 ( i f (> k 0 ) 6 ( do 7 ( ! next ( dec k ) ) 8 ( recur ( . get s e l f ))) 9 ( do 10 ( ! next ( dec k ) ) 11 ( when ( n o t ( n i l ? f i n a l ) ) 12 (! f i n a l true )))))) 13 14 15 ( d e f n make−loop [ n k ] 16 ( l e t [ˆ k i l i m . Mailbox f i r s t − m a i l b o x ( k i l i m . Mailbox . ) 17 ˆ k i l i m . Mailbox final−mailbox ( k i l i m . Mailbox . ) ] 18 ( loop [ current first−mailbox 19 n n] 20 ( i f (> n 1 ) 21 ( recur 22 ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x s e l f ] 23 ( make−relay s e l f c u r r e n t n i l ) ) ) 24 ( dec n ) ) 25 ( do ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x ] 26 ( make−relay f i r s t − m a i l b o x c u r r e n t f i n a l − m a i l b o x ) ) ) 27 (! first−mailbox k) 28 ( . getb final−mailbox ) ) ) ) ) )
  • 20. Kilim-Clojure integration Performance N = 100K , K = 0 1264ms, 12µs process creation N = 100K , K = 1M 3276ms, 3µs local msg . send.
  • 21. Kilim-Clojure integration Conclusions Efficient message passing possible in the JVM thanks to Kilim Clojure can be a nice match for Kilim (immutable messages, run-time weaving) Benefits of asynchronous evented code with a nicer interface Limitations: non-preemptive Way to go? Improve performance Add distribution