Bool read;
int error;
VmTimeType now, done;
+ Bool removed = FALSE;
ASSERT(s->asockType != ASYNCSOCKET_TYPE_NAMEDPIPE);
+ AsyncSocketLock(s);
+
if (s->state == AsyncSocketConnected) {
- return ASOCKERR_SUCCESS;
+ error = ASOCKERR_SUCCESS;
+ goto outHaveLock;
}
if (s->state != AsyncSocketListening &&
s->state != AsyncSocketConnecting) {
- return ASOCKERR_GENERIC;
+ error = ASOCKERR_GENERIC;
+ goto outHaveLock;
}
+ /*
+ * A nuisance. ConnectCallback() is either registered as a device or
+ * rtime callback depending on the prior return value of connect().
+ * So we try to remove it from both.
+ *
+ * XXX: For listening sockets, the callback is AsyncSocketAcceptCallback,
+ * which would need to be unregistered here and then be re-registered
+ * before returning.
+ */
+ if (s->state == AsyncSocketConnecting) {
+ removed = AsyncSocketPollRemove(s, TRUE, POLL_FLAG_WRITE,
+ AsyncSocketConnectCallback)
+ || AsyncSocketPollRemove(s, FALSE, 0, AsyncSocketConnectCallback);
+ ASSERT(removed);
+ }
+
+ AsyncSocketUnlock(s);
+
read = s->state == AsyncSocketListening;
now = Hostinfo_SystemTimerUS() / 1000;
goto outHaveLock;
}
} else {
- /*
- * A nuisance. ConnectCallback() is either registered as a device or
- * rtime callback depending on the prior return value of connect().
- * So we try to remove it from both.
- */
-
- Bool removed = FALSE;
- removed = AsyncSocketPollRemove(s, TRUE, POLL_FLAG_WRITE,
- AsyncSocketConnectCallback)
- || AsyncSocketPollRemove(s, FALSE, 0, AsyncSocketConnectCallback);
- ASSERT(removed);
-
error = AsyncSocketConnectInternal(s);
goto outHaveLock;
}
DnD_AddBlockLegacy(int blockFd, // IN
const char *blockPath) // IN
{
+ LOG(1, ("%s: placing block on %s\n", __func__, blockPath));
+
ASSERT(blockFd >= 0);
if (VMBLOCK_CONTROL(blockFd, VMBLOCK_ADD_FILEBLOCK, blockPath) != 0) {
DnD_RemoveBlockLegacy(int blockFd, // IN
const char *blockedPath) // IN
{
+ LOG(1, ("%s: removing block on %s\n", __func__, blockedPath));
+
if (blockFd >= 0) {
if (VMBLOCK_CONTROL(blockFd, VMBLOCK_DEL_FILEBLOCK, blockedPath) != 0) {
Log("%s: Cannot delete block on %s (%s)\n",
DnD_AddBlockFuse(int blockFd, // IN
const char *blockPath) // IN
{
+ LOG(1, ("%s: placing block on %s\n", __func__, blockPath));
+
ASSERT(blockFd >= 0);
if (VMBLOCK_CONTROL_FUSE(blockFd, VMBLOCK_FUSE_ADD_FILEBLOCK,
DnD_RemoveBlockFuse(int blockFd, // IN
const char *blockedPath) // IN
{
+ LOG(1, ("%s: removing block on %s\n", __func__, blockedPath));
+
if (blockFd >= 0) {
if (VMBLOCK_CONTROL_FUSE(blockFd, VMBLOCK_FUSE_DEL_FILEBLOCK,
blockedPath) != 0) {