2011-08-03 1 views
0

https://developer.mozilla.org/En/Gecko_Plugin_API_Reference:Scripting_plugins에서 :NPAPI 스레딩 모델 : 전역 변수에 액세스하여 잠금으로 보호해야합니까?

이 API는 스레드에 안전하도록 설계되지 않았습니다. 이 API의 스레딩 모델은이 API를 통한 모든 호출이 동기식이며 플러그인에서이 API의 메소드에 대한 호출이 플러그인이 시작된 스레드에서 발생해야하며 마찬가지로 브라우저에서이 API의 메소드에 대한 모든 호출 같은 thread로부터 온다고 보증되고 있습니다. 이 API에 대한 향후 개정은 다른 스레드에서이 API를 사용하는 것을 돕기 위해 한 스레드에서 다른 스레드로 호출을 프록 싱하는 메커니즘을 제공 할 수 있습니다.

내 플러그인의 전역 변수 (다른 페이지에서도 모든 인스턴스간에 공유 됨)에 액세스하려면 플러그인을 잠글 필요가 있습니까? 아니면 브라우저가 모든 플러그인과 통신하기 위해 하나의 스레드 만 사용합니까? 인스턴스?

답변

1

브라우저는 항상 모든 인스턴스에 대해 플러그인과 통신하기 위해 정확히 하나의 스레드를 사용합니다. 그 대가로 동일한 작업을 수행하고 메인 스레드가 아닌 다른 NPN_ 함수를 호출해서는 안됩니다.

메인 스레드 을 전혀 차단하지 않으면에서 스레드를 직접 생성하고 잠금이 필요할 수 있습니다. 그러나, 단지 브라우저를 위해서? 아니, 너는 필요 없어.

+0

확인. 블로킹에 관해서, I/O를 위해 NPN_Get/PostURL을 사용하면 브라우저는 NPP_NewStream/WriteReady/Write/DestroyStream을 같은 스레드에서 호출 할 것인가? NPP_Write는 브라우저에 데이터가있을 때만 호출되기 때문에 I/O가 주 스레드를 차단하면 안됩니다. 맞습니까? – lmz

+0

브라우저는 항상 하나의 스레드 만 사용하여 모든 인스턴스에 대해 플러그인과 통신합니다. 그 대가로 동일한 작업을 수행하고 메인 스레드가 아닌 다른 NPN_ 함수를 호출해서는 안됩니다. – taxilian

+0

그리고 예, 브라우저가 데이터를 가지고있을 때만 NPP_Write가 호출되기 때문에 I/O는 주 스레드를 차단하지 않습니다. 즉, 처리 할 때 주 스레드를 차단하지 않는 한. FireBreath (http://www.firebreath.org)의 소스 코드를 확인하는 방법에 대한 더 많은 예제가 필요하다면, – taxilian