@@ -83,7 +83,11 @@ def disposed(self) -> bool:
8383 def dispose (self ) -> None :
8484 if self .handle != INVALID_HANDLE and not self ._disposed :
8585 self ._disposed = True
86- assert FfiClient .instance ._ffi_lib .livekit_ffi_drop_handle (ctypes .c_uint64 (self .handle ))
86+ ffi = FfiClient ._instance
87+ if ffi is None or ffi ._pid != os .getpid ():
88+ return
89+ dropped = ffi ._ffi_lib .livekit_ffi_drop_handle (ctypes .c_uint64 (self .handle ))
90+ assert dropped
8791
8892 def __repr__ (self ) -> str :
8993 return f"FfiHandle({ self .handle } )"
@@ -218,6 +222,7 @@ def instance(cls) -> "FfiClient":
218222 return cls ._instance
219223
220224 def __init__ (self ) -> None :
225+ self ._pid = os .getpid ()
221226 self ._lock = threading .RLock ()
222227 self ._queue = FfiQueue [proto_ffi .FfiEvent ]()
223228
@@ -253,16 +258,25 @@ def __init__(self) -> None:
253258 )
254259
255260 ffi_lib = self ._ffi_lib
261+ init_pid = self ._pid
256262
257263 @atexit .register
258264 def _dispose_lk_ffi () -> None :
265+ if os .getpid () != init_pid :
266+ return
259267 ffi_lib .livekit_ffi_dispose ()
260268
261269 @property
262270 def queue (self ) -> FfiQueue [proto_ffi .FfiEvent ]:
263271 return self ._queue
264272
265273 def request (self , req : proto_ffi .FfiRequest ) -> proto_ffi .FfiResponse :
274+ if self ._pid != os .getpid ():
275+ raise RuntimeError (
276+ "livekit.rtc was used in a parent process before fork(); the native "
277+ "runtime cannot be used across fork(). Do not create or connect a Room "
278+ "(or use any livekit.rtc object) before forking child processes."
279+ )
266280 proto_data = req .SerializeToString ()
267281 proto_len = len (proto_data )
268282 data = (ctypes .c_ubyte * proto_len )(* proto_data )
0 commit comments