2011-11-16 5 views
1

내가이 API를 가지고 하나의 라이브러리 지금 전화를 이 기능이 어떤 파일에서 호출되는지 어떻게 확인할 수 있습니까?

api2() 

api1() 

을 할 수 있습니다 내부적으로 API2도 API1를 호출해야 참조하십시오.

그래서 내가하고 싶은 한 상황에서 다른 응용 프로그램이 API1를 호출 할 때 API2는() API1를 호출 할 때

  • 하지만() 다음 do'nt

    • ()가 다음 몇 가지 특별한 일을 할 것입니다 그 특별한 일을해라.

    어떻게하면됩니까?

    api1()이 응용 프로그램이 아닌 라이브러리 자체에서 호출한다는 것을 알 수있는 방법이 있습니까?

    편집 : 지금

    api1() 
    { 
    sem_wait(); // this create deadlock 
    
    // do some task 
    
    sem_post(); 
    } 
    

    API2()처럼

    api2() 
    { 
    sem_wait(); 
    
    api1(); 
    
    sem_post(); 
    
    } 
    

    볼이 내 두 기능 ... 어플은 sem_wait에서 작업 할 필요가 API1()를 호출 할 때와 sem_post하지만 api2() api1() 호출하면 죽은 자물쇠 만들기 때문에 다시 sem_wait 싶지 않아요 ...

    내가 필요 som e 메커니즘 그래서 api1()은 api2()에서 호출되고 있는지 확인한 다음 sem_wait 및 sem_post를 사용하지 않습니다.

  • +3

    을 강조 선도 할 다른 두 가지, 그것을 호출하는 사람에 따라? – CodeCaster

    +2

    수정 사항으로 인해 질문의 내용이 다소 바뀌 었습니다. 원래의 질문에 대한 IMO의 합리적인 나의 이전 답변은 이러한 편집에 비추어 위험한 것이므로 삭제했습니다. – ibid

    답변

    2

    종종이 같은 짓을 :

    // internal function 
    static int api1_internal(void) { 
        do stuff assuming the lock is held; 
    } 
    
    // function for external callers, doing extra locking 
    int api1(void) { 
        int ret; 
        lock(); 
        ret = api1_internal(); 
        unlock(); 
        return ret; 
    } 
    
    // some internal function using internal api1 
    void internalfunc(void) { 
        lock(); 
        do some things(); 
        api1_internal(); 
        unlock(); 
    } 
    

    참고 api1_internal이 그것을 사용하여 해당 파일을 외부 아무것도 중지 정적 선언된다.

    당신이 정말로 당신이 API1의 정의를 넣을 수있는 자신을 혼란스럽게하려는 경우

    ()는 첫째, 다음 꽤 코드를 유지하는 것

    #define api1 api1_internal 
    

    같은 것을 가지고 있지만, 단지 나중에 혼동. 그러지 마.

    그것은 사용하는 것이 일반적입니다 왜이 기능을 할 것입니다 때문에, 함수의 내부, 비 잠금 버전

    static int _api1(void) 
    
    4

    인트로 스펙 션으로 달성하기 쉽지 않습니다. 호출 스택을 조사 할 수는 있지만 이식성이 매우 낮기 때문에 권장되지 않습니다.

    이 문제를 처리하는 한 가지 방법은 매개 변수를 전달하여 동작 변형을 제어하는 ​​것입니다. 이것은 함수의 비헤이비어를보다 투명하고 명시 적으로 만드는 이점이 있습니다. @blueshift가 지적했듯이, 이것은 외부 발신자에게 부담을 줄 수 있습니다. 기능을 내부 용과 외부 용의 두 가지 버전으로 나누면 부담이 줄어 듭니다.


    편집 내용에 비추어 볼 때 약간의 디자인이 생각납니다. 동기화 책임은 함수의 내부 또는 외부에 있어야합니다. 책임을 때로는 내부적이고 때로는 외부로 만드는 것은 매우 위험합니다. 그것은 문제의 한 방향 일 것입니다. 또 다른 방법은 재귀 잠금을 사용하는 것입니다.

    +0

    내 편집을 참조하십시오. –

    +0

    외부 호출자가 항상 "외부"인 추가 매개 변수를 전달해야하는 경우 좋지 않습니다. 그리고 그들이 다르게 그것을 설정하면 휴식. – blueshift

    +1

    @blueshift 네, 당신의 접근 방식이 잘 작동 할 것입니다. 나는이 문제를 해결하는 두 가지 다른 기능을 가지고 있다고 생각하지 않았다. –

    3

    두 가지 다른 작업 (+ 특수 작업 및 특수 작업)에 대해 두 가지 다른 함수 호출 (함수 이름 또는 매개 변수)이 필요합니다. 상황에 민감한 함수는 C에 의해서만 지원 될뿐만 아니라 Chomsky의 복잡성을 추가하기 때문에 절대적으로나 완전히 악의적 인 것입니다.

    0

    api2()이 호출자임을 api1()에게 알려주도록 라이브러리를 빌드 할 수 있습니다. 외부에서 전화를 걸면 api1()에 알 수없는 발신자가 표시됩니다.

    관련 문제