如何检查从哪个文件调用此函数?

时间:2011-11-16 10:22:44

标签: c

看到我有一个库有两个api允许调用

api1() 

 api2()

现在内部api2也调用了api1。

所以在我想做的一种情况是

  • 当其他一些应用程序调用api1()然后做一些特殊工作时
  • 但是当api2()调用api1()时,就不要做那个特殊的工作。

我该怎么做?

有没有办法让我知道api1()是从库本身而不是应用程序调用的?

修改:

api1()
{
sem_wait();  // this create deadlock 

// do some task 

sem_post();
}

现在api2()就像这样

  api2()
{
sem_wait();

api1();

sem_post();

}

看到我的两个函数...当应用程序调用api1()时我需要在sem_wait和sem_post中工作但是当api2()调用api1()时我不想再次sem_wait因为它的make dead lock ... / p>

我需要一些机制,所以api1()检查是否从api2()调用它然后不要使用sem_wait和sem_post

4 个答案:

答案 0 :(得分:4)

内省不容易实现。您可以调查调用堆栈,但这非常不便携,实际上不建议使用。

解决此问题的一种方法是传递参数来控制行为的变化。这样做的另一个好处是使函数的行为更加透明和明确。正如@blueshift指出的那样,这会给外部呼叫者带来负担。将该功能拆分为两个版本,一个用于内部使用,一个用于外部使用,可以减轻这种负担。


根据您的编辑,我认为设计有点偏差。同步责任应该是函数内部的,或者是外部的。让责任有时是内部的,有时是外部的,这是非常危险的。这将是问题的一种方式。另一种方法是使用递归锁。

答案 1 :(得分:3)

对于两个不同的作业,您需要两个不同的函数调用(函数名称或参数)(+特殊工作和特殊工作)。上下文敏感的函数不仅不受C支持,而且完全是邪恶的,因为它们会增加整个Chomsky的复杂性。

答案 2 :(得分: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被声明为static以使用它停止该文件之外的任何内容。

如果你真的想让自己迷惑,你可以先把api1()的定义,然后有类似的东西

#define api1 api1_internal

哪会保持你的代码漂亮,但稍后会让你感到困惑。不要那样做。

对于内部非锁定版本的函数使用前导下划线很常见,所以

static int _api1(void)

答案 3 :(得分:0)

您可以构建您的库,以便api2()告诉api1()它是调用方。从外部调用时,api1()会看到一个未知来电者。